文档章节

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

vinci321
 vinci321
发布于 02/07 21:03
字数 937
阅读 17
收藏 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
博文 173
码字总数 217682
作品 0
私信 提问
会员中心、订单、验证、身份证体系相关改动

1、实现集合订单 2、实现集合订单一个二维码通关集合订单内所有门票收费点及酒店等消费验证场所 3、会员中心内集合订单的显示、管理(分单,录入身份证等) 4、分单的分享连接需要验证手机号...

Kit_lee
2017/10/27
0
0
一个身份证号码验证接口[0]

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

vinci321
01/23
0
0
基于浏览器的密码小键盘&二代证读卡器控件开发

1. 预期效果指标 通过本地驻留WEBSOCKET服务桥接浏览器和本地硬件,解决浏览器访问本地硬件兼容性问题; 本次项目耗时半个月,完成密码小键盘和二代证读卡器控件的开发工作。 项目验收接受后...

mr_chenj
2016/04/13
5
0
在php中使用对称加密DES3,开发银行卡绑定,实名验证

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

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

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

萧竹
2017/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

This APT has Super Cow Powers.

在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有超级牛力 牛力是个什么梗? 则说明你的系统...

taadis
12分钟前
0
0
起薪2万的爬虫工程师,Python需要学到什么程度才可以就业?

爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬。那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答。 1、前段时间快要毕业,而我又不想找自己的老本行Java开发...

糖宝lsh
21分钟前
1
0
携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
42分钟前
1
0
人工智能时代员工如何证明其IT工作价值

机器人可以取代你的工作吗?你能帮助机器人完成它的工作吗?如果你正在考虑自己的职业生涯以及今后将如何发展,那么应该询问自己这些问题了。 机器人可以取代你的工作吗?你能帮助机器人完成它的...

Linux就该这么学
43分钟前
2
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部