前言
最近工作需要做一个省市区表格的数据。之前一直是偷懒用的网上的数据。这次决定自己写一个好用的方法,一劳永逸的解决这个问题。
1.准备
既然要一直更新省市区的数据,那自然得有一个官方的地址库咯。开始找的是国家统计局上面的数据,然后准备写python爬虫开始爬取数据的。
但是写到后面和我的朋友一个朋友聊起这个的时候。他推荐了民政局的省市区资料。
因为统计局的资料实在是太详细了,都要某某街道某某居委会了。其实是没有必要的。民政局只有省市区的数据也是够用了的。
2.代码
虽然我主力写的是java,但是之前也看了很久的python,也写过一些爬虫什么的。在数据处理上还是决定用python来处理。最后生成需要的sql语句即可
然后需要安装是的 BeautifulSoup和lxml,python的版本是3.6
2个省市区的地址分别是:
民政局:http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20180708230813.html
统计局:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/
下面是详细的代码
# -*- coding:UTF-8 -*-
from urllib import request
from bs4 import BeautifulSoup
class area(object):
def __init__(self, id, name, pid, rank):
self.id = id
self.name = name
self.pid = pid
self.rank = rank
if __name__ == "__main__":
#创建txt文件
file = open('insert.sql', 'w', encoding='utf-8')
download_url = 'http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20180708230813.html'
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
download_req = request.Request(url = download_url, headers = head)
download_response = request.urlopen(download_req)
download_html = download_response.read().decode('utf8','ignore')
soup_texts = BeautifulSoup(download_html, 'lxml')
texts = soup_texts.find_all(class_ = 'xl708733')
list1 = []
for child in texts:
if(any(child)):
list1.append(child.get_text())
list2 = []
for i in range(0, len(list1), 2):
a = area(list1[i],list1[i+1],'0','0')
list2.append(a)
for i in range(0, len(list2), 1):
if int(list2[i].id) % 100 > 0:
list2[i].pid = str(int(list2[i].id) - int(list2[i].id) % 100)
list2[i].rank = '3'
continue
if int(list2[i].id) % 10000 > 0:
list2[i].pid = str(int(list2[i].id) - int(list2[i].id) % 10000)
list2[i].rank = '2'
continue
list2[i].rank = '1'
list2[i].pid = '0'
file.write("INSERT INTO sjy_network_address VALUES (110100,\'市辖区\',110000,2);")
file.write('\n')
file.write("INSERT INTO sjy_network_address VALUES (120100,\'市辖区\',120100,2);")
file.write('\n')
file.write("INSERT INTO sjy_network_address VALUES (310100,\'市辖区\',310100,2);")
file.write('\n')
file.write("INSERT INTO sjy_network_address VALUES (500100,\'市辖区\',500100,2);")
file.write('\n')
for child in list2:
file.write("INSERT INTO sjy_network_address VALUES ("+child.id+",\'"+child.name+"\',"+child.pid+","+child.rank+");")
file.write('\n')
3.补充说明
今天突然发现好坑。新疆,湖北和海南的最后几个市没有规律,要手动修改一下,加一个省直辖县市,还有东莞市,中山市,嘉峪关市,儋州市,三沙市,只有市没有区,还有河北省济源市,重庆市的一些县区
INSERT INTO sjy_network_address VALUES (429000,'直辖县市',420000,2);
INSERT INTO sjy_network_address VALUES (469000,'直辖县市',460000,2);
INSERT INTO sjy_network_address VALUES (659000,'直辖县市',650000,2);
INSERT INTO sjy_network_address VALUES (442001,'市辖区',442000,3);
INSERT INTO sjy_network_address VALUES (441901,'市辖区',441900,3);
INSERT INTO sjy_network_address VALUES (620201,'市辖区',620200,3);
INSERT INTO sjy_network_address VALUES (460401,'市辖区',460400,3);
INSERT INTO sjy_network_address VALUES (460301,'市辖区',460301,3);
INSERT INTO sjy_network_address_time VALUES (419000,'直辖县市',410000,2);
UPDATE sjy_network_address_time SET pid=500100 WHERE pid=500200
4.最后
如果实在偷懒不想看。那最后有一个结果。我把生成的mysql文件放了下载
https://download.csdn.net/download/qq_33562996/10953741