文档章节

一个身份证验证接口[3]

vinci321
 vinci321
发布于 02/07 21:03
字数 937
阅读 16
收藏 4

幸好老子从原来的文章提取出一部分还可以用的信息。

 

步骤:

1, 从未被删除的数据中恢复了三千多个城市,分别插入到idcard_address表中。

2, 发现恢复的数据是新GB/T2600的版本,很多旧版本的编码没有了,行政编码的GB/T2600有9个版本,很多城市有了新的编码,但是用了老的编码的身份证仍然有效,所以要找齐所有的版本编码才算齐全,无奈年代久远,网络资料有限,能找到的最早版本为1999年版本,是一个扫描生成的PDF文档,无法复制粘贴,需要一个一个手打到excle里面然后用python从excle里面逐行读取,速度很慢,所以只截取了几个省份(北京天津河北山西内蒙古江西等)。

3, 文件的数据和idcard_address表的数据共同插入到新表中: idcard_address_all.

如下

建表

# 部分表
CREATE TABLE `idcard_address` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `address_id` int(6) unsigned NOT NULL DEFAULT '0' COMMENT '行政区划编号',
  `address_name` varchar(40) NOT NULL DEFAULT '' COMMENT '行政区划名称',
  PRIMARY KEY (`id`),
  KEY `idx_ai_an` (`address_id`,`address_name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='行政区划表';

# 一起表
CREATE TABLE `idcard_address_all` (
  `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `address_id` int(6) unsigned NOT NULL DEFAULT '0' COMMENT '行政区划编号',
  `address_name` varchar(40) NOT NULL DEFAULT '' COMMENT '行政区划名称',
  PRIMARY KEY (`id`),
  KEY `idx_ai_an` (`address_id`,`address_name`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='行政区划表';

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# encoding=utf-8
# Filename: cityZoneDB.py
'''全国行政区划号码数据库'''


import MySQLdb
import sys
import re
import os
reload(sys)
sys.setdefaultencoding('utf-8')

class CZDB:

    def __init__(self):

        self.host = 'localhost'
        self.port = '3306'
        self.username = 'root'
        self.password = '123456'
        self.dbname = 'python'
        self.charset = 'utf8'
        self.oldtable = 'idcard_address'
        self.newtable = 'idcard_address_all'

    def connect(self):
        try:
            self.dbConnection = MySQLdb.connect(host=self.host, user=self.username, passwd=self.password, db=self.dbname, charset='utf8')
            # 打开数据库连接
            if self.dbConnection:
                self.cursor = self.dbConnection.cursor()
                print '数据库连接成功'
                return True
            else:
                print '数据库连接失败'
                return False
        except:
            print '数据库连接失败'
            return False

    # 插入数据
    def insertData(self, cities):
        # 整理获取到的数据
        values = []
        for city in cities:
            value = (int(city[0]), city[1])
            values.append(value)

        self.connect()
        try:
            self.cursor.executemany("insert into idcard_address_all(`address_id`,`address_name`) values(%s,%s)", values)
            self.dbConnection.commit()
            print '成功插入%d条数据到%s表' % (len(values), self.newtable)
        except Exception as e:
            print e
            self.dbConnection.rollback()
        self.dbConnection.close()

    # 获取文件中的数据
    def getFileData(self):
        filedict = {}
        fo = open("/home/c80k2/桌面/爬虫/行政区划/测试", "r")
        fo.seek(os.SEEK_SET)
        for line in fo.readlines():
            if line.strip() != '':
                code = re.findall('\d\d\d\d\d\d', line)[0]
                name = line.replace(code, '').strip('\t\n')
                filedict[code] = name
        fo.close()
        print '成功获取/home/c80k2/桌面/爬虫/行政区划/测试的数据'
        return filedict

    # 从表中获取数据
    def getDBData(self):
        dbdict = {}
        try:
            self.connect()
            # 执行SQL语句
            self.cursor.execute("select address_id,address_name from %s" % self.oldtable)
            # 获取所有记录列表
            results = self.cursor.fetchall()
            for row in results:
                code = int(str(row[0]).strip('L'))
                dbdict[code] = row[1]
        except:
            print "Error: unable to fecth data"

        # 关闭数据库连接
        self.dbConnection.close()
        print '成功获取DB数据'
        return dbdict

    # 获取所有数据
    def getAllData(self):
        fileData = self.getFileData()
        dbData = self.getDBData()
        # 对fileData进行去重处理
        for key, value in fileData.items():
            if dbData.has_key(str(key)) or dbData.has_key(int(key)):
                continue
            else:
                dbData[int(key)] = value
        # 对新字典进行排序
        sortedCityDict = dbData.items()
        sortedCityDict.sort()
        print '成功获取全部数据'
        return sortedCityDict

    # 插入全部数据到数据库
    def insertAllData(self):
        cities = self.getAllData()
        self.insertData(cities)

czdb = CZDB()
czdb.insertAllData()

运行结果

成功获取/home/c80k2/桌面/爬虫/行政区划/测试的数据
数据库连接成功
成功获取DB数据
成功获取全部数据
数据库连接成功
成功插入3928条数据到idcard_address_all表
mysql> select count(1) from idcard_address;
+----------+
| count(1) |
+----------+
|     3744 |
+----------+
1 row in set (0.01 sec)

mysql> select count(1) from idcard_address_all;
+----------+
| count(1) |
+----------+
|     3928 |
+----------+
1 row in set (0.00 sec)

总结:

连mysql的时候不能直接在初始化方法中连接,这样会造成mysql 2006 'MySQL server has gone away' 的错误。

© 著作权归作者所有

共有 人打赏支持
vinci321
粉丝 6
博文 153
码字总数 210298
作品 0
一个身份证号码验证接口[0]

背景:之前在地铁站遇到有警察查身份证,没有带身份证报身份证号码也可以,实际上是调用公安部身份证数据库的接口进行查询的,他们能做,为什么我不能做来看看? 实现功能: 输入一个身份证号...

vinci321
01/23
0
0
在php中使用对称加密DES3,开发银行卡绑定,实名验证

对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES、RC2、RC4、RC5。 DES3: 对DES算法的组合,指定...

皇冠小丑
06/03
0
0
互联网金融平台常见绑卡鉴权方式分析对比

1.背景 互联网金融平台账户进行开户或者支付业务时,绑卡鉴权环节是必经之路。 那么什么是绑卡鉴权?绑卡是将用户银行卡信息提供给金融平台,以后金融平台就用这个信息去银行完成支付。绑卡实...

萧竹
2017/07/13
0
0
jQuery进行简单验证的正则表达式

1、验证电话号码或者手机号码 1 2 3 4 5 6 7 8 9 10 \d{ ( 2、验证地址(中文、英文、数字) 1 2 3 4 5 6 7 8 9 3、验证用户名 1 2 3 4 5 6 7 8 9 10 4、验证密码 1 2 3 4 5 6 7 8 9 10 5、验...

笨小熊
2015/10/28
0
0
有道的查询IP,身份证,手机的API接口封掉了,你们验证身份证真伪用什么方法?

今天有用户给我说身份验证不能通过了,注册不了,发现有道的手机,IP,身份证的接口都疯了,你们怎么验证呢和查询归属地? http://www.youdao.com/smartresult-xml/search.s?type=ip&q=ip地址...

wrean2013
2013/08/12
5.7K
17

没有更多内容

加载失败,请刷新页面

加载更多

Linux 中不适用功能键切换TTY

本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY。在进一步讨论之前,我们将了解 TTY 是什么。正如在 AskUbuntu 论坛的一个答案[1]中所提到的,TTY这个词来自 Tele...

问题终结者
13分钟前
0
0
OSChina 周三乱弹 —— 我自己总觉得我的灵魂有毒

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享王菲的单曲《匆匆那年 (Fleet of Time)》 《匆匆那年 (Fleet of Time)》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) 天长地...

小小编辑
19分钟前
3
3
深度学习与图像处理实例:人像背景虚化与背景替换

简单人像背景虚化处理思路如下: 对图像内容分割,提取人像,背景 背景模糊处理 人像与模糊处理后的背景融合 本实例使用DeepLabV3图像分割深度学习模型实现。代码如下: import numpy as np...

IOTService
昨天
0
0
八月新增开源项目:假装自己是图形界面的 Git 命令行工具

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
昨天
8
0
20180918 find命令与Linux文件扩展名

命令find 用来查找搜索文件。 搜索文件相关命令: which 从环境变量里的目录中去搜索 whereis(不常用) 从一个固定的库中搜索 locate(需要单独安装 yum install -y mlocate) 查询时会从/var/...

野雪球
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部