案例:雪球网 返回的就是403403 Forbidden. Your IP Address:xxx.xxx.xxx.xxx.但是当我们这样写:
返回的就是200< !DOCTYPE html><html …
案例:蚂蜂窝 以前因为旅游的需求,所以想到了去抓一点游记来找找哪些地方好玩,于是去了蚂蜂窝网站找游记,一篇一篇的看真的很慢,想到不如把所有文章抓过来然后统计每个词 出现的频率最高,统计出最热的一些旅游景点,就写了一个scrapy爬虫抓游记,当修改了headers后开始爬取,发现访问过快服务器就会断开掉我的连接, 然后过一段时间(几个小时)才能继续爬。于是放慢速度抓就发现不会再被BAN了。
案例:前程无忧网随便打开一个前程无忧工作界面,直接用requests.get对其进行访问,可以得到一页的20个左右数据,显然得到的不全, 而用webdriver访问同样的页面可以得到50个完整的工作信息。
7.加速乐:有些网站使用了加速乐的服务,在访问之前先判断客户端的cookie正不正确。如果不正确,返回521状态码,set-cookie并且返回一段js代码 通过浏览器执行后又可以生成一个cookie,只有这两个cookie一起发送给服务器,才会返回正确的网页内容。
解决办法:将浏览器返回的js代码放在一个字符串中,然后利用nodejs对这段代码进行反压缩,然后对局部的信息进行解密,得到关键信息放入下一次访问请求的头部中。
案例:加速乐
这样的一个交互过程仅仅用python的requests库是解决不了的,经过查阅资料,有两种解决办法: 第一种将返回的set-cookie获取到之后再通过脚本执行返回的eval加密的js代码,将代码中生成的cookie与之前set-cookie联合发送给服务器就可以返回正确的内容, 即状态码从521变成了200。直接通过这一段就可以获取返回的一段经过压缩和加密处理的js代码类似于这种:所以我们需要对代码进行处理,让其格式化输出,操作之后如下:
这里我们就需要对这段JS做下修改,假设我们先把这段JS代码存在了string sHtmlJs这个字符串变量里,我们需要把eval这里执行的结果提取出来,把eval替换成 return, 然后把整个代码放到一个JS函数里,方式如下:解密后的代码如下:
通过观察代码发现了一段:
显而易见,这个dc就是我们想要的cookie,执行JS,让函数返回DC就OK了。我还发现了其中有一段
当服务器发现浏览器的头部是_phantom或者__phantommas就让浏览器进行死循环,即阻止用selenium操控phantomjs来访问网页。 至此两端加速乐cookie如下:这个破解方法很麻烦不建议用,所以我想出了第二种方法 第二种办法就是通过selenium的webdriver模块控制浏览器自动访问网页然后输出浏览器头部信息中的cookie,封装在一个字典中, 将其通过requests中的jar模块转换成cookiejar放入下一次访问的request中就可以持续访问, 因为cookie的时效大约一个小时左右。以下是处理自动生成一个新的有效cookie的代码:
切记,放在requests中访问的headers信息一定要和你操控的浏览器headers信息一致,因为服务器端也会检查cookies与headers信息是否一致 最厉害的武功是融会贯通,那么最厉害的反爬策略也就是组合目前有的各种反爬手段,当然也不是无法破解,这就需要我们对各个反爬技术及原理都很清楚, 梳理清楚服务器的反爬逻辑,然后再见招拆招,就可以让我们的爬虫无孔不入。
8、转换成图片 最恶心最恶心的反爬虫,把页面全部转换成图片,你抓取到的内容全部隐藏在图片里。想提取内容,休想。 解决办法:图像识别吧,但是感觉代价很大。。。