python学习第九节:爬虫实战-抓取地址库

python学习第九节:爬虫实战-抓取地址库

在这里插入图片描述
话不多说,直接上代码;下面的代码是从统计局抓取地址库并保存为json格式和excel格式。大家拿到代码直接运行即可。

#coding=utf-8
#加入上面这行代码表示可以在下面代码中包含中文
import bs4  #网页解析,获取数据
import time #引入time模块
import re  #正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt # 进行excel操作
import sqlite3 # 进行SQLite数据库操作import
#urllib.parse模块是一个用于解析URL的工具包,支持各种对URL的操作,包括拆分、拼接、编码、解码等。
import urllib.parse
# 解析网页
from bs4 import BeautifulSoup
#定义全局变量
durl="https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/"
file_path="E://地址库"+str(time.time())+".json"
excel_path="E://地址库"+str(time.time())+".xls"# 爬取网页
def getHtml():# 定义全局变量response = Nonehtml = ""try:# 请求网页response = urllib.request.urlopen(durl+"index.html")# 获取网页响应内容html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):  # 打印错误状态码print(e.code)if hasattr(e, "reason"):  # 打印错误问题原因print(e.reason)# 如果返回状态不是200,说明访问失败if response.status != 200:print("---访问失败!")# 打印读取到的网页内容print(html)return html# 解析网页
def paseHtml(html):print("*" * 20, "开始解析网页", "*" * 20)bs = BeautifulSoup(html, "html.parser")# 获取页面中所有tb下的a标签 得到所有省级的a标签provinces = bs.select("td > a")data = []# 循环省级标签for provinceTag in provinces:name = provinceTag.texturl = provinceTag.attrs["href"]code = re.sub(".html", "", url) + "0000000000"print("省级名称:", name, "   url=", url, "   code=", code)child = getChild(durl,url)d = {"code": code,"name": name,"child": child}data.append(d)return data#获取子级地址
def getChild(purl,url):child = []html = ""qurl=purl + "" + urlprint("开始获取", qurl, "的信息")try:# 请求网页response = urllib.request.urlopen(qurl)# 获取网页响应内容html = response.read().decode("utf-8")except urllib.error.URLError as e:return child# 如果返回状态不是200,说明访问失败if response.status != 200:print("---访问"+url+"失败!")return childbs = BeautifulSoup(html, "html.parser")# 获取页面中所有class=citytr的childtrs = bs.select(".citytr,.countytr,.towntr,.villagetr")#print("=====",childtrs)# 循环标签for childtr in childtrs:#print("childtr=", childtr)url=""code=""name=""#兼容 没得a标签情况 childtr= <tr class="countytr"><td>130101000000</td><td>市辖区</td></tr>if len(childtr.find_all("td")[0].find_all("a"))==0:if len(childtr.select(".villagetr"))==0: # 说明这不是最后一层code = childtr.find_all("td")[0].textname = childtr.find_all("td")[1].textelse:code = childtr.find_all("td")[0].textname = childtr.find_all("td")[2].textelse:if "href" in childtr.find_all("td")[0].a.attrs:url = childtr.find_all("td")[0].a.attrs["href"]code = childtr.find_all("td")[0].a.textname = childtr.find_all("td")[1].a.text#print("name=", name, "  code=", code, "   url=", url)child2=[]if url!="":qurl = qurl[0:qurl.rindex("/")+1]child2 = getChild(qurl,url)d = {"code": code,"name": name,"child": child2}child.append(d)return child# 将将数据写入文件
def save_file(data):print("*"*20,"开始写入文件","*"*20)# 打开文件fo = open(file_path,"w",encoding="utf-8") # w表示打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件# 写入内容fo.write(str(data))# 关闭文件fo.close()print("*" * 20, "写入文件完成", "*" * 20)# 将将数据写入excel
def save_excel(data):print("*" * 20, "开始写入excel", "*" * 20)book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象 新建一个工作簿对象sheet = book.add_sheet("2024地址库", cell_overwrite_ok=True)  # 创建工作表 cell_overwrite_ok=True 重新写入会自动覆盖之前的内容不会报错# 创建表格表头col = ("地区代码", "地区名称", "等级", "父级代码")for i in range(len(col)):sheet.write(0, i, col[i])# 插入数据i=0# 解析省级for p in data:pcode=p["code"]pname=p["name"]plevel=1pf_code="0"pchild=p["child"]sheet.write(i + 1, 0, pcode)sheet.write(i + 1, 1, pname)sheet.write(i + 1, 2, plevel)sheet.write(i + 1, 3, pf_code)i+=1if len(pchild)==0:continue#解析市级for c in pchild:ccode = c["code"]cname = c["name"]clevel = 2cf_code = pcodecchild = c["child"]sheet.write(i + 1, 0, ccode)sheet.write(i + 1, 1, cname)sheet.write(i + 1, 2, clevel)sheet.write(i + 1, 3, cf_code)i += 1if len(cchild) == 0:continue# 解析区级for d in cchild:dcode = d["code"]dname = d["name"]dlevel = 3df_code = ccodedchild = d["child"]sheet.write(i + 1, 0, dcode)sheet.write(i + 1, 1, dname)sheet.write(i + 1, 2, dlevel)sheet.write(i + 1, 3, df_code)i += 1if len(cchild) == 0:continue# 解析镇级for a in dchild:acode = a["code"]aname = a["name"]alevel = 4af_code = dcodesheet.write(i + 1, 0, acode)sheet.write(i + 1, 1, aname)sheet.write(i + 1, 2, alevel)sheet.write(i + 1, 3, af_code)i += 1book.save(excel_path)print("*" * 20, "写入excel完成", "*" * 20)def run():html = getHtml()# 爬取网页data=paseHtml(html) # 解析网页save_file(data) #将数据存入文件save_excel(data) # 将数据写入excelif __name__ == '__main__':run()print("爬虫结束")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423762.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《python语言程序设计》2018版第8章第14题金融:信用卡号合法性 利用6.29题

