一、背景

工作中偶尔会遇到这样的情况,给你一堆客户身份证号码,然后要你把对应的性别、生日、户籍地等信息弄出来。

最常用的方法就是用excel表套公式,这个方式如果用来取性别、生日这些信息的话问题不大,毕竟这些规则还好梳理,但是如果想要弄户籍地(如:广东省 广州市 荔湾区),操作难度极大。首先,你要弄到相应的行政区划代码,如广东省广州市天河区是440106,要注意,这些区划代码因为行政区划的调整,是有很多变化的,而且还是时时调整的,反正让我去收集这么一个表出来,我是做不到了。

由于以上原因,我只能另想其他办法了。

后来发现有这么一个网站:http://qq.ip138.com/idsearch/index.asp?userid=&action=idcard 。你在这个网站上输入身份证号码,它就会给你把性别、生日、户籍地给你弄出来。

看到这个网站就想,如果能让代码把身份证号码一个一个到网站上遍历一遍,然后把这些信息扒下来不就行了??

说干就干!

二、代码部分

这里用到的是python,整体的思路:

1、把要处理的身份证读入

2、设置循环,一个一个获取身份证号码对应的信息

3、分析页面的html,把目标信息取出

4、把获取的信息打包,输出成一个excel文件

第一步,读入身份证号码很简单,用pandas的read_csv读入即可,这里以txt文件为例,格式如下:

代码如下(如果是.xlsx或.csv文件,同样处理即可)

import pandas as pddf = pd.read_csv('E:/SFZ.txt', sep='\t', header=None, dtype=str, na_filter=False)

第二步,设置循环很简单,关键是怎么才能做到每次查询对应的身份证号码信息。常规套路,先看一下网址url,上图的url是:http://qq.ip138.com/idsearch/index.asp?userid=440103198007314832&action=idcard,细细一看发现要查询的身份证号码也在url中(其实很多网页都会把输入的查询内容整到url上),大胆猜想一下,是不是url就是由三部分组成:"http://qq.ip138.com/idsearch/index.asp?userid="+身份证号码+"&action=idcard"  。多拿几个号码输入测试一下,没问题。(有时如果没有规律可循,一定要一个一个输入值,可以用selenium,每次自动将身份证号码键入即可)

接下就很简单了,写个for循环,每次根据身份证号码组成一个新的url,完成。

第三步,解析网页目标信息,用select、find、xpath都行,这里用select举例,详细用法可点连接查看,不赘述

#解析网页
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'lxml')#将网页中咱们需要的信息所有在的模块切出来
mainpart = soup.select('div[class="bd"] tbody tr')#将信息取出并存入list中
if len(mainpart)>4:sex = mainpart[1].text.split('性别')[1]birthday = mainpart[2].text.split('出生日期')[1]address = mainpart[4].text.split('发证地')[1]
else:continue

第四步,打包数据用pandas的to_excel即可,代码如下:

#打包数据
data=pd.DataFrame({'idcard':idcard,'sex':sex1,'birthday':birthday1,'address':address1})
print (data)#打印出来瞄一眼#将数据输出成一个excel文件
pd.DataFrame.to_excel(data,"E:\\person_card.xlsx",header=True,encoding='gbk',index=False)

完整代码在这里!完整代码在这里!完整代码在这里!

#把需要用到的库一股脑import进来
import importlib,sys
importlib.reload(sys)
import time
import requests
from lxml import etree
from bs4 import BeautifulSoup
time1=time.time() #定义个时间,为了后面可以记录一下代码执行的时长
import pandas as pd#先将存有身份证号码信息的txt文件读取进来
df = pd.read_csv('E:/SFZ.txt', sep='\t', header=None, dtype=str, na_filter=False)#定义接下来存储身份证号码、性别、生日、户籍地信息的4个list
idcard =[]
sex1 = []
birthday1 = []
address1 = []#看一下读取进来的一共有多少个身份证号码
length=len(df)
print(length)#通过循环,依次将每个身份证号码对应的信息获取
for i in range(0,length):#多一个try,防止某个号码出差自己中止代码执行try:#print (df.iloc[i,0])#url="http://qq.ip138.com/idsearch/index.asp?action=idcard&userid="+df.iloc[i,0]+"&B1=%B2%E9+%D1%AF"#上面的url规则是2018年年底写的,结果到了2019年网址格式就又改了,苦逼地改一下#查看身份证查询网页的网址,发现规律,按照规律组成urlurl="http://qq.ip138.com/idsearch/index.asp?userid="+df.iloc[i,0]+"&action=idcard"    #解析网页res = requests.get(url)res.encoding = 'utf-8'soup = BeautifulSoup(res.text,'lxml')#将网页中咱们需要的信息所有在的模块切出来mainpart = soup.select('div[class="bd"] tbody tr')#将信息取出并存入list中if len(mainpart)>4:sex = mainpart[1].text.split('性别')[1]birthday = mainpart[2].text.split('出生日期')[1]address = mainpart[4].text.split('发证地')[1]idcard.append(df.iloc[i,0])sex1.append(sex)birthday1.append(birthday)address1.append(address)else:continueexcept Exception as e:print (Exception, ":", e)#打包数据
data=pd.DataFrame({'idcard':idcard,'sex':sex1,'birthday':birthday1,'address':address1})
print (data)#打印出来瞄一眼#将数据输出成一个excel文件
pd.DataFrame.to_excel(data,"E:\\person_card.xlsx",header=True,encoding='gbk',index=False)time2=time.time()
print (u'ok,爬虫结束!')
print (u'总共耗时:'+str(time2-time1)+'s')

