前言
最近工作需要做一個省市區表格的數據。之前一直是偷懶用的網上的數據。這次決定自己寫一個好用的方法,一勞永逸的解決這個問題。
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