一、之前6.29题我做的代码 这是用数字来进行分辨的 is_txt 4383576018402626 #合法def split_the_data_even(vis_n):current_a1 vis_n // 10000a_t1 vis_n % 10000# print("1th", a_t1)a_t2 current_a1 % 10000# print("2th", a_t2)current_a3 curre…

supermap icilent3d for cesium加载地形并夸大地形

先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…

20240915 每日AI必读资讯

国家网信办发布《人工智能生成合成内容标识办法&#xff08;征求意见稿&#xff09;》 - 要求所有的AI生成内容都要打标&#xff0c;包括文字、图像、视频、音频… - 文本内容要插入标识符提醒&#xff0c;音频内容要在里面插入提示音 - 对创作者不太友好&#xff0c;对平台…

react crash course 2024 (1)理论概念

state的作用 react hooks 而无需写一个class jsx 样式用 spa

并发锁机制之深入理解synchronized

1. i/i--引起的线程安全问题分析 思考&#xff1a; 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; public class SyncDemo {private static int counter 0;public static void increment()…

最优化理论概述

目录 1. 最优化理论的原理 2. 最优化问题的分类 1. 按目标函数的性质分类 2. 按变量的性质分类 3. 按约束条件分类 4. 按时间维度分类 5. 按不确定性分类 6. 按决策变量的维度分类 3. 常用的最优化方法 1. 梯度类优化算法 2. 约束优化算法 3. 启发式算法 4. 线性规…

C++笔记之map的实用操作

C++笔记之map的实用操作 文章目录 C++笔记之map的实用操作1.初始化1.1.使用列表初始化1.2.使用 `insert` 方法1.3.使用 `emplace` 方法1.4.复制构造1.5.移动构造2.赋值2.1.列表赋值2.2.插入元素2.3.批量插入3.取值3.1.使用 `[]` 操作符3.2.使用 `at()` 方法3.3.检查键是否存在3…

Linux 35.5 + JetPack v5.1.3@CUDA安装和版本切换

Linux 35.5 JetPack v5.1.3CUDA安装和版本切换 1. 源由2. 现象3. 分析3.1 看本质3.2 善动脑3.3 笔记回忆3.4 底层思考3.5 多版本 4. 版本切换5. 总结 1. 源由 最近遇到一些CUDA编程&#xff0c;以及编译链接过程出现一些版本不匹配的问题。 首先&#xff0c;申明下&#xff…

