python批量生成身份证号到Excel的两种方法实例


Posted in Python onJanuary 14, 2021

身份证号码的编排规则

前1、2位数字表示:所在省份的代码;

第3、4位数字表示:所在城市的代码;

第5、6位数字表示:所在区县的代码;

第7~14位数字表示:出生年、月、日;

第15、16位数字表示:所在地的派出所的代码;

第17位数字表示性别:奇数表示男性,偶数表示女性;

第18位数字是校检码,计算方法如下:

(1)将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

(2)将这17位数字和系数相乘的结果相加。

(3)用加出来和除以11,取余数。

(4)余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X…)

第一种方法:网页爬取身份证前六位

import urllib.request
from bs4 import BeautifulSoup
import re
import random
import time
import xlwt

# 通过爬取网页获取到身份证前六位
url = 'http://www.qucha.net/shenfenzheng/city.htm'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
}
request = urllib.request.Request(url, headers=headers) # 获取url的网页源码
response = urllib.request.urlopen(request)
html = response.read()
soup = BeautifulSoup(html, 'lxml')
strarr = []
for info in soup.find_all('td', valign='top'): # <td valign = "top"></td>中的内容
 pattern = re.compile(r'\d{6}') # 正则表达式,找6个整数
 pre = re.findall(pattern, info.text) # 在info中查找符合表达式的内容

def year():
 '''生成年份'''
 # 从1960开始算,now-18直接过滤掉小于18岁出生的年份
 now = time.strftime('%Y')
 second = random.randint(1960, int(now) - 18)
 return second


def month():
 '''生成月份'''
 three = str(random.randint(1, 12))
 mon = three.zfill(2)# zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0
 return mon


def day(year, month):
 '''生成日期'''
 four = str(getDay(year, month))
 days = four.zfill(2)
 return days


def getDay(year, month):
 '''根据传来的年月份返回日期'''
 # 1,3,5,7,8,10,12月为31天,4,6,9,11为30天,2月闰年为28天,其余为29天
 aday = 0
 if month in (1, 3, 5, 7, 8, 10, 12):
 aday = random.randint(1, 31)
 elif month in (4, 6, 9, 11):
 aday = random.randint(1, 30)
 else:
 # 即为2月判断是否为闰年
 if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)):
 aday = random.randint(1, 28)
 else:
 aday = random.randint(1, 29)
 return aday


def randoms():
 '''生成身份证后三位'''
 ran = str(random.randint(1, 999))
 five = ran.zfill(3)
 return five


# 前17位身份证
def ID():
 first = random.choice(pre)
 second = year()
 three = month()
 four = day(second, three)
 five = randoms()
 # 前17位身份证
 ID = str(first) + str(second) + three + four + five
 return ID

def ID_last():
 ID_17 = ID()
 lid = list(map(int, ID_17)) # 将字符串数组转为int列表
 weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项
 temp = 0
 for i in range(17):
 temp += lid[i]*weight[i]
 checkcode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']# 校验码映射
 ID_last = checkcode[temp%11]
 return ID_last

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('IDcard')
# 设置单元格宽度
worksheet.col(0).width = 5555

for i in range(100): #设置生成身份证号的数量
 IDcard = ID() + ID_last()
 worksheet.write(i, 0, IDcard)
 # 写入excel,参数对应 行, 列, 值
workbook.save('IDcard.xlsx')
# 运行后 会在当前目录生成一个IDcard.xlsx

第二种方法:身份证前六位从本地excel中取

如果自己有这么一份全国身份证前六位的数据且存在excel中,可以直接跳到第二步。没有的话,下面是爬取全国身份证前六位,并保存到自己本地的代码实现,建议跑一遍保存下来,谁知道这个爬取的地址哪天作者删除文件了呢,到时第一种方法就不适用了,得换地址处理等。(另外,爬取下来到excel中自己还能再处理一下前六位,因为我这个爬取包括“440000 广东省”这种,不知道身份证有没有前六位是这种的,我知道的好像没有,我爬下来的前六位没有删掉这些,如下图红框)

python批量生成身份证号到Excel的两种方法实例

# 通过爬取网页获取到身份证前六位并保存到本地excel中
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt

# 通过爬取网页获取到身份证前六位
url = 'http://www.qucha.net/shenfenzheng/city.htm'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
}
request = urllib.request.Request(url, headers=headers) # 获取url的网页源码
response = urllib.request.urlopen(request)
html = response.read()
soup = BeautifulSoup(html, 'lxml')
strarr = []
for info in soup.find_all('td', valign='top'): # <td valign = "top"></td>中的内容
 pattern = re.compile(r'\d{6}') # 正则表达式,找6个整数
 pre = re.findall(pattern, info.text) # 在info中查找符合表达式的内容,保存在pre中

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('ID_pre_six')
# 设置单元格宽度
worksheet.col(0).width = 3333

