网易云音乐爬虫(三)

在处理反爬虫的问题上,有几个比较常见而且又不怎么好处理的反爬虫措施:

  • IP封禁
  • 账号封禁
  • 验证码

本章针对这三点谈谈我的看法。

IP封禁

要解决IP封禁的问题,代理IP必不可少,但目前免费的代理IP普遍效果很差,通常我们都会花钱走付费代理。崔庆才的这篇文章对十大付费代理做了对比测试,可以供大家参考选择:

https://cuiqingcai.com/5094.html

最早我是在某平台每天调取一批代理IP,维护一个代理池。但渐渐发现即使是付费买的那些IP效果也不怎么样,而且能用于HTTPS的代理很少。后面我用的是阿布云,效果确实不错,通常用的动态版,每个请求一个随机IP,请求成功率还不错,响应速度也不慢,但问题是对个人用户来说有点贵了,而且有并发限制,然后HTTP隧道导致我们无法自由地控制IP切换。这次的网易云音乐爬虫,IP很容易被封,本来是考虑像往常一样用阿布云的,但又想追求高并发,因此最后选择用ADSL拨号服务器。这篇文章对这种方式有详细的讲解了,但有些内容与目前有点不符了:

https://cuiqingcai.com/4596.html

然后我补充几点自己在实践中遇到的一些情况:

目前网上提供动态VPS的平台不少,但有些用的不是ADSL拨号连接,而是通过VPN连接实现的,所以这种动态VPS的网卡IP其实是内网IP,别的机器无法连上它的代理服务,所以选择平台的时候要谨慎。

我选择的平台是云立方,首先需要进行拨号配置

/usr/sbin/pppoe-setup

按照提示依次输入拨号信息,配置完成之后执行 pppoe-start 即可连接,然后 pppoe-stop;pppoe-start 重新拨号更换IP。但我发现云立方有个别服务器是无法拨号连接成功的,应该是缺少网卡的问题,但还好有更换服务器的机会。这里推荐南京地区的服务器,效果还不错。

我的代理方案是:选一台拨号服务器,这里记为a,还需要一台服务器,记为b,用来获取拨号服务器的IP,并存进redis数据库。在重新拨号之前,a先向b发送一次请求,通知b先删除redis数据库中的代理IP,然后a再进行重新拨号,这是为了防止a在重新拨号的时候,爬虫还会从redis中取出上一个代理IP使用。重新拨号之后,a再向b发送一次请求,b获取到a当前的IP,先测试代理IP是否可用,可用就存进redis数据库。但是有一点要注意,在a重新拨号的时候,由于redis的key为空,因此会有一小段时间的空档期,这段时间爬虫可以选择不使用代理,或者等待,又或者再加一台拨号服务器,多台拨号服务器可以轮流重新拨号,那么爬虫也可以从多个IP中选择使用。

代理服务我用的是squid,scrapy爬虫与squid的TCP连接是长连接,连接数是scrapy的下载器并发数,当连接在一段时间的空闲后,会由squid服务器发起断开连接。但有一点要注意,在连上代理的时候,如果突然重新拨号,那么爬虫服务器与上一个IP的squid服务的TCP连接就不会断开,而是保持连接状态。这样会导致TCP连接持续增多,所以最好在重新拨号之前重启squid服务。本来我考虑过缩短连接断开的空闲时间。但在squid的配置中却没找到这个配置项。

我的代理程序已上传Github,仅供参考:https://github.com/supervipcard/adsl_proxy

账号封禁

账号封禁比IP封禁应该是更加棘手的,因为要解决账号封禁无非就是上多账号,但多账号不像代理IP那样好弄到。这里提供一个平台——易码,该平台提供大量手机号,能够自动收发短信验证码,供我们批量注册账号。我试了下微博的账号注册,还挺好用。先获取手机号,发送或接受短信来注册账号,然后模拟登陆获取Cookie并保存下来,只是手机号需要释放,所以Cookie失效之后这个账号就用不了了,但影响不大。另外,该平台似乎不支持腾讯和阿里的业务。

刚好这几天在爬天眼查,公司提供了不少账号,于是我维护了一个Cookie池,从Cookie池中轮流取不同账号的Cookie进行请求,不过还是不得不做一下限速,不得不说,天眼查的账号封禁力度挺大的,如果上易码可能会花不少成本。我用Mysql数据库存放这些账号信息和Cookie,如果Cookie失效,则重新模拟登陆,更新数据库中的Cookie。如果有账号跳验证码,则接入打码平台。

验证码

处理验证码通常有两种方式:一种是用深度学习技术训练识别验证码的模型,另一种是直接接入打码平台。在实际开发中,方式选择应当视情况而定。如果预算足够,接入打码自然省事,不然,就训练模型,只不过需要大量的真实样本,而标注样本需要不少时间,而且如果对方平台更换了验证码,就得重新标注并训练。不过如果有足够的标注人员,就另当别论了。如果遇到数字字母验证码,用普通的CNN网络就可以轻松解决。其实针对不同样式的数字字母验证码,可以训练一个通用的识别模型,之前我尝试用VGGNet进行训练,但无奈机器显卡不够用,样本也少,所以暂时搁浅了。如果遇到点选类型的验证码,目标检测模型YOLO v3适用。使用tiny版本,大概标注1000左右的样本就能取得不错的定位效果,只是后面识别中文需要花不少时间做标注,当然,也可以试试阿里,百度这些平台的中文识别API。

如果考虑接入打码平台的话。这里推荐的打码平台是超级鹰,价格合适,能够满足各种类型的验证码。

另外顺带提一下下图这种手势验证码:

针对这种验证码,如果用深度学习的方法解决,我的想法是:把头尾,还有中间几个转折点标出来,用YOLO v3训练,估摸着可行,之后有时间可以玩玩。

0

评论