這篇文章主要介紹如何突破網(wǎng)站對selenium的屏蔽,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、奎屯網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為奎屯等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。使用selenium模擬瀏覽器進(jìn)行數(shù)據(jù)抓取無疑是當(dāng)下最通用的數(shù)據(jù)采集方案,它通吃各種數(shù)據(jù)加載方式,能夠繞過客戶JS加密,繞過爬蟲檢測,繞過簽名機(jī)制。它的應(yīng)用,使得許多網(wǎng)站的反采集策略形同虛設(shè)。由于selenium不會在HTTP請求數(shù)據(jù)中留下指紋,因此無法被網(wǎng)站直接識別和攔截。
這是不是就意味著selenium真的就無法被網(wǎng)站屏蔽了呢?非也。selenium在運行的時候會暴露出一些預(yù)定義的Javascript變量(特征字符串),例如"window.navigator.webdriver",在非selenium環(huán)境下其值為undefined,而在selenium環(huán)境下,其值為true(如下圖所示為selenium驅(qū)動下Chrome控制臺打印出的值)。
除此之外,還有一些其它的標(biāo)志性字符串(不同的瀏覽器可能會有所不同),常見的特征串如下所示:
webdriver
__driver_evaluate
__webdriver_evaluate
__selenium_evaluate
__fxdriver_evaluate
__driver_unwrapped
__webdriver_unwrapped
__selenium_unwrapped
__fxdriver_unwrapped
_Selenium_IDE_Recorder
_selenium
calledSelenium
_WEBDRIVER_ELEM_CACHE
ChromeDriverw
driver-evaluate
webdriver-evaluate
selenium-evaluate
webdriverCommand
webdriver-evaluate-response
__webdriverFunc
__webdriver_script_fn
__$webdriverAsyncExecutor
__lastWatirAlert
__lastWatirConfirm
__lastWatirPrompt
$chrome_asyncScriptInfo
$cdc_asdjflasutopfhvcZLmcfl_
了解了這個特點之后,就可以在瀏覽器客戶端JS中通過檢測這些特征串來判斷當(dāng)前是否使用了selenium,并將檢測結(jié)果附加到后續(xù)請求之中,這樣服務(wù)端就能識別并攔截后續(xù)的請求。
下面講一個具體的例子。
鯤之鵬的技術(shù)人員近期就發(fā)現(xiàn)了一個能夠有效檢測并屏蔽selenium的網(wǎng)站應(yīng)用:大眾點評網(wǎng)的驗證碼表單頁,如果是正常的瀏覽器操作,能夠有效的通過驗證,但如果是使用selenium就會被識別,即便驗證碼輸入正確,也會被提示“請求異常,拒絕操作”,無法通過驗證(如下圖所示)。
分析頁面源碼,可以找到 https://static.meituan.net/bs/yoda-static/file:file/d/js/yoda.e6e7c3988817eb17.js 這個JS文件,將代碼格式化后,搜索webdriver可以看到如下代碼:
可以看到它檢測了"webdriver", "__driver_evaluate", "__webdriver_evaluate"等等這些selenium的特征串。提交驗證碼的時候抓包可以看到一個_token參數(shù)(很長),selenium檢測結(jié)果應(yīng)該就包含在該參數(shù)里,服務(wù)端借以判斷“請求異常,拒絕操作”。
現(xiàn)在才進(jìn)入正題,如何突破網(wǎng)站的這種屏蔽呢?
我們已經(jīng)知道了屏蔽的原理,只要我們能夠隱藏這些特征串就可以了。但是還不能直接刪除這些屬性,因為這樣可能會導(dǎo)致selenium不能正常工作了。我們采用曲線救國的方法,使用中間人代理,比如fidder, proxy2.py或者mitmproxy,將JS文件(本例是yoda.*.js這個文件)中的特征字符串給過濾掉(或者替換掉,比如替換成根本不存在的特征串),讓它無法正常工作,從而達(dá)到讓客戶端腳本檢測不到selenium的效果。
下面我們驗證下這個思路。這里我們使用mitmproxy實現(xiàn)中間人代理),對JS文件(本例是yoda.*.js這個文件)內(nèi)容進(jìn)行過濾。啟動mitmproxy代理并加載response處理腳本:
mitmdump.exe -S modify_response.py
其中modify_response.py腳本如下所示:
view plain copy to clipboard print ?
# coding: utf-8
# modify_response.py
import re
from mitmproxy import ctx
def response(flow):
"""修改應(yīng)答數(shù)據(jù)
"""
if '/js/yoda.' in flow.request.url:
# 屏蔽selenium檢測
for webdriver_key in ['webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:
ctx.log.info('Remove "{}" from {}.'.format(webdriver_key, flow.request.url))
flow.response.text = flow.response.text.replace('"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"')
flow.response.text = flow.response.text.replace('t.webdriver', 'false')
flow.response.text = flow.response.text.replace('ChromeDriver', '')
在selnium中使用該代理(mitmproxy默認(rèn)監(jiān)聽127.0.0.1:8080)訪問目標(biāo)網(wǎng)站,mitmproxy將過濾JS中的特征符串,如下圖所示:
以上是“如何突破網(wǎng)站對selenium的屏蔽”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
分享文章:如何突破網(wǎng)站對selenium的屏蔽-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article14/dodcde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、Google、企業(yè)建站、網(wǎng)站設(shè)計公司、網(wǎng)站收錄、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)