央行征信爬虫解决方案

2,421 阅读3分钟

笔者所在公司是一家互联网金融公司,其中最大的一块业务就是贷款。当一个用户向我们申请贷款时,我们需要用户授权获取用户的征信数据,然后将数据交给风控规则引擎生成一份数据报告,凭借这份数据报告来判断是否可以给这个用户放贷。

其中获取用户征信数据这一步就是用爬虫来实现的。爬虫的应用领域非常广泛,技术手段也是五花八门。本文主要以央行征信报告为爬取目标,讲解三种爬虫的技术解决方案。

方案一:基于接口的爬虫

技术栈:

  • nodejs
  • request
  • cheerio

优点:

  • 流程简单
  • 支持并行爬取
  • 响应速度快
  • 对环境没有特殊要求

缺点:

  • 需要手动维护用户cookie
  • 方案不可用

补充:

这个方案其实本来是最佳方案。但后来央行征信改版,登录页密码框改用ActiveX控件来加密用户密码。纯接口的方式无法通过央行征信的登录验证,所以该方案现在已经不可用了。

方案二:基于浏览器的爬虫

技术栈:

  • nodejs
  • selenium
  • winio
  • jquery

优点:

  • 可通过央行征信的登录验证
  • 不需要维护用户cookie

缺点:

  • 依赖IE浏览器环境
  • 响应速度慢
  • 不支持并行爬取
  • 驱动级键盘输入不稳定

补充:

由于ActiveX控件只能在IE浏览器中才能加载,所以爬虫程序必须部署在windows机器上,也就是图中的worker机。另外,ActiveX控件的密码无法通过代码直接复制,必须依赖驱动级键盘输入来输入用户密码。

方案三:基于浏览器+接口的爬虫

技术栈:

  • nodejs
  • selenium
  • winio
  • request
  • cheerio

优点:

  • 可通过央行征信的登录验证
  • 响应速度快
  • 支持并行爬取

缺点:

  • 依赖IE浏览器环境
  • 驱动级键盘输入不稳定
  • 需要部署多台worker机
  • 流程复杂
  • 需要手动维护用户cookie

补充:

该方案其实是结合了方案一和方案二的优点。worker机用来加载ActiveX控件,输入用户密码,获取加密后密码后返回给爬虫服务端。剩下的流程就都和方案一相同。

代理优化

央行征信有反爬机制,如果同一个IP登录了很多个用户,这个IP就有可能被封。所以爬虫程序需要加代理IP来提升稳定性和成功率。这个问题其实挺好解决的,花钱买一个代理IP服务就好了。

但是代理IP服务商的质量参差不齐,服务好的价格贵,便宜的又不稳定。如果你像笔者一样,只能申请到像太阳代理这样的渣渣代理。那我这里给你提供一个思路,提升渣渣代理服务的稳定性。

写一个定时任务,每隔一段时间就获取一次IP,每次取n个。然后分别用这些个IP去请求央行征信的登录页,如果1秒内成功响应,就把这个IP存到IP池里,否则就丢弃。

通过定时任务维护一个高质量的IP池,可以极大地提升爬虫的稳定性和成功率。

其他

以上三种方案以及代理优化方案,都在笔者所在公司生产环境使用过。实际使用的技术栈和文中列举的有所出入。文中的技术栈是我事后总结觉得最佳的技术方案。今后我会抽时间重构方案三的代码,然后开源到github。