执行结果如下:

python爬虫--根据身份证号码获取户籍地、出生年月等信息相关推荐

  1. 身份证、护照验证 身份证号码获取生日、性别信息

    2019独角兽企业重金招聘Python工程师标准>>> 功能描述 录入一些客户的信息,证件验证,例如身份证.护照验证等.身份证号码验证正确以后,手动录入后实现能自动显示生日.性别 信 ...

  2. python爬虫(6)——获取天猫商品评论信息

    本文以读取商品评论的json数据的方式来获取天猫商品评论,本文所采用的方法借鉴自知乎某大神(https://www.zhihu.com/question/36524413),可以非常方便地爬取特定商品 ...

  3. python爬虫(7)——获取京东商品评论信息

    本文借鉴了之前爬取天猫商品评论的思想,先通过分析网页信息来定位京东加载商品评论信息的JS页面,然后从中提取出想要的商品评论信息并存入MySQL数据库. 1.分析网页信息 本文在进行各项操作时同样以小米 ...

  4. C# 根据身份证号码获取人员性别和出生年月

    C# 根据身份证号码获取人员性别和出生年月 //处理18位的身份证号码从号码中得到生日和性别代码if (identityCard.Length == 18){birthday = identityCa ...

  5. 转java通过身份证号码获取出生日期、性别、年龄

    转自:https://blog.csdn.net/u011199063/article/details/79564587 身份证号码: 15位:6位地址码+6位出生年月日(900101代表1990年1 ...

  6. java通过身份证号码获取出生日期、性别、年龄

    身份证号码: 15位:6位地址码+6位出生年月日(900101代表1990年1月1日出生)+3位顺序码 18位:6位地址码+8位出生年月日(19900101代表1990年1月1日出生)+3位顺序码+1 ...

  7. PHP根据身份证号码找出出生年月和判断男女

    $card//身份证号码 //找出出生年月$brithday = substr($card,6,4)."-".substr($card,10,2)."-".su ...

  8. JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别

    目录 1.JS身份证号码校验 2.JS根据身份证号码获取出生年月日 3.JS根据出生年月日获取年龄 4.JS根据身份证号码获取性别 1.JS身份证号码校验 /*** 身份证校验** @export* ...

  9. PHP根据身份证号码获取户口所在地

    最近需要人员信息的户口所在地还必须保持一致,但是之前没有让用户输入因此根据网上的一些方法自己整理了一个方法分享给大家: /** 根据身份证号码获取出身地址* author:阿剂* @param str ...

最新文章

  1. 说说第三方支付接口开发及开发中遇到的坑爹问题
  2. 推荐一个ASP.NET的资源网站
  3. php str_replace 字符串替换
  4. 用来表示python代码块的是什么_三分钟带你用简单的Python代码深入理解Python中的元类...
  5. java jpa 注解_Java : JPA相关以及常用注解
  6. 人工智障学习笔记——机器学习(3)决策树
  7. 泛泰A880S升级官方4.4.2 binx教程
  8. 【linux】Centos 初始安装后开启网络以及配置静态IP
  9. 笨办法学 Linux 引言
  10. HTML5 device access 设备访问
  11. linux确定字符行,linux小计,统计文件中包含指定字符串的行数
  12. SQLite学习笔记(二)--VC调用环境搭建
  13. C语言程序设计知识点总结归纳(全书)
  14. FPGA入门的必经之路(一)
  15. AtCoder题解集锦
  16. 二十一、常见股票和量化投资策略
  17. WEB端工程环境安装
  18. word中如何将所有一级标题统一格式(转载)
  19. 微信刷卡 sdk java_微信支付 Java SDK
  20. html手机分辨率选择,[HTML5]手机屏幕分辨率和浏览器分辨率

热门文章

  1. win10服务器文件夹在哪里找,recent文件夹在哪里找_recent文件夹怎么清理
  2. java 练习--java常用类 章节练习题及面试题
  3. win32,按钮处理鼠标滑过消息
  4. linux virtual machine扩大硬盘,如何增加虚拟机的硬盘大小?
  5. Android开发蓝牙和震动器操作
  6. ns2仿真学习(六)-自定义协议
  7. JavaScript基础--变量、运算符
  8. js 实现rgb和十六进制的代码转化
  9. MacDown的下载以及简单教程使用
  10. 2021年全球与中国飞机轮胎行业市场规模现状及企业市场份额分析