因爲之前項目中是到網站去請求身份證號的歸屬地信息,網站並不穩定,打算改變一下,準備用在本地做一個碼錶,信息來源就是:2018年中華人民共和國行政區劃代碼,上面每個月都會變更信息我要找的就是11月份的代碼劃分。
關於身份證號的位數含義,及校驗方法,這裏面寫的特別詳細:
中國公民身份證號碼驗證標準、方案與實現
最近項目又有同類型的需求了,重新查詢發現到的文章,方法也都是特別的簡單,18年寫的,但是大體不影響使用。
#-*- coding:utf-8 _*-
"""
@file : idcard_dict.py
@auther : Ma
@time : 2018/11/06
從國家民政局上更新最新的行政區劃分狀況,並將結果加載到數據庫中
"""
import urllib
import re
import pymysql
import sys
reload(sys)
sys.setdefaultencoding('utf8')
db = pymysql.Connect(host=host, port=3306, user="root", passwd=passwd, db=db, charset='utf8')
cursor = db.cursor()
# 將字符串中數字取出來
def string_to_int(string):
return re.findall(r'\d+\.?\d*',string)
# 將身份證id和歸屬地放在一個list裏
def id_name_spider():
url = 'http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20180910291042.html'
h = urllib.urlopen(url=url).read()
res_pat = '<td class=xl7024103>(.*?)</td>'
res = re.compile(res_pat, re.S).findall(h)
# 裏面包含空字符串,利用filter函數過濾掉所有的''
res_list = filter(None, res)
return res_list
if __name__ == '__main__':
res_list = id_name_spider()
param_list = []
for i in range(0, len(res_list) / 2):
id = string_to_int(res_list[i * 2])[0]
name = res_list[i * 2 + 1]
# 清洗一下
if "<span style='mso" in name:
name = re.compile("(.*?)<span .*?</span>", re.S).findall(name)[0]
province_id = id[:2]
city_id = id[2:4]
district_id = id[4:]
if city_id == '00' and district_id == '00':
# 說明是省
insert_sql_param = '(%s,"%s",%s,%s,%s)' % (id, name, 1, 0, 0)
elif district_id == '00':
# 說明是市
insert_sql_param = '(%s,"%s",%s,%s,%s)' % (id, name, 0, 1, 0)
else:
# 說明是區縣
insert_sql_param = '(%s,"%s",%s,%s,%s)' % (id, name, 0, 0, 1)
param_list.append(insert_sql_param)
# 因爲條數大概在3.5k條左右,一條一條提交很慢,所以改成一個長sql
insert_sql_param_concat = ",".join(param_list)
insert_sql = 'insert into cardno_local (id,name,province,city,district) values ' + insert_sql_param_concat + ';'
print insert_sql
# 執行sql並提交
cursor.execute(insert_sql)
db.commit()