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

基本思路

爬取每个页面的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. ORACLE cannot fetch plan for SQL_ID

    今天做SQL执行计划测试的时候,发现sqlplus无法正常打印执行计划,根据网上资料整理如下: ..... SYS@orcl> select *   2     from table(   3 ...

  2. harbor镜像仓搭建相关问题

    1 环境 自己生成了SSL证书 证书目录与 harbor.cfg 文件中定义的路径需要一致 使用的是offline 包安装 执行 install.sh 脚本后,通过浏览器远程访问成功, 但是在别的机器 ...

  3. 【Android逆向】静态分析+frida破解test2.apk

    有了上一篇的基础 https://www.cnblogs.com/gradyblog/p/17152108.html 现在尝试静态分析的方式来处理 为什么还要多此一举,因为题眼告诉了我们是五位数字,所 ...

  4. Docker方式快速启动一个Redis实例

    安装Redis有多种方式,除了可以通过各个平台的软件包工具安装外,还可以直接从源码安装. 但是,安装Redis可能会遇到一些这样的问题,比如: 1.网络环境比较差,下载耗时比较长 2.从源码编译安装时 ...

  5. deque双端队列

    # 支持从任意一端增加和删除元素 d = collections.deque() d.extend('abcdefg') d.append('h') d.extendleft(range(6)) # ...

  6. 【LeetCode字符串#04】左旋转字符串,以及反转函数使用说明

    左旋转字符串 力扣题目链接(opens new window) 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"a ...

  7. MIG是如何向DDR中写入数据的

    1.1    先来看看信号线的描述 我们以X16的器件为例,下面的截图来自 镁光的官方手册 https://media-www.micron.com/-/media/client/global/doc ...

  8. 前后端分离项目(七):实现"添加"功能(前端视图)

    好家伙,本篇用于测试"添加"接口,为后续"用户注册"功能做铺垫   (完整代码在最后) 我们要实现"添加"功能 老样子我们先来理清一下思路, ...

  9. Java 类的成员之四: 代码块(或初始化块)

    1 package com.bytezreo.block; 2 3 /** 4 * 5 * @Description 类的成员之四: 代码块(或初始化块) 6 * @author Bytezero·z ...

  10. Beckhoff 倍福 漏洞-整理(持续更新)

    工控漏洞整理网站 http://ivd.winicssec.com/index.php/Home/Search/search.html?keyword=Beckhoff