在使用Selenium进行爬虫时,许多朋友都会遇到各种反爬措施。
实际上,在绝大多数情况下,网站轻而易举地能够检测出你正在使用WebDriver而非标准浏览器。
本文将详细介绍如何有效防止检测的方法。
在一篇公众号文章《别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征》中,我们知道目前网上的反检测方法几乎都是掩耳盗铃,因为模拟浏览器有几十个特征可以被检测,仅仅隐藏 webdriver 这一个值是没有任何意义的。
今天我们就来说说应该如何正确解决这个问题。我们首先给出解决方案。然后再说明这个解决方案,我是通过什么方式找到的。
解决这个问题的关键,就是一个 js 文件,叫做stealth.min.js。这个文件的获取有点复杂,具体可以搜索一下,这里不详细介绍。
我们需要设定,让 Selenium在打开任何页面之前,先运行这个 Js 文件。
就可以避免被检测到。
论证过程如下:
首先,我们直接在浏览器输入网址访问这个网站:
https://bot.sannysoft.com/
这些选项其实就是浏览器的特征
但我们如果使用selenium就会得到不一样的结果,如下:
代码:
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = Chrome(executable_path='./chromedriver', options=chrome_options)
driver.get('https://bot.sannysoft.com/')
driver.save_screenshot('screenshot.png')
结果如下:
下面我们加载这个js文件后再来访问这个网站,查看特征值:
代码:
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
driver = Chrome(executable_path='./chromedriver', options=chrome_options)
with open('./stealth.min.js') as f:
js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
driver.get('https://bot.sannysoft.com/')
time.sleep(5)
driver.save_screenshot('walkaround.png')
source = driver.page_source
with open('result.html', 'w') as f:
f.write(source)
结果:
我们可以发现结果与第一种情况一模一样
js文件获取方式,公众号编程启航回复selenium反检测