当前位置: 首页 > 科技观察

爬上去不烦吗?且看这位神级程序员是如何破解的!

时间:2023-03-20 12:14:12 科技观察

爬虫与反爬的交锋一直在进行中……为了更好的帮助爬行为和反爬,今天给大家介绍一下网页开发者常用的反爬方法。1.BANIP:网页运维人员通过日志分析发现某个IP最近访问量特别多,在一定时间内访问了无数网页,所以运维人员判断该访问行为不是正常行为。于是直接在服务器上封了人的IP。解决方法:这种方法极易误伤其他正常用户,因为某个地区的其他用户可能有相同的IP,导致正常用户访问服务器的次数变少,所以一般运维人员不会使用这种方法限制爬虫。但是面对大量的访问,服务器偶尔会把IP放入黑名单,过段时间放行,不过我们也可以通过分布式爬虫和购买代理IP来解决,但是爬虫成本增加了。2.BANUSERAGENT:很多爬虫请求头是一些明显的默认爬虫头比如python-requests/2.18.4等,当运维人员发现有此类头的数据包时,直接拒绝访问并返回403错误解决方法:直接r=requests.get(url,headers={'User-Agent':'Baiduspider'})将爬虫请求头伪装成百度爬虫或者其他浏览器头。案例:雪球网返回403403Forbidden。您的IP地址:xxx.xxx.xxx.xxx。但是当我们这样写的时候:返回是200标签中的js代码,将信息显示在浏览器中,而爬虫是不具备执行js代码能力的,所以js事件产生的信息是读不出来的。解决方案:通过解析提取脚本中的js代码,通过正则匹配提取信息内容,或者直接通过webdriver+phantomjs,用无头浏览器渲染网页。案例:51job.com随便打开一个51job的工作界面,直接用requests.get访问,一个页面可以获取到20条左右的数据,显然不完整,但是访问的时候可以获取到50条数据与webdriver相同的页面。完整的职位信息。6、Ajax异步传输:在访问网页时,服务器将网页帧返回给客户端,并在与客户端交互的过程中,通过异步ajax技术将数据包传输给客户端,并呈现在网页上。如果爬虫直接抓取信息,则为Empty解决方案:使用fiddler或wireshark抓包分析ajax请求的接口,然后构造一个访问服务器的请求,通过模拟服务器获取返回的真实数据包法律。案例:拉勾网打开拉勾网某职位招聘页面,可以看到很多招聘信息数据。点击下一页后,发现页面框架没有变化,url地址不变,招聘数据的每一项都发生了变化。我通过chrome开发者工具找到了一个叫https://www.lagou.com/zhaopin/Java/2/?filterOption=3的页面来抓包。我打开改过的页面,发现是第二页。真正的数据源可以通过伪造请求来抓取各个页面的数据。很多网页运营商将以上几种方式结合起来形成了一套反爬策略,就像之前遇到的复杂网络传输+加速音乐+cookie时效的反爬方法一样。7、Accelerated:有些网站使用Accelerated的服务,在访问前判断客户端的cookie是否正确。如果不正确,返回521状态码,set-cookie并返回一段js代码,浏览器执行后生成cookie。只有这两个cookie一起发送到服务器,才会返回正确的网页内容。解决方法:将浏览器返回的js代码放在一个字符串中,然后使用nodejs解压代码,然后对部分信息进行解密,得到关键信息,放在下次访问请求的header中。案例:AcceleratedMusic这样的交互流程,光靠python的requests库是解决不了的。查阅资料后,有两种解决方案:第一种是获取返回的set-cookie然后通过脚本加密的js代码执行返回的eval,将代码中生成的cookie和之前的set-cookie发送到服务端返回正确的内容,即状态码由521变为200。直接通过这一段,可以得到返回的压缩加密后的js代码,类似这样:所以我们需要对代码进行处理,让它格式化输出。运行后如下:这里我们需要对这个JS做下修改,假设我们先把这个JS代码存放在字符串变量stringsHtmlJs中,我们这里需要提取eval执行的结果,把eval换成return,然后把整个代码放到一个JS函数中。如下:解密后的代码如下:通过观察代码,发现了一段:很明显,这个dc就是我们要的cookie,执行JS,让函数返回dc就OK了。我还发现,当服务器发现浏览器的head是_phantom或者__phantommas时,会让浏览器进行死循环,也就是阻止使用selenium控制phantomjs访问网页。至此,两端的加速cookie如下:这种破解方式很麻烦,不推荐,于是想到了第二种方法。第二种方法是通过seleniumwebdriver模块控制浏览器自动访问网页,然后输出浏览器头部信息。cookie被封装在字典中,通过requests中的jar模块转成cookiejar,放入下次访问的request中,可以持续访问,因为cookie的时间限制在一个小时左右。下面是自动生成新的有效cookie的代码:记住,请求中访问的headers信息必须和你控制的浏览器的headers信息一致,因为服务器也会检查cookies和headers信息是否一致。最强大的武学就是精通,所以最强大的反攀登策略就是结合目前可用的各种反攀登手段。当然,破解也不是不可能。这就需要我们非常清楚各种反爬的技术和原理,并对服务器的反爬进行梳理。逻辑,然后看窍门,就可以让我们的爬虫无孔不入。谢谢阅读!