失信人信息爬虫项目
1. 需求
- 1.1 抓取百度失信人名单
- 1.2 抓取最高人民法院失信人名单
- 1.3 抓取企业信用信息公示系统失信人公告
- 1.4 把上面三个来源的失信人信息进行合并,去重
- 对于个人:
- 根据失信人证件号码, 检查一下, 如果不存在才插入.
- 对于企业/组织:
- 区域 和 企业名称进行检查, 如果有就重复了, 没有才插入.
- 对于个人:
2. 开发环境
- 开发语言: Python3
- 技术选择:
- 爬虫框架: 使用
scrapy
框架, - 数据解析: json, re(正则表达式)
- 存储使用:
mysql
- js反爬处理:
js2py
- 爬虫框架: 使用
3 抓取百度失信人名单
3.1. 实现步骤:
- 创建爬虫项目
- 根据需求, 定义数据数据模型
- 实现百度失信名单爬虫
- 保存失信名单信息
- 实现随机User-Agent和代理IP下载器中间件, 解决IP反爬.
3.2 创建爬虫项目
scrapy startproject dishonest
3.3. 根据需求, 定义数据模型
3.4 实现百度失信名单爬虫
-
3.4.1 分析网站, 确定URL/URL列表
-
URL:https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?resource_id=6899&query=失信人&pn=10&rn=10&ie=utf-8&oe=utf-8
-
请求方法: GET
-
参数/data:
- resource_id=6899 资源id, 固定
- query=失信人: 关键字, 固定
- pn=10 索引号
- rn=10 固定是10
- ie=utf-8&oe=utf-8: 用于指定编码, 固定
-
请求头
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', 'Referer': 'https://www.baidu.com/s?ie=UTF-8&wd=%E5%A4%B1%E4%BF%A1%E4%BA%BA' }
-
返回数据的格式: json
-
如何实现翻页:
- dispNum: 100000 总的数据条数
- listNum: 2000 总页数
- resNum: 50 每页数据条数
-
-
3.4.2. 实现爬虫
- 设置默认请求头, 在
settings.py
文件中 - 创建爬虫
scrapy genspider baidu baidu.com
- 完善爬虫:
- 起始URL
- 生成所有页面的请求
- 解析页面, 提取需要的数据
- 设置默认请求头, 在
3.5. 保存失信名单信息
- 创建数据库, 创建表
- 在settings中配置数据库信息
- 实现管道类
- 在open_spider中, 建立数据库连接, 获取操作的数据的cursor
- 在close_spider中, 关闭cursor,关闭数据库连接
- 在process_item中, 如果数据不存在, 保存数据;
- 在settings.py中开启 管道
3.6. 实现随机User-Agent和代理IP下载器中间件, 解决IP反爬.
- 实现随机User-Agent下载器中间
- 实现代理IP下载器中间件
- 在settings.py中开启, 并配置重试次数
4. 实现抓取最高人民法院失信人名单爬虫
-
4.1 分析页面, 确定URL
-
URL:http://jszx.court.gov.cn/api/front/getPublishInfoPageList
-
请求方法: POST
-
请求数据:
- “pageSize”: 10, 一页多少条数据
- “pageNo”: 2, 当前页号
-
请求头:
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36', }
-
响应的数据格式:
- json格式的字符串
-
如何实现翻页:
- “pageCount”:2360
-
-
4.2 创建爬虫
-
4.3. 完善爬虫
- 构建起始URL
- 获取总页数, 构建所有页面请求
- 解析页面数据
-
4.4 完善管道, 实现数据去重
- 分析: 百度18位证件号的格式:
- 把18位证件号的倒数第7到倒数第4位(不包含), 三个数字使用了
****
替换掉了
- 把18位证件号的倒数第7到倒数第4位(不包含), 三个数字使用了
- 处理: 如果证件号是18位, 那么就倒数第7到倒数第4位(不包含), 三个数字使用了
****
替换掉
- 分析: 百度18位证件号的格式:
5. 国家企业信用公示系统爬虫
5.1 分析,测试: 确定失信企业信息的请求
- 确定获取数据的URL
- 请求的URL: http://www.gsxt.gov.cn/affiche-query-area-info-paperall.html?noticeType=21&areaid=100000¬iceTitle=®Org=110000
- 请求方法:POST
- 请求参数:
- noticeType: 21: 通知类型, 固定值
- areaid: 100000 固定值
- noticeTitle: 搜索公告标题, 可以为空
- regOrg: 110000 省份ID
- 请求体数据:
- draw: 4 点击分页按钮的次数
- start: 0 数据的开始索引
- length: 10 每页多少条数据
- 返回数据格式:
- json格式的字符串
- 测试数据的请求
- 请求参数:
- 请求体数据:
- start: 起始索引号
- length: 10 每页多少条数据
- 请求头:
- User-Agent
- Cookie
- 每一个Cookie信息, 都绑定了一个User-Agent和IP地址
- 解决传递cookie问题
- 确定必须传递的cookie:
- __jsluid:
- SECTOKEN
- __jsl_clearance
- 确定cookie来源:
- __jsluid: 第一次请求服务器(521), 服务器设置的
- SECTOKEN, JSESSIONID 第二次请求服务器, 服务器设置的
- __jsl_clearance: 通过js生成的
- 总结:
- 获取requests中,发送请求session对象
- 给index_url发送请求
- 解析js, 生成需要cookie信息:
- 提取响应中js
- 把
{eval(
替换为{code=(
- 获取js2py中的js执行环境
- 执行替换后的js, 从js执行环境中, 获取code变量中的js
- 从上面的js中提取出来生成cookie的js
- 把document相关代码替换为
r"var \1='http://www.gsxt.gov.cn'"
- 执行替换后的代码, 生成cookie信息.
- 把该cookie信息, 设置给session的cookie, 再次发送请求, 获取其他cookie信息
- 后面就可以使用这个cookie信息发送公告信息的请求了.
- 确定必须传递的cookie:
5.2 创建爬虫, 完善爬虫
-
创建爬虫
-
修改原来的随机User-Agent, 和随机代理的下载器中间件类, 如果是
公示系统
爬虫直接跳过. -
实现专门用于处理
公示系统
爬虫cookie的中间件- 实现生成cookie的脚本
- 创建
gen_gsxt_cookies.py
文件, 在其中创建GenGsxtCookie
的类 - 实现一个方法, 用于把一套代理IP, User-Agent, Cookie绑定在一起的信息放到Redis的list中
- 实现一个run方法, 用于开启多个异步来执行这个方法.
- 创建
- 实现公示系统中间类
- 实现process_request方法, 从Redis中随机取出Cookie来使用; 设置给request对象
- 实现process_response方法, 如果响应码不是200 或 没有内容重试
- 在setting.py文件件中配置
- 注意; 这个配置信息一定要靠前, 可以设置为10.
- 实现生成cookie的脚本
-
5.2.4 完善爬虫
-
解析页面中的城市名称和id, 构建公告信息的请求
-
解析失信企业公告信息
-
在下载中间件中设置不要重定向
# 设置不要重定向 request.meta['dont_redirect'] = True
(说明:后面会把文档和代码放到网盘,自取即可。下面是我的个人公众号,平时分享一些心得吧,大家有兴趣可以关注一下。后台回复关键词【爬虫】)
-