在上一篇文章: 从cookie池搭建说起,简单说明了自己对于该网站的想法,在经过两天的测试与研究之后,我有了更多的想法.
你作为一个普通用户,如果对方网站检测到你不停地变换IP从不同地方来发送请求,那他肯定会有识别.那么我们可以把每一个Cookies分配唯一的IP代理,也就是你这个Cookies发送请求的代理始终是唯一的.
但是这种方法的实现方式还没有想出来,不知道该使用哪些技术栈来实现这个想法
好,既然你弹出验证码,那我就解决它! 解决方法是:
base64
,用python
转一下,接上第三方就OKtoken
参数,经过前端大佬的断点调试,发现是对多个字段的两次加密requests
的session
来完成这一步操作,但是很难完全模拟,因为整个爬虫使用scrapy
来写,处理验证码使用requests
来做,session
这部分不大好模拟.附上一些为session
添加信息的代码
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
中添加cookies
和start_urls
,然后对这些start_urls
不停地重试,对,就是不停地重试,直到把所有的链接跑完.本次需要采集的链接并不多,质量要求不高,只需要我采集到数据就好.
需要注意的是:
dont_filter=True
,不然去重会影响爬取添加cookies
和start_urls
代码
# 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