国家统计局->统计标准网址:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/

获取资源请关注公众号 【靠谱杨阅读人生】回复【城乡分类】获取

流程简介

对统计标准的网站进行分层分级爬取:

代码

import pymysql
from bs4 import BeautifulSoup
import re
import requests
import lxml
import traceback
import time
import json
from lxml import etree def get_area(year):
year=str(year)
url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+ year +"/index.html"
print(url)
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
response=requests.get(url,headers)
# print(response.text)
response.encoding='GBK'
page_text = response.text
soup=BeautifulSoup(page_text,'lxml')
# print(page_text)
all_province=soup.find_all('tr',class_='provincetr') #获取所有省份第一级的tr 有4个tr
# all_province长度为4,其中第一组是从北京市到黑龙江省
"""
格式是这样的:
<tr class="provincetr"><td><a href="11.html">北京市<br/></a></td>
<td><a href="12.html">天津市<br/></a></td>
<td><a href="13.html">河北省<br/></a></td>
<td><a href="14.html">山西省<br/></a></td>
<td><a href="15.html">内蒙古自治区<br/></a></td>
<td><a href="21.html">辽宁省<br/></a></td><td>
"""
province_str="" #为了方便处理,把省份数据变成一个字符串
for i in range(len(all_province)):
province_str=province_str+str(all_province[i])
# print(province_str)
# 开始分别获得a标签的href和text
province={}
province_soup=BeautifulSoup(province_str,'lxml')
province_href=province_soup.find_all("a") #获取所有的a标签
for i in province_href:
href_str=str(i)
# print(href_str)
#创建省份数据字典
province.update({BeautifulSoup(href_str,'lxml').find("a").text:BeautifulSoup(href_str,'lxml').find("a")["href"]})
# print(province)
"""
数据provide字典
{'北京市': '11.html', '天津市': '12.html', '河北省': '13.html', '山西省': '14.html',
'内蒙古自治区': '15.html', '辽宁省': '21.html', '吉林省': '22.html', '黑龙江省': '23.html',
'上海市': '31.html', '江苏省': '32.html', '浙江省': '33.html', '安徽省': '34.html',
'福建省': '35.html', '江西省': '36.html', '山东省': '37.html', '河南省': '41.html',
'湖北省': '42.html', '湖南省': '43.html', '广东省': '44.html', '广西壮族自治区': '45.html',
'海南省': '46.html', '重庆市': '50.html', '四川省': '51.html', '贵州省': '52.html', '云南省': '53.html',
'西藏自治区': '54.html', '陕西省': '61.html', '甘肃省': '62.html', '青海省': '63.html',
'宁夏回族自治区': '64.html', '新疆维吾尔自治区': '65.html'}
"""
# 根据身份数据字典继续爬取下一级的市级数据,创建市级数据字典
city=[]
city_url=""
city_tr=[]
temp_list=[]
for item in province.items():
# print(value)
city_url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+year+"/"+item[1]
city_html=requests.get(city_url,headers)
city_html.encoding='GBK'
city_text=city_html.text
city_tr.append(BeautifulSoup(city_text,'lxml').find_all('tr',class_="citytr"))
# 获得所有的市区tr city_tr列表长度是31 对应31个省或直辖市
# 下面开始建立市区的字典{"名字":"链接"}
#存放省名字列表
province_key=[]
for key in province.keys():
province_key.append(key)
num=0
for i in city_tr:
for j in i:
# j:<tr class="citytr"><td><a href="11/1101.html">110100000000</a></td><td><a href="11/1101.html">市辖区</a></td></tr>
# print(j)
etree_ = etree.HTML(str(j))
temp_list.append({
etree_.xpath('//tr/td[2]/a/text()')[0]:
etree_.xpath('//tr/td[2]/a/@href')[0]
})
# print(temp_list)
city.append({province_key[num]:temp_list})
num=num+1
temp_list=[]
print(len(city)) """
city[11]
{'安徽省': [{'合肥市': '34/3401.html'}, {'芜湖市': '34/3402.html'}, {'蚌埠市': '34/3403.html'},
{'淮南市': '34/3404.html'}, {'马鞍山市': '34/3405.html'}, {'淮北市': '34/3406.html'}, {'铜陵市': '34/3407.html'},
{'安庆市': '34/3408.html'}, {'黄山市': '34/3410.html'}, {'滁州市': '34/3411.html'}, {'阜阳市': '34/3412.html'},
{'宿州市': '34/3413.html'}, {'六安市': '34/3415.html'}, {'亳州市': '34/3416.html'}, {'池州市': '34/3417.html'},
{'宣城市': '34/3418.html'}]}
""" # 搞定市级字典,下面开始最后一步,area
province_name=""
city_name=""
area_name=""
area_tr=[]
area_list=[]
temp_area_list=[] for item1 in city:
for k1,v1 in item1.items():
province_name=k1
if(province_name in ["北京","天津","上海","重庆"]):
province_name=province_name+"市"
if(province_name =="宁夏"):
province_name=province_name+"回族自治区"
if(province_name in["西藏","内蒙古"]):
province_name=province_name+"自治区"
if(province_name == "新疆"):
province_name=province_name+"维吾尔自治区"
if (province_name == "广西"):
province_name = province_name + "壮族自治区"
if(province_name=="黑龙江"):
province_name=province_name+"省"
if(len(province_name)==2 and province_name not in ["西藏","宁夏","新疆","广西","北京","天津","上海","重庆"]):
province_name = province_name+"省"
for item2 in v1:
for k2,v2 in item2.items():
city_name=k2
# print(city_name)
area_url="http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/"+ year +"/"+ v2
print(area_url)
area_response=requests.get(area_url,headers)
area_response.encoding='GBK'
area_text=area_response.text
area_soup=BeautifulSoup(area_text,'lxml')
area_tr=area_soup.find_all("tr",class_="countytr")
for i in range(len(area_tr)):
etree_area = etree.HTML(str(area_tr[i]))
try:
area_name=etree_area.xpath("//tr/td[2]/a/text()")[0]
except:
area_name = etree_area.xpath("//tr/td[2]/text()")[0]
# print(area_name)
# print(str(area_tr[i]))
try:
temp_area_list.append({
etree_area.xpath("//tr/td[1]/a/text()")[0][0:6]: province_name+"·"+city_name+"·"+area_name
})
except:
temp_area_list.append({
etree_area.xpath("//tr/td[1]/text()")[0][0:6]: province_name+"·"+city_name+"·"+area_name
})
area_list.append(temp_area_list)
temp_area_list=[]
time.sleep(1)
return area_list def into_mysql(year):
year=str(year)
SQL=""
conn,cursor=get_mysql_conn()
res=get_area(year)
try:
for item in res:
for k,v in item[0].items():
print(k)
print(v)
SQL="insert into std_area (year,area_code, area_name) values ('"+year+"','"+k+"','"+v+"')"
print(SQL)
cursor.execute(SQL)
conn.commit()
except:
print("出现错误")
conn,cursor.close()
return None def query(sql,*args):
"""
通用封装查询
:param sql:
:param args:
:return:返回查询结果 ((),())
"""
conn , cursor= get_mysql_conn()
print(sql)
cursor.execute(sql)
res = cursor.fetchall()
close_conn(conn , cursor)
return res
"""
------------------------------------------------------------------------------------
"""
def get_mysql_conn():
"""
:return: 连接,游标
"""
# 创建连接
conn = pymysql.connect(host="127.0.0.1",
user="root",
password="000429",
db="data_cleaning",
charset="utf8")
# 创建游标
cursor = conn.cursor() # 执行完毕返回的结果集默认以元组显示
return conn, cursor def close_conn(conn, cursor):
if cursor:
cursor.close()
if conn:
conn.close()
if __name__ == '__main__':
# res=get_area()
into_mysql('2009')

