在Pyppeteer中正确隐藏window.navigator.webdriver

在我之前的一篇文章:一日一技:如何正确移除Selenium中window.navigator.webdriver的值,我讲到了如何在Selenium启动的Chrome中,经过设置启动参数隐藏window.navigator.webdriver,驳斥了网上垃圾文章中流传的使用JavaScript注入的弊端。python

因为Selenium启动的Chrome中,有几十个特征能够被识别,因此在爬虫界已经没有之前那么受欢迎了。模拟浏览器的新秀Puppeteer异军突起,逐渐受到了爬虫界的关注。Puppeteer须要使用JavaScript来控制,若是你是用Python,那么就须要使用Pyppeteer.web

若是你使用模拟浏览器爬淘宝,你会发现,不管怎么修改参数,Selenium老是能够马上被识别。可是若是你使用了本文的方法,用Pyppeteer抓取淘宝,你就会发现另一个广阔的天地。浏览器

今天,咱们来说讲如何在Pyppeteer中隐藏window.navigator.webdriverapp

首先,咱们使用下面的代码,经过Pyppeteer打开浏览器窗口:less

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(executablePath='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
                           headless=False)
    page = await browser.newPage()
    await page.goto('http://exercise.kingname.info')
    input('测试完成之后回到这里按下回车...')
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
复制代码

代码运行之后,会打开Chrome浏览器,并访问http://exercise.kingname.info/(这是我写的爬虫练习网站,你们能够用这个网站练习爬虫开发,里面有几道题挺难^_^)async

在这个浏览器中,咱们打开开发者工具,查询window.navigator.webdriver会发现它的值为true。以下图所示:工具

网上的代码,无外乎注入JavaScript,在网页自带的JavaScript加载以前,提早运行一段JavaScript,修改查询window.navigator.webdriver的接口。oop

这种方式每开一个新页面都要执行一次,繁琐,愚蠢!测试

那么正确的办法是什么呢?网站

我写这篇文章的时候(2019-08-15),Pyppeteer的最新版本为0.0.25,以下图所示:

此时,你能够在PyCharm中,按住Command键(Windows、Linux用户按住Ctrl键),鼠标左键点击from pyppeteer import launch中的launch,自动跳转到Pyppeteer源代码中的launcher.py文件。

把代码往上翻,在第60行左右,找到以下图方框框住的代码:

--enable-automation这一行注释掉。此时PyCharm会提示你是否修改源代码,选择OK。以下图所示。

修改完成之后的代码以下图所示:

以上就是你须要作的所有修改。

从新运行刚才的代码,你会发现,window.navigator.webdriver已是undefined了。以下图所示。

在Pyppeteer即将发布的0.0.26版本的功能里面,我看到了以下图方框框住的一项:

因此,等0.0.26版本发布之后,咱们就能够直接经过传递参数来禁用--enable-automation了,再也不须要修改源代码了。

题外话:官方文档和源代码是你的好朋友,若是官方文档找不到你想要的功能,源代码又看不懂,那么就来关注个人公众号吧。长按下面的二维码关注我:

相关文章
相关标签/搜索