因为之前项目中是到网站去请求身份证号的归属地信息,网站并不稳定,打算改变一下,准备用在本地做一个码表,信息来源就是: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()