数据库截图

Python爬取国家统计局2009至2020统计用区划和城乡划分代码(省市区/县三级)并存入mysql数据库的更多相关文章

  1. [Python]爬取CSDN论坛 标题 2020.2.8

    首先新建一个Lei.txt 内容为: CloudComputingParentBlockchainTechnologyEnterpriseDotNETJavaWebDevelopVCVBDelphiB ...

  2. 使用HtmlAgilityPack 爬取 国家统计局 区划和城乡划分代码

    HtmlAgilityPack:Html解析神器,根据url地址解析html页面内容. 项目引用HtmlAgilityPack.dll文件或者通过安装 nuget 包 HtmlAgilityPack ...

  3. Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]

    日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  4. Python 爬取淘宝商品数据挖掘分析实战

    Python 爬取淘宝商品数据挖掘分析实战 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 爬取淘宝商品 ...

  5. python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:简单 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  6. steam夏日促销悄然开始,用Python爬取排行榜上的游戏打折信息

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 不知不觉,一年一度如火如荼的steam夏日促销悄然开始了.每年通过大大小小 ...

  7. Python爬取网易云音乐歌手歌曲和歌单

    仅供学习参考 Python爬取网易云音乐网易云音乐歌手歌曲和歌单,并下载到本地 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...

  8. 用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!

    众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列.通过分析弹幕,我们可以快速洞察广大观众对于视频 ...

  9. 用Python爬取分析【某东618】畅销商品销量数据,带你看看大家都喜欢买什么!

    618购物节,辰哥准备分析一波购物节大家都喜欢买什么?本文以某东为例,Python爬取618活动的畅销商品数据,并进行数据清洗,最后以可视化的方式从不同角度去了解畅销商品中,名列前茅的商品是哪些?销售 ...

  10. Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

    爬取过程在这里: Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图 本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析. 依赖库: 豆瓣镜像比较快: ...

