【爬蟲】身份證前6位區域劃分編碼爬取

因爲之前項目中是到網站去請求身份證號的歸屬地信息,網站並不穩定,打算改變一下,準備用在本地做一個碼錶,信息來源就是: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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章