Python爬虫爬取国家统计局网站【统计用区划和城乡划分代码】并存入MySQL数据库
国家统计局网站相关分级页面截图



基本思路
爬取每个页面的a标签内容,生成省市两级数据字典,最后合成区县对应的链接,爬取第三层区划代码和名字,结合省市两级名字生成最后的标准。
代码
1 import pymysql
2 from bs4 import BeautifulSoup
3 import re
4 import requests
5 import lxml
6 import traceback
7 import time
8 import json
9 from lxml import etree
10
11 def get_area(year):
12 year=str(year)
13 url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+ year +"/index.html"
14 print(url)
15 headers={
16 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
17 }
18 response=requests.get(url,headers)
19 # print(response.text)
20 response.encoding='GBK'
21 page_text = response.text
22 soup=BeautifulSoup(page_text,'lxml')
23 # print(page_text)
24 all_province=soup.find_all('tr',class_='provincetr') #获取所有省份第一级的tr 有4个tr
25 # all_province长度为4,其中第一组是从北京市到黑龙江省
26 """
27 格式是这样的:
28 <tr class="provincetr"><td><a href="11.html">北京市<br/></a></td>
29 <td><a href="12.html">天津市<br/></a></td>
30 <td><a href="13.html">河北省<br/></a></td>
31 <td><a href="14.html">山西省<br/></a></td>
32 <td><a href="15.html">内蒙古自治区<br/></a></td>
33 <td><a href="21.html">辽宁省<br/></a></td><td>
34 """
35 province_str="" #为了方便处理,把省份数据变成一个字符串
36 for i in range(len(all_province)):
37 province_str=province_str+str(all_province[i])
38 # print(province_str)
39 # 开始分别获得a标签的href和text
40 province={}
41 province_soup=BeautifulSoup(province_str,'lxml')
42 province_href=province_soup.find_all("a") #获取所有的a标签
43 for i in province_href:
44 href_str=str(i)
45 # print(href_str)
46 #创建省份数据字典
47 province.update({BeautifulSoup(href_str,'lxml').find("a").text:BeautifulSoup(href_str,'lxml').find("a")["href"]})
48 # print(province)
49 """
50 数据provide字典
51 {'北京市': '11.html', '天津市': '12.html', '河北省': '13.html', '山西省': '14.html',
52 '内蒙古自治区': '15.html', '辽宁省': '21.html', '吉林省': '22.html', '黑龙江省': '23.html',
53 '上海市': '31.html', '江苏省': '32.html', '浙江省': '33.html', '安徽省': '34.html',
54 '福建省': '35.html', '江西省': '36.html', '山东省': '37.html', '河南省': '41.html',
55 '湖北省': '42.html', '湖南省': '43.html', '广东省': '44.html', '广西壮族自治区': '45.html',
56 '海南省': '46.html', '重庆市': '50.html', '四川省': '51.html', '贵州省': '52.html', '云南省': '53.html',
57 '西藏自治区': '54.html', '陕西省': '61.html', '甘肃省': '62.html', '青海省': '63.html',
58 '宁夏回族自治区': '64.html', '新疆维吾尔自治区': '65.html'}
59 """
60 # 根据身份数据字典继续爬取下一级的市级数据,创建市级数据字典
61 city=[]
62 city_url=""
63 city_tr=[]
64 temp_list=[]
65 for item in province.items():
66 # print(value)
67 city_url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+year+"/"+item[1]
68 city_html=requests.get(city_url,headers)
69 city_html.encoding='GBK'
70 city_text=city_html.text
71 city_tr.append(BeautifulSoup(city_text,'lxml').find_all('tr',class_="citytr"))
72 # 获得所有的市区tr city_tr列表长度是31 对应31个省或直辖市
73 # 下面开始建立市区的字典{"名字":"链接"}
74 #存放省名字列表
75 province_key=[]
76 for key in province.keys():
77 province_key.append(key)
78 num=0
79 for i in city_tr:
80 for j in i:
81 # j:<tr class="citytr"><td><a href="11/1101.html">110100000000</a></td><td><a href="11/1101.html">市辖区</a></td></tr>
82 # print(j)
83 etree_ = etree.HTML(str(j))
84 temp_list.append({
85 etree_.xpath('//tr/td[2]/a/text()')[0]:
86 etree_.xpath('//tr/td[2]/a/@href')[0]
87 })
88 # print(temp_list)
89 city.append({province_key[num]:temp_list})
90 num=num+1
91 temp_list=[]
92 print(len(city))
93
94 """
95 city[11]
96 {'安徽省': [{'合肥市': '34/3401.html'}, {'芜湖市': '34/3402.html'}, {'蚌埠市': '34/3403.html'},
97 {'淮南市': '34/3404.html'}, {'马鞍山市': '34/3405.html'}, {'淮北市': '34/3406.html'}, {'铜陵市': '34/3407.html'},
98 {'安庆市': '34/3408.html'}, {'黄山市': '34/3410.html'}, {'滁州市': '34/3411.html'}, {'阜阳市': '34/3412.html'},
99 {'宿州市': '34/3413.html'}, {'六安市': '34/3415.html'}, {'亳州市': '34/3416.html'}, {'池州市': '34/3417.html'},
100 {'宣城市': '34/3418.html'}]}
101 """
102
103 # 搞定市级字典,下面开始最后一步,area
104 province_name=""
105 city_name=""
106 area_name=""
107 area_tr=[]
108 area_list=[]
109 temp_area_list=[]
110
111 for item1 in city:
112 for k1,v1 in item1.items():
113 province_name=k1
114 if(province_name in ["北京","天津","上海","重庆"]):
115 province_name=province_name+"市"
116 if(province_name =="宁夏"):
117 province_name=province_name+"回族自治区"
118 if(province_name in["西藏","内蒙古"]):
119 province_name=province_name+"自治区"
120 if(province_name == "新疆"):
121 province_name=province_name+"维吾尔自治区"
122 if (province_name == "广西"):
123 province_name = province_name + "壮族自治区"
124 if(province_name=="黑龙江"):
125 province_name=province_name+"省"
126 if(len(province_name)==2 and province_name not in ["西藏","宁夏","新疆","广西","北京","天津","上海","重庆"]):
127 province_name = province_name+"省"
128 for item2 in v1:
129 for k2,v2 in item2.items():
130 city_name=k2
131 # print(city_name)
132 area_url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+ year +"/"+ v2
133 print(area_url)
134 area_response=requests.get(area_url,headers)
135 area_response.encoding='GBK'
136 area_text=area_response.text
137 area_soup=BeautifulSoup(area_text,'lxml')
138 area_tr=area_soup.find_all("tr",class_="countytr")
139 for i in range(len(area_tr)):
140 etree_area = etree.HTML(str(area_tr[i]))
141 try:
142 area_name=etree_area.xpath("//tr/td[2]/a/text()")[0]
143 except:
144 area_name = etree_area.xpath("//tr/td[2]/text()")[0]
145 # print(area_name)
146 # print(str(area_tr[i]))
147 try:
148 temp_area_list.append({
149 etree_area.xpath("//tr/td[1]/a/text()")[0][0:6]: province_name+"·"+city_name+"·"+area_name
150 })
151 except:
152 temp_area_list.append({
153 etree_area.xpath("//tr/td[1]/text()")[0][0:6]: province_name+"·"+city_name+"·"+area_name
154 })
155 area_list.append(temp_area_list)
156 temp_area_list=[]
157 time.sleep(1)
158 return area_list
159
160 def into_mysql(year):
161 year=str(year)
162 SQL=""
163 conn,cursor=get_mysql_conn()
164 res=get_area(year)
165 try:
166 for item in res:
167 for k,v in item[0].items():
168 print(k)
169 print(v)
170 SQL="insert into std_area (year,area_code, area_name) values ('"+year+"','"+k+"','"+v+"')"
171 print(SQL)
172 cursor.execute(SQL)
173 conn.commit()
174 except:
175 print("出现错误")
176 conn,cursor.close()
177 return None
178
179 def query(sql,*args):
180 """
181 通用封装查询
182 :param sql:
183 :param args:
184 :return:返回查询结果 ((),())
185 """
186 conn , cursor= get_mysql_conn()
187 print(sql)
188 cursor.execute(sql)
189 res = cursor.fetchall()
190 close_conn(conn , cursor)
191 return res
192 """
193 ------------------------------------------------------------------------------------
194 """
195 def get_mysql_conn():
196 """
197 :return: 连接,游标
198 """
199 # 创建连接
200 conn = pymysql.connect(host="127.0.0.1",
201 user="root",
202 password="000429",
203 db="data_cleaning",
204 charset="utf8")
205 # 创建游标
206 cursor = conn.cursor() # 执行完毕返回的结果集默认以元组显示
207 return conn, cursor
208
209 def close_conn(conn, cursor):
210 if cursor:
211 cursor.close()
212 if conn:
213 conn.close()
214 if __name__ == '__main__':
215 # res=get_area()
216 into_mysql('2009')
数据库截图

