【爬虫】身份证前6位区域划分编码爬取

12 篇文章 1 订阅

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云中鲸

谢赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值