for i in range(len(pre)):
 worksheet.write(i, 0, pre[i])
 # 写入excel,参数对应 行, 列, 值
workbook.save('ID_pre_six.xlsx')
# 运行后 会在当前目录生成一个ID_pre_six.xlsx

导入本地excel数据(身份证前六位)保存为字符串数组,然后生成身份证号码

import random
import time
import xlwt
import pandas as pd

# 不把第1行作为列名,读取Excel那就没有列名,需增加参数:header=None
# 第一个参数为身份证前六位的excel数据路径
df = pd.read_excel('E:\Code\Python\ID_pre_six.xlsx', sheet_name='ID_pre_six', header=None)
# 获取最大行
nrows = df.shape[0]
pre = []
for iRow in range(nrows):
 # 将表中第一列数据写入pre数组中
 pre.append(df.iloc[iRow, 0])

def year():
 '''生成年份'''
 # 从1960开始算,now-18直接过滤掉小于18岁出生的年份
 now = time.strftime('%Y')
 second = random.randint(1960, int(now) - 18)
 return second


def month():
 '''生成月份'''
 three = str(random.randint(1, 12))
 mon = three.zfill(2)# zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0
 return mon


def day(year, month):
 '''生成日期'''
 four = str(getDay(year, month))
 days = four.zfill(2)
 return days


def getDay(year, month):
 '''根据传来的年月份返回日期'''
 # 1,3,5,7,8,10,12月为31天,4,6,9,11为30天,2月闰年为28天,其余为29天
 aday = 0
 if month in (1, 3, 5, 7, 8, 10, 12):
 aday = random.randint(1, 31)
 elif month in (4, 6, 9, 11):
 aday = random.randint(1, 30)
 else:
 # 即为2月判断是否为闰年
 if ((year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)):
 aday = random.randint(1, 28)
 else:
 aday = random.randint(1, 29)
 return aday


def randoms():
 '''生成身份证后三位'''
 ran = str(random.randint(1, 999))
 five = ran.zfill(3)
 return five


# 前17位身份证
def ID():
 first = random.choice(pre)
 second = year()
 three = month()
 four = day(second, three)
 five = randoms()
 # 前17位身份证
 ID = str(first) + str(second) + three + four + five
 return ID

def ID_last():
 ID_17 = ID()
 lid = list(map(int, ID_17)) # 将字符串数组转为int列表
 weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 权重项
 temp = 0
 for i in range(17):
 temp += lid[i]*weight[i]
 checkcode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']# 校验码映射
 ID_last = checkcode[temp%11]
 return ID_last

# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个worksheet
worksheet = workbook.add_sheet('IDcard')
# 设置单元格宽度
worksheet.col(0).width = 5555

for i in range(100):# 设置生成数量
 IDcard = ID() + ID_last()
 worksheet.write(i, 0, IDcard)
 # 写入excel,参数对应 行, 列, 值
workbook.save('IDcard.xlsx')
# 运行后 会在当前目录生成一个IDcard.xlsx

PS:爬取网页中哪个tag里的内容,可以浏览器页面,右键->查看网页源代码,如下图,我需要的内容都含在方框那个tag里:

python批量生成身份证号到Excel的两种方法实例

参考:

总结

到此这篇关于python批量生成身份证号到Excel的两种方法的文章就介绍到这了,更多相关python批量生成身份证号到Excel内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
讲解Python中的递归函数
Apr 27 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
基于Python的关键字监控及告警
Jul 06 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
详解Python3定时器任务代码
Sep 23 Python
详解python中eval函数的作用
Oct 22 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
Django解决frame拒绝问题的方法
Dec 18 Python
使用Python实现音频双通道分离
Dec 25 Python
Django扫码抽奖平台的配置过程详解
Jan 14 #Python
如何用python实现一个HTTP连接池
Jan 14 #Python
如何用python写个模板引擎
Jan 14 #Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 #Python
详解如何使用Pytest进行自动化测试
Jan 14 #Python
matplotlib对象拾取事件处理的实现
Jan 14 #Python
用python查找统一局域网下ip对应的mac地址
Jan 13 #Python
You might like
PHP 面向对象实现代码
2009/11/11 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
pymssql ntext字段调用问题解决方法
2008/12/17 Python
浅析Python中signal包的使用
2015/11/13 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
广州品高软件.net笔面试题目
2012/04/18 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
药学专业个人自我评价
2013/11/11 职场文书
高一家长会邀请函
2014/01/12 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
见习报告格式范文
2014/11/08 职场文书
趣味运动会标语口号
2015/12/26 职场文书
《司马光》教学反思
2016/02/22 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
Python何绘制带有背景色块的折线图
2022/04/23 Python