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

基本思路

爬取每个页面的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. 《系列一》-- 5、xml配置文件解析之[自定义]命名空间[标签]的解析

    阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主要内容需要看官自己去源码中验证.全系列文章基于 spring 源码 5.x 版本. Spring源码阅读系列--全局目录.md ...

  2. win32 - 基于hwnd获取进程名字(GetModuleFileNameEx)

    #include <Windows.h> #include <psapi.h> int main() { DWORD process_ID = 0; WCHAR process ...

  3. Go语言并发编程(2):channel 通道介绍和使用

    一.简介 channel 不仅可以用于 goroutine 间进行安全通信,还可以用于同步内存访问. 而且 Go 社区强烈推荐使用 channel 通道实现 goroutine 之间的通信, 不要通过 ...

  4. 统信UOS系统开发笔记(五):安装QtCreator开发IDE中的中文输入环境Fcitx输入法

    前言   中文输入法,QtCreator中无法输入中文也是ubuntu中一个常规问题,在国产银河麒麟系统中也有此问题(PS:最终无法结局,用文本自行贴),国产UOS也有此问题,本片要解决此问题,主要是 ...

  5. 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等

    输入整行字符串 平均绩点 题目描述 每门课的成绩分为A.B.C.D.F五个等级,为了计算平均绩点,规定A.B.C.D.F分别代表4分.3分.2分.1分.0分. 输入 有多组测试样例.每组输入数据占一行 ...

  6. 【Azure 应用服务】Azure App Service 在不配置自定义域名的情况下如何使用呢?

    问题描述 根据中国法律法规的规定及相关监管机构的要求,当使用应用服务创建应用时,须立即绑定一个已经完成ICP备案的自定义域名并通过该自定义域名访问该应用服务.任何通过Internet对应用服务默认域名 ...

  7. [linux 爬坑] 几个linux发行版尝试和令人崩溃的ssr安装体验

    最近电脑上的manjaro好像出了问题,长时间不用就会死机.也懒得追究原因了,正好决定尝试几个发行版.首先尝试安装银河麒麟    这个发行版实际上就是ubuntu,甚至源什么的都是ubuntu的,也不 ...

  8. Mysql基础目录

    尚硅谷Mysql课程笔记 课程链接: https://www.bilibili.com/video/BV1iq4y1u7vj?p=1 第01章_数据库概述 第02章_MySQL环境搭建 第03章_基本 ...

  9. Android 安装手机程序有问题/点击runAPP 程序安装不了手机

    可以在 gradle.properties 里添加   android.injected.testOnly=false   点击同步  就可以运行了 如下:

  10. Java 小案例+super使用

    1 package com.bytezero.supertest3; 2 3 /** 4 * 5 * @Description AccountTest类 6 * @author Bytezero·zh ...