Selenium 最強反反爬方案來了!

在前天的公衆號文章《別去送死了。Selenium 與 Puppeteer 能被網站探測的幾十個特徵》中,咱們提到目前網上的反檢測方法幾乎都是掩耳盜鈴,由於模擬瀏覽器有幾十個特徵能夠被檢測,僅僅隱藏 webdriver 這一個值是沒有任何意義的。
html

今天咱們就來講說應該如何正確解決這個問題node

咱們首先給出解決方案,而後再說明這個解決方案,我是經過什麼方式找到的web

解決這個問題的關鍵,就是一個 js 文件,叫作stealth.min.js,稍後我會說明如何生成這個文件chrome

咱們須要設定,讓 Selenium 或者 Pyppeteer 在打開任何頁面以前,先運行這個 Js 文件json

這裏,我以 Selenium 爲例來講明如何操做,咱們編寫以下代碼:瀏覽器

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('./chromedriver', options=chrome_options)

with open('/Users/kingname/test_pyppeteer/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')

# 你能夠保存源代碼爲 html 再雙擊打開,查看完整結果
source = driver.page_source
with open('result.html''w'as f:
    f.write(source)

運行截圖以下:微信

能夠看到,雖然我使用的是無頭模式,可是可以被識別的特徵都被成功隱藏。你們還能夠雙擊打開保存下來的 html 文件,看看是否是結果跟普通瀏覽器幾乎同樣。app

若是你使用的是 Pyppeteer,那麼能夠根據我上面文章中給出的方法,試着加載一下這個 js 文件,看看是否是也能成功隱藏特徵。less

那麼,這個stealth.min.js文件是怎麼來的呢?這就要說到puppeteer了。咱們知道,Python 版本的pyppeteer已經好久沒有人維護了,可是Node.js 版本的 puppeteer持續有人維護,而且在持續更新,生態也愈來愈好。編輯器

有開發者給 puppeteer 寫了一套插件,叫作puppeteer-extra。其中,就有一個插件叫作puppeteer-extra-plugin-stealth[1]。這個東西,就來專門用來讓 puppeteer 隱藏模擬瀏覽器的指紋特徵。

這個東西是專門給 puppeteer 用的。因此,若是你使用的是 puppeteer,那麼你能夠根據它的 Readme說明,直接使用。

那麼,咱們用 Python 的人怎麼辦呢?實際上也有辦法。就是把其中的隱藏特徵的腳本提取出來,作成一個單獨的 js 文件。而後讓 Selenium 或者 Pyppeteer 在打開任意網頁以前,先運行一下這個 js 文件裏面的內容。

puppeteer-extra-plugin-stealth的做者還寫了另一個工具,叫作extract-stealth-evasions[2]。這個東西就是用來生成stealth.min.js文件的。

若是你在國外,而且網速足夠快的話。那麼你根據它的 Readme,首先安裝 Node.js,而後安裝 Npm,接着運行以下命令:

npx extract-stealth-evasions

就會在你執行命令的文件夾下面生成一個stealth.min.js文件。而後你就能夠正常使用了。

若是你在國內,那麼執行這個命令的過程當中,會有一個下載 Chromium 的過程,速度很是慢,雖然只有130MB,可是可能會下載好幾個小時。

此時,你須要把它的package.jsonindex.js兩個文件保存到本地。而後打開package.json文件,修改其中的dependencies這一項,把裏面的puppeteer改爲puppeteer-core,以下圖所示:

而後修改index.js,給.launch()函數增長一個參數executablePath,指向你電腦上的 Chrome 瀏覽器,以下圖所示:

修改完成之後。首先執行yarn install安裝依賴包。而後執行node index.js運行程序。1秒鐘之後就會生成stealth.min.js了。

我已經將這個文件上傳到公衆號後臺,回覆關鍵字 stealth 便可獲取!

若是你以爲文章還不錯,請你們 點贊、分享、留言 下,由於這將是我持續輸出更多優質文章的最強動力!



推薦閱讀


Python 爬蟲,推薦一款簡單的抓包工具

帶你用 Python 實現自動化羣控(入門篇)

別去送死了!爬蟲使用 Selenium 與 Puppeteer 能被網站探測的幾十個特徵



本文分享自微信公衆號 - AirPython(AirPython)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索