获取资源请关注公众号 【靠谱杨阅读人生】回复【城乡分类代码】获取
Python爬虫爬取国家统计局网站【统计用区划和城乡划分代码】并存入MySQL数据库的更多相关文章
- python爬虫--爬取某网站电影下载地址
前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用 ...
- python爬虫--爬取某网站电影信息并写入mysql数据库
书接上文,前文最后提到将爬取的电影信息写入数据库,以方便查看,今天就具体实现. 首先还是上代码: # -*- coding:utf-8 -*- import requests import re im ...
- 用Python爬虫爬取广州大学教务系统的成绩(内网访问)
用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- Python爬虫|爬取喜马拉雅音频
"GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
- python爬虫—爬取英文名以及正则表达式的介绍
python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...
- 使用python爬虫爬取链家潍坊市二手房项目
使用python爬虫爬取链家潍坊市二手房项目 需求分析 需要将潍坊市各县市区页面所展示的二手房信息按要求爬取下来,同时保存到本地. 流程设计 明确目标网站URL( https://wf.lianjia ...
- Python爬虫 - 爬取百度html代码前200行
Python爬虫 - 爬取百度html代码前200行 - 改进版, 增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...
- python爬虫爬取内容中,-xa0,-u3000的含义
python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310
- Python爬虫爬取全书网小说,程序源码+程序详细分析
Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...
随机推荐
- 在PL/SQL中使用日期类型
在PL/SQL中使用日期类型 之前的文章介绍了在PL/SQL中使用字符串和数字了下.毫无疑问,字符串和数字很重要,但是可以确定的是没有哪个应用不依赖于日期的. 你需要记录事件的发生事件,人们的出生日期 ...
- webrtc 渲染音频时遇到的问题
有用户反馈连麦时,直播间会有电流声,后面排查发现是 webrtc 内部播放器渲染音频时,用户的播放设备不支持 48000hz 采样率(我们传输的音频采样率都是 48000hz),导致音频数据受损而出现 ...
- xHook 源码解析
xHook 是爱奇艺开源的一个PLT Hook 框架 项目地址: https://github.com/iqiyi/xHook 该项目实现了 PTL/GOT Hook PTL hook 的本质是修改内 ...
- 使用 Hugging Face 微调 Gemma 模型
我们最近宣布了,来自 Google Deepmind 开放权重的语言模型 Gemma现已通过 Hugging Face 面向更广泛的开源社区开放.该模型提供了两个规模的版本:20 亿和 70 亿参数, ...
- 使用Java线程同步工具类CountDownLatch
java.util.concurrent.CountDownLatch是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQue ...
- zip压缩模块,tarfile压缩模块,包和模块,format格式化的复习--day17
1.zipfile模块 import zipfile #导入模块 1.压缩文件 (1)创建压缩包 参数1压缩包名字,参数2以w模式创建,参数3压缩固定写法 zf = zipfile.ZipFile(& ...
- ASP.NET Core MVC应用模型的构建[3]: Controller的收集
从编程的角度来看,一个MVC应用是由一系列Controller类型构建而成的,所以对于一个代表应用模型的ApplicationModel对象来说,它的核心就是Controllers属性返回的一组Con ...
- 【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
问题描述 在App Service for Linux环境中,部署Django应用,访问应用页面时候,出现css.js等静态资源文件加载失败问题. 浏览器Console提示的错误消息为: Refuse ...
- opencv库图像基础4绘图-python
opencv库图像基础4绘图-python 1.绘画线条和简单图形 创建颜色字典和一个画布 import cv2 import numpy as np import matplotlib.pyplot ...
- 深入解析ASP.NET Core MVC的模块化设计[下篇]
ASP.NET Core MVC的"模块化"设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载.<设计篇>介绍了 ...
