这几天接手了一个很急的项目,要在几天爬取某网站的数据。该站是我知道国内反爬比较严重的网站之一,我也做好了心理准备。
分析
该网站数据需要登录才能查看,APP抓包了但是没有发现相关数据,所以选择从PC站入手。
既然需要登录,那就需要验证一个新鲜的cookies可以访问多少链接;验证方法是:
直接拷贝已经登录该网站请求的Curl,转换为Python代码,加一个循环,测试,单个账号可以跑多少页
经过10多次测试,发现单个Cookies可以下载,至少50个网页。
那么就很好做了,可以开始写思路了。
思路
首先我们需要多个可以登录的Cookies,然后利用这些Cookies去下载网页;一旦返回状态码不是200,就拉黑该Cookies。
具体的方法看下图:
有几点说明下:如何模拟注册。有两种方法,模拟请求和浏览器模拟。模拟请求就是去分析注册过程中的每一步操作,这个请求是发送验证码的,那个是注册的,我优先推荐该方法,但是这种方法遇到一些携带有大量签名参数的变态网站时,难度较大,需要自己一步步断点JavaScript。浏览器模拟大家应该很熟悉,Python中就是selenium傻瓜操作,需要哪里点哪里。注意的坑是何时切换iframe
Cookies的搭建。其实非常简单,这里利用了redis的集合,取Cookies使用spop即可。这里并没有做验活,因为基本上Cookies产生之后就会被使用。
我要崩溃了
不做不知道,一做吓一跳。
但我以为该网站很简单,搭建一个简单的Cookies池就可以解决,但是我明显太年轻了。
我先把采集链接推到redis中,使用了scrapy_redis。
该网站的反爬:
代理问题。其实这里有一个悖论,到底该不该使用代理。首先,我不用代理,刚开始还好,但是很快我的本地代理就被拉黑了;那好上代理,但是接下来问题来了,开始出现一个个的验证码需要填了,作为一个单独的用户,我是不可能频繁的改变自己的IP去访问网站的,解决方法只有一个,Cookies和代理绑定,但是这种方法真的不好实现,尤其是使用Scrapy开发的爬虫。
验证码问题。既然出现了验证码,那就去解决它。验证码一般是和Cookies绑定的,那么我需要把访问该账号的IP、User-Agent、Cookies全部拿出来,再去发送新的请求,而且需要注意,此过程中不能再进行IP的变化。
最后
今天了大概两天的斗智斗勇,现在基本上可以爬到数据了,希望明天可以交差,不然端午就要加班了。
希望这只小猫咪可以给我带来好远。
想要了解更多,可以关注公众号: Python爬虫与算法进阶