升级了最新版的浏览器后发现之前写的代码好像是出问题了、思考再三觉得可能是被检测WebDriver了、网上找了一些文章、最终这个有点效果、但是还是有问题,贴出来大家参考下
一、使用pyppeteer过WebDriver检测
最主要的是添加下面的代码
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }')
下面的是完整的代码,可以检测是否成功
import asyncio
from pyppeteer import launch
# 测试检测webdriver
async def main():
browser = await launch(headless=False, args=['--disable-infobars'])
page = await browser.newPage()
# 下面的主要是为了伪装下,很多会进行屏蔽
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }')
# 上面的主要是为了伪装下,很多会进行屏蔽
await page.setUserAgent("Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)")
await page.setViewport(viewport={'width': 1920, 'height': 1080})
await page.goto('https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html')
print(await page.content())
await asyncio.sleep(25)
await browser.close()
# asyncio.get_event_loop().run_until_complete(main())
if __name__ == "__main__":
asyncio.run(main())
运行后的结果
仅供参考吧
二、补充知识:
1、chrome检测地址
这是chrome的真正检测网址: https://bot.sannysoft.com
为什么要强调绕过webdriver属性检测?
有些网址通过webdriver检测使得Selenium无法获取元素、无法控制按钮等情况
2、selenium 浏览器启动参数
不同机器不同电脑不同情况需要设置的参数完全不同。
参数设置: chrome_options = Options()
option = webdriver.ChromeOptions() 老版本,已弃用
经典参数
参数名称 | 作用 |
---|---|
options.add_argument(‘window-size=1920x3000’) | 指定浏览器分辨率 |
chrome_options.add_argument(‘–disable-gpu’) | 不启用 GPU 谷歌文档提到需要加上这个属性来规避bug |
options.add_argument(‘–hide-scrollbars’) | 隐藏滚动条, 应对一些特殊页面 |
options.add_argument(‘blink-settings=imagesEnabled=false’) | 不加载图片, 提升速度 |
options.add_argument(‘–headless’) | 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 |
options.add_argument(‘–no-sandbox’) | 以最高权限运行 |
option.add_argument(“–disable-javascript”) | 禁用JavaScript |
options.add_experimental_option(‘excludeSwitches’, [‘enable-automation’]) | 设置开发者模式启动,该模式下webdriver属性为正常值 |
指定浏览器位置
options.binary_location = r" "
加请求头
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) /ppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36')
常见的检测是根据window.navigator.webdriver属性是否为True来判断的、如果谷歌浏览器是79版本以前的、可以通过启用开发者模式来规避这个检测
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
options = ChromeOptions()
options.add_experimental_option('excludeSwitches',[''enable-automation])
driver = Chrome(options = options,excuteable_path='')
如果是79版本以后,chrome修复了开发者模式下window.navigator.webdriver未定义的问题,所以需要覆盖掉webdriver为True的属性
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option('useAutomationnExtension',False)
chrome_options.add_argument("disable-blink-features")
chrome_options.add_argument("disable-blink-features=AutomationControlled")
driver = webdriver.Chrome()
driver.get("https://bot.sannysoft.com/")
四、亲测可用
用 selenium 有很多种被别的平台侦测出的办法,所以,这一篇讲讲述,如何隐藏 selenium 的各种特性。有些网址通过 webdriver 检测使得 Selenium 无法获取元素、无法控制按钮等情况
普通的浏览器打开是这样子的
webdriver打开是这样子的
附相应的代码
from selenium import webdriver
class WebDriverChrome(object):
def __init__(self):
self.driver = self.StartWebdriver()
def StartWebdriver(self):
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
return driver
def RunStart(self):
self.driver.get('https://bot.sannysoft.com')
# time.sleep(10)
# self.driver.quit()
if __name__ == '__main__':
Crawl = WebDriverChrome()
Crawl.RunStart()
通过Js注入真正绕过webdriver的检测属性
from selenium import webdriver
class WebDriverChrome(object):
def __init__(self):
self.driver = self.StartWebdriver()
def StartWebdriver(self):
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
with open('./stealth.min.js') as f:
js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
return driver
def RunStart(self):
self.driver.get('https://bot.sannysoft.com')
# time.sleep(10)
# self.driver.quit()
if __name__ == '__main__':
Crawl = WebDriverChrome()
Crawl.RunStart()
stealth.min.js 生成 (需要安装node.js)
npx extract-stealth-evasions
# 就会在你执行命令的文件夹下面生成一个 stealth.min.js 文件
除了使用 js 注入之外, chrome 还提供很多参数,来隐藏,来达到相同的效果,具体可以参考: 三、修改检测参数
测试没问题