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')
数据库截图
获取资源请关注公众号 【靠谱杨阅读人生】回复【城乡分类代码】获取
好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/15522061.html
欢迎来我的51CTO博客主页踩一踩 我的51CTO博客
文章中的公众号名称可能有误,请统一搜索:靠谱杨的秘密基地
分类:
干货
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-11-07 js表单简单验证(手机号邮箱)