国家统计局网站相关分级页面截图

基本思路

爬取每个页面的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数据库的更多相关文章

  1. python爬虫--爬取某网站电影下载地址

    前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用 ...

  2. python爬虫--爬取某网站电影信息并写入mysql数据库

    书接上文,前文最后提到将爬取的电影信息写入数据库,以方便查看,今天就具体实现. 首先还是上代码: # -*- coding:utf-8 -*- import requests import re im ...

  3. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  4. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  5. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  6. python爬虫—爬取英文名以及正则表达式的介绍

    python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...

  7. 使用python爬虫爬取链家潍坊市二手房项目

    使用python爬虫爬取链家潍坊市二手房项目 需求分析 需要将潍坊市各县市区页面所展示的二手房信息按要求爬取下来,同时保存到本地. 流程设计 明确目标网站URL( https://wf.lianjia ...

  8. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  9. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

  10. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

随机推荐

  1. ckeditor使用技巧总结

    介绍 官方开发者文档:CKEditor 4 documentation 技巧总结 1.挑选需要的插件,打包下载 参考:CKEditor 4.4.1 添加代码高亮显示插件功能--使用官方推荐Code S ...

  2. Java集合框架学习(十四) Iterator接口详解

    Iterator接口介绍 public interface Iterator<E> iterator 用于迭代集合类型对象,例如: HashMap, ArrayList, LinkedLi ...

  3. 【Android 逆向】【攻防世界】黑客精神

    1. apk 安装到手机,提示输入注册码 2. jadx打开apk MainActivity.java @Override // android.app.Activity public void on ...

  4. 【.Net Core】.Net Core 源码分析与深入理解 - 配置中心 Startup.cs (二)

    源码版本: .Net Core 3.1.14 上篇文章: [.Net Core].Net Core 源码分析与深入理解 - 入口 Program.cs (一) 注意:本篇文章主要研究的是 Startu ...

  5. 【Azure 应用服务】Azure Function HTTP Trigger 遇见奇妙的500 Internal Server Error: Failed to forward request to http://169.254.130.x

    问题描述 使用 Azure Funciton App,在本地运行完全成功的Python代码,发布到Azure Function就出现了500  Internal Server Error. 而且错误消 ...

  6. 2024年,提升Windows开发和使用体验实践 - 小工具篇

    前言 本来是一篇文章的,不知不觉写成了系列. 其实开工那几天就已经写好了长文,这几天一忙就没连着发了. 本文介绍一些 Windows 上用的小工具. 美化/折腾/小工具 虽然这是在用 Windows ...

  7. 一文详解云上自动化部署集群管理工具 Nebula Operator

    本文首发于 Nebula Graph 公众号:Nebula Operator 开源啦!一文详解这个云上自动化部署集群管理工具 在介绍 Nebula Operator 之前,让我们先来了解下什么是 Op ...

  8. PostgreSQL、KingBase 数据库 ORDER BY LIMIT 查询缓慢案例

    好久没写博客了,最近从人大金仓离职了,新公司入职了蚂蚁集团,正在全力学习 OcenaBase 数据库的体系结构中. 以后分享的案例知识基本上都是以 OcenaBase 分布式数据库为主了,呦西. 昨天 ...

  9. Jmeter json断言的使用

    1 添加方式:取样器右键->添加->断言->JSON断言 作用:使用JSON表达式提取实际数据与预期进行比较   2首先我们来了解下断言组件的各个功能: Asset JSON Pat ...

  10. Abp.Zero 手机号免密登录验证与号码绑定功能的实现(三):Vue网页端开发

    前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读. 首先来编写发送验证码函数, 登录,绑定,解绑的业务都需要发送验证码功能,通过c ...