随机推荐

  1. FTP命令详解(含操作实例)

    以下是微软命令行FTP客户端命令大全,如果你想使用"未加工(RAW)"FTP命令而非下面翻译过的请参考:http://www.nsftools.com/tips/RawFTP.ht ...

  2. BUUCTF [强网杯 2019]随便注 1

    1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...

  3. Gin框架入门

    参考文档 Gin: https://gin-gonic.com/zh-cn/docs/quickstart/ net/http: https://pkg.go.dev/net/http 代码分析 pa ...

  4. 【算法day4】堆结构、堆排序、比较器以及桶排

    堆与堆结构(优先级队列结构) 知识点: 堆结构就是用数组实现的完全二叉树结构 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 堆结构的heapl ...

  5. 【LeetCode哈希表#2】两个数组的交集(Set+数组)

    两个数组的交集 力扣题目链接(opens new window) 题意:给定两个数组,编写一个函数来计算它们的交集. 说明: 输出结果中的每个元素一定是唯一的. 我们可以不考虑输出结果的顺序. 思路 ...

  6. 【Azure Cloud Services】云服务频繁发生服务器崩溃的排查方案

    问题描述 云服务(Cloud Services)在使用期间,频繁发生崩溃事件,在崩溃期间,查看CPU负载为100%,而且同时伴随以下情况: 部署在云服务上的应用无法访问 远程连接云服务实例(RDP)访 ...

  7. 【Azure 云服务】当Windows系统发布新的安全漏洞后,如何查看Azure云服务(Cloud Service)的实例是否也更新了安全补丁呢?

    问题描述 当Windows发布新的安全漏洞后,会根据安全漏洞的级别分类来确定是紧急打补丁升级,还是每一月的补丁日( 每月第二周的星期二)来统一推送补丁. 比如最近的一个安全漏洞(9月13号发布)  C ...

  8. 【Azure 环境】使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢(Microsoft Antimalware)?

    问题描述 使用Azure中的App Service部署Web应用,以Windows为主机系统是否可以启动防病毒,防恶意软件服务呢? Microsoft Antimalware for Azure is ...

  9. 【Azure Developer】PHP网站使用AAD授权登录的参考示例

    问题描述 如果有个PHP网站,需要使用AAD授权登录,有没有PHP代码实例 可供参考呢? 参考代码 参考一篇博文(Single sign-on with Azure AD in PHP),学习使用SS ...

  10. C#的托盘窗体显示与隐藏效果 - 开源研究系列文章

    今天无聊,进行的C#的编码内容仍然在继续.这些天不断地在完善及编写C#的Winform相关的代码,并将其整理形成博文.这次带来的是关于窗体的显示及隐藏效果的代码段.上次有过一个代码,这次当做新代码进行 ...