可能是全网唯一一个基于windows和java的关于selenium webDriver绕过网站反爬服务的方法

21 篇文章 0 订阅
7 篇文章 0 订阅

事情的起因是我需要用selenium的webDriver技术实现一些简单操作,一直用的是chrome和配套的webDriver(chrome的强大和轻量化真的是无敌的),但是突然有一天发现有些网站我用webDriver启动的浏览器是怎么也登录不进去(本来是用自动化登录的,现在人工登录都不行),于是开始在google上找答案,发现chrome和firfox默认的驱动都会被反爬服务识别出来:

webdriver.chrome.driver
webdriver.firefox.bin

IE就算了,调试查看标签的时候简直没法用,我就突然想到firefox不是还有一个驱动么,是三方的驱动:

webdriver.gecko.driver

那我用这个驱动试试会不会触发反爬吧,结果跟我预想的一样,可以登录,没有触发反爬机制,我那个高兴啊,高兴的劲儿还没持续多久,又碰到一个问题,之前用selenium里面的Actions类可以实现移动鼠标,拖拽,释放等动作,但是我用decko驱动的话就会报错,怎么办呢,接着查google呗,这个真的查了好一阵,发现了这个回复:

GeckoDrive不支持Actions,这下心可就凉了,绕了一圈,好不容易发现一条路,走了一段,发现是条死路。最后找到了一个关键字,爬虫和反爬虫,根据这个思路,用chromeDriver越过了爬虫机制,下面是实现方法。

 

 

现在绝大部分网站的反爬策略中都加入了webdriver检测,如果检测到了webdriver则无论如何也不让你过去,还有一种更绝,直接把你的ip封掉,你会发现你正常操作也无法访问网站了。

方法思路:基于mitmproxy代理,把请求中的webdriver隐藏掉即可。

 

 

第一步,你得装个mitmproxy,除了最新版,稍微老一点的版本有exe的安装文件,下载后直接安装即可,安装完后在安装目录的bin目录下有两个exe文件,mitmdump.exe和mitmweb.exe,这里我们主要使用mitmdump.exe

 

 

 

第二步,我们需要写一个隐藏webdriver字段的脚本,脚本文件用python编写(我的python版本是3.7.1貌似3.6也可以),脚本如下(感谢大神提供的脚本:https://zhuanlan.zhihu.com/p/43581988):

indject_js_proxy.py

from mitmproxy import ctx
injected_javascript = '''
// overwrite the `languages` property to use a custom getter
Object.defineProperty(navigator, "languages", {
  get: function() {
    return ["zh-CN","zh","zh-TW","en-US","en"];
  }
});

// Overwrite the `plugins` property to use a custom getter.
Object.defineProperty(navigator, 'plugins', {
  get: () => [1, 2, 3, 4, 5],
});

// Pass the Webdriver test
Object.defineProperty(navigator, 'webdriver', {
  get: () => false,
});


// Pass the Chrome Test.
// We can mock this in as much depth as we need for the test.
window.navigator.chrome = {
  runtime: {},
  // etc.
};

// Pass the Permissions Test.
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
  parameters.name === 'notifications' ?
    Promise.resolve({ state: Notification.permission }) :
    originalQuery(parameters)
);
'''

def response(flow):
    # Only process 200 responses of HTML content.
    if not flow.response.status_code == 200:
        return

    # Inject a script tag containing the JavaScript.
    html = flow.response.text
    html = html.replace('<head>', '<head><script>%s</script>' % injected_javascript)
    flow.response.text = str(html)
    ctx.log.info('>>>> js代码插入成功 <<<<')

    # 只要url链接以target开头,则将网页内容替换为目前网址
    # target = 'https://target-url.com'
    # if flow.url.startswith(target):
    #     flow.response.text = flow.url

 

把脚本文件放在mitmproxy的bin目录下:

 在当前目录起一个cmd,启动mitmdump并注入脚本:

C:\user>mitmdump -s indject_js_proxy.py   

Loading script indject_js_proxy.py
Proxy server listening at http://*:8080

 启动成功mitmproxy会监听8080端口,下面只需要在代码中加入代理即可。

 

第三步,在selenium的webDriver中加入代理(Java版本):

 

System.setProperty("webdriver.chrome.driver","C:\\Users\\sh3\\AppData\\Local\\Google\\Chrome\\Application\\chromeDriver.exe");

ChromeOptions options = new ChromeOptions();
options.addArguments("--proxy-server=127.0.0.1:8080");

ChromeDriver driver = new ChromeDriver(options);

再次启动你的webDriber,在控制台下输入navigator.webdriver并回车,如果显示false,说明你已经成功了

 

还有一个测试网站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

如果webDriver是绿色,也说明代理起作用了:

 

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值