破解selenium封禁--去哪儿酒店爬虫

使用selenium遇到封禁

  • selenium是我用来破解一些js渲染比较多的页面的神器。但是最近,在抓取一些网站时,遇到了让人头皮发麻的事情,selenium出问题了,在测试去哪儿酒店时,遇到了加载不出数据的问题(如下图)
    数据一直刷在这里插入图片描述
  • 去哪儿会一直很努力的刷新数据,其实不然,它想必是已经发现了爬虫的真实身份,即使是使用Selenium调用ChromeDriver来打开网页,其还是与正常打开网页有区别的,有被识别的可能性。selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true(这段是在百度上借鉴的,我觉得自己的语言组织不好)。
  • 在用selenium时还会产生一些标识符webdriver, __driver_evaluate, __webdriver_evaluate, __selenium_evaluate, __fxdriver_evaluate, __driver_unwrapped, __webdriver_unwrapped, __selenium_unwrapped __fxdriver_unwrapped ,_Selenium_IDE_Recorder _selenium还有很多就不一一列举了。反爬就是通过这些标识符识别出爬虫,然后通过js给webdriver请求响应错误信息,那么让这个js go die,就是破解的方法。

破解selenium封禁

  • 通过baidu,google各种搜索,我找到了一种非常优秀的方法,那就是通过 mitmproxy 屏蔽掉识别 webdriver 标识符的 js 文件。
  • 我遇到的坑给大家也写上,尽量让大家少走弯路。首先要下载mitmproxy,可以用pip install mitmproy,如果报错的话,‘https://mitmproxy.org/’ 这个网站也可以下载。然后给本机设置代理ip 127.0.0.1端口8001(为了让所有流量走mitmproxy)。之后启动mitmproxy。
mitmdump -p 8001 # windows启动
mitmproxy -p 8001 # linux启动
  • 这个时候我遇到了问题,在输入网址后,出现了这个界面。*
    在这里插入图片描述
    这应该是证书的问题,在下载mitmproxy时,会产生一个.mitmproxy包
    在这里插入图片描述
    打开这个p12,一直下一步。直到如下图时,选择第二个(即受信任的根证书颁发机构),然后就完成了。
    在这里插入图片描述
    这个时候装备已经齐全了,是时候去打boss了
    我打开去哪儿酒店的页面,‘https://hotel.qunar.com/city/shanghai_city/#fromDate=2019-06-03&cityurl=shanghai_city&toDate=2019-06-04&from=qunarHotel’,使用chrome的开发者工具,找到目标网站是通过哪个js文件控制webdriver相应的(全局搜索特征标识符吧),我找到了如下js文件
    在这里插入图片描述
    在这一大串js中我还发现了,一串貌似是封禁指定词的js
    在这里插入图片描述
    冲锋的号角已经吹响,这个时候就是我们反击的时候,我开始写干扰脚本了 (DriverPass.py)。代码如下
import re
from mitmproxy import ctx

def response(flow):
    if '/js/index.' in flow.request.url:

        for webdriver_key in ['webdriver', '__driver_evaluate', '__webdriver_evaluate',"__webdriver_script_function","__webdriver_script_func", '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder',"__nightmare", '_selenium', 'calledSelenium',"callSelenium", '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_' ]:
            ctx.log.info('Remove "{}" from {}.'.format(
            webdriver_key, flow.request.url
            ))
        flow.response.text = flow.response.text.replace('"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"')
        flow.response.text = flow.response.text.replace('t.webdriver', 'false')
        # flow.response.text = flow.response.text.replace('driver', '')
        flow.response.text = flow.response.text.replace('selenium', 'false')

去哪儿之类的大厂变幻莫测,js要看一看对代码酌情修改,这时退出刚才的mitmproxy接口,使用下面的命令重新打开

mitmdump -s DriverPass.py -p 8001

此时,再使用selenium打开去哪儿就可以加载出数据了。如果有问题,欢迎指点,共同进步。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值