我知道,不少人会有质疑,为什么当地的医生,会想不到是这种病?

[toc] #一、冷风机如果 ##1.和人合计 ##2.愉快教育 ##3.亏教育课 #二、让红薯粉丝 #三、发个通过 #四、福娃热风 一、冷风机如果 据长三角铁路消息&#xff0c;受第13号台风“贝碧嘉”影响&#xff0c;为确保铁路运输安全和旅客出行安全&#xff0c;铁路部门计划对9月1…

【新时代概论】新时代概论书目的结构(LP)

文章目录 前言一、结构导论第一章、新时代坚持和发展中国特色社会主义第二章、以中国式现代化全面推进中华民族伟大复兴第三章、坚持党的全面领导第四章、坚持以人民为中心第五章、全面深化改革开放第六章、推动高质量发展第七章、社会主义现代化建设的教育、科技、人才战略第八…

官宣:Zilliz 在亚马逊云科技中国区正式开服!

01 Zilliz Cloud 正式上线亚马逊云科技宁夏区服务 9 月 4 日&#xff0c;Zilliz 正式官宣&#xff0c; Zilliz Cloud 正式上线亚马逊云科技在宁夏区的云服务。至此&#xff0c;Zilliz Cloud 已实现全球 5 大云 19 个节点 的全覆盖&#xff0c;成为全球首个提供海内外多云服务的…

【devops】devops-git之介绍以及日常使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

位段、枚举、联合

位段 在一个结构体中以位&#xff08;最小单位&#xff09;为单位来指定其成员所占的内存长度。位段成员名后面有一个冒号&#xff0c;冒号后有一个数字&#xff08;这个数字是小于等于这个成员所占的位&#xff09;。 typedef struct S {char a : 2;//8char b : 8;//8char c …

java重点学习-线程池的使用和项目案例

十一 线程池的使用场景 你们项目哪里用到了多线程 批量导入:使用了线程池CountDownLatch批量把数据库中的数据导入到了ES(任意)中&#xff0c;避免OOM数据汇总:调用多个接口来汇总数据&#xff0c;如果所有接口(或部分接口)的没有依赖关系&#xff0c;就可以使用线程池future来…

Fiddler下载安装及汉化

直接上干货 1.下载地址&#xff1a; 通过百度网盘分享的文件&#xff1a;fiddler汉化&#xff0c;FiddlerSetup抓包.exe等2个文件 链接&#xff1a;https://pan.baidu.com/s/12JBZO8z0mDHlHM1DCL365g 提取码&#xff1a;1111 2.fiddler安装&#xff1a; 注意安装位置 3.汉化&…

个性化、持续性阅读 学生英语词汇量自然超越标准

2024年秋季新学年&#xff0c;根据2022版《义务教育英语课程标准》全新修订的英语新版教材开始投入使用&#xff0c;标志着我国英语教育迈入了一个以应用为导向、注重综合素养培养的新阶段。 新版教材的变革不仅仅是一次词汇量的简单增加&#xff0c;更是一场从应试到应用的深…

[数据集][目标检测]河道垃圾检测数据集VOC+YOLO格式2274张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2274 标注数量(xml文件个数)&#xff1a;2274 标注数量(txt文件个数)&#xff1a;2274 标注…

使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误

目录 效果图 解决方案 修正要点 效果图 修改前App.vue代码&#xff1a; <template><div id"app"><canvas id"myChart"></canvas></div> </template><script> import axios from axios; import { Chart, regis…

QT多线程编程(基础概念以及示例)

QT多线程编程 前言&#xff1a;基础夯实&#xff1a;一:多线程概述二:QT多线程的使用1. 继承QThread类2. 继承QObject类3. QtConcurrent模块 三:线程同步与通信四:线程安全五:线程管理六:总结 效果展示&#xff1a;实现功能&#xff1a;核心代码&#xff1a;mainwindow.hmythre…

k8s 部署 ruoyi 前后端分离项目

本文视频版: https://www.bilibili.com/video/BV17ugkePEeN 参考 https://blog.csdn.net/qq_50247813/article/details/136934090 https://gitee.com/nasaa/RuoYi-Vue-cloud https://www.itsgeekhead.com/tuts/kubernetes-129-ubuntu-22-04-3/ https://kubernetes.io/docs…