Fork me on GitHub

Cookies池的后续解决方案

这是崔斯特的第五十五篇原创文章

终于有方法了 (๑• . •๑)

作为一名罗吹,先吹一波C罗牛皮,简直太帅了了了

瞧瞧这个眼神
建议大家可以看看这场比赛,西班牙VS葡萄牙,我相信你会爱上足球的

正文开始

在上一篇文章: 简单说明了自己对于该网站的想法,在经过两天的测试与研究之后,我有了更多的想法.

想法一: 为每个Cookies绑定唯一IP

你作为一个普通用户,如果对方网站检测到你不停地变换IP从不同地方来发送请求,那他肯定会有识别.那么我们可以把每一个Cookies分配唯一的IP代理,也就是你这个Cookies发送请求的代理始终是唯一的.

但是这种方法的实现方式还没有想出来,不知道该使用哪些技术栈来实现这个想法

想法二: 解决验证码

好,既然你弹出验证码,那我就解决它! 解决方法是:

  1. 该网站的验证码图片是base64,用python转一下,接上第三方就OK
  2. 同时该网站参数中还带有token参数,经过前端大佬的断点调试,发现是对多个字段的两次加密
  3. 保持会话session.你需要让对方网站知道是你这个用户,所以你的cookies,ip,headers相关信息必须保持一致,我当时的想法是使用requestssession来完成这一步操作,但是很难完全模拟,因为整个爬虫使用scrapy来写,处理验证码使用requests来做,session这部分不大好模拟.

附上一些为session添加信息的代码

1
2
3
4
5
def __init__(self, my_cookie, proxy, headers):
self.session = requests.session()
self.session.cookies.update(my_cookie)
self.session.headers.update({'User-Agent': headers})
self.session.update(proxy)

想法三: 不解决验证问题,无脑重试

这是最蠢的办法,也是我目前在使用的方法. /(ㄒoㄒ)/~~

思路是: 将cookies保存到mongoDB做持久化,再写一个脚本,持续的向redis中添加cookiesstart_urls,然后对这些start_urls不停地重试,对,就是不停地重试,直到把所有的链接跑完.本次需要采集的链接并不多,质量要求不高,只需要我采集到数据就好.

需要注意的是:

  1. 需要为你的表增加唯一键,不然会有重复数据
  2. 每条请求添加dont_filter=True,不然去重会影响爬取

添加cookiesstart_urls代码

1
2
3
4
5
6
7
8
9
10
11
12
13
# add cookies and start_urls to local_redis
while True:
if local_redis.scard('spider:cookies') < 10:
for i in cookies_list:
local_redis.sadd('spider:cookies', i)
print("cookies Done")
if local_redis.scard('spider:start_urls') < 10:
for i in url_list:
local_redis.sadd('spider:start_urls', i)
print("start_urls Done")
time.sleep(10)

效果

我是用的是第三种方法,目前看来效果还行,数据已经爬取了大半,相信三天假过去了应该就没问题了.

如果以后要长期做这个项目的话,最好的办法应该还是第二种,从根本去解决问题.

本次做这个项目也收获颇多,对于cookies使用更加有经验;感觉最好玩的是token的加密与解密实现,对这方面感兴趣的可以了解下这个: zlib — Compression compatible with gzip