Python綠色通道 2022-06-09 08:30 發(fā)表于廣東
以下文章來源于未聞Code ,作者kingname

未聞Code
博主喜歡Python和爬蟲,已經(jīng)出了兩本書。這里是他靈感的發(fā)源地。關(guān)注這個公眾號,你的生產(chǎn)效率在三天內(nèi)就會得到提高。P.S.: 這個公眾號日更。
↑ 關(guān)注 + 星標 ,每天學Python新技能
后臺回復(fù)【大禮包】送你Python自學大禮包
Selenium/Puppeteer/Pyppeteer有很多特征可以被網(wǎng)站檢測到。于是,有些同學想到了另一個方法,就是自己寫一個Chrome插件,在網(wǎng)站打開的時候,注入到頁面中,然后通過這個注入的JavaScript代碼來操作頁面,獲取數(shù)據(jù)。
這個方法理論上說是萬能的,因為注入的JavaScript能夠獲取當前Dom樹,任何接口簽名都無法攔截到自己注入的JavaScript代碼,如下圖所示:

而Chrome插件訪問自己的服務(wù)器后端是沒有跨域問題的,完全可以讓插件獲取到數(shù)據(jù)以后,發(fā)送給自己的服務(wù)器,這樣就可以把數(shù)據(jù)收入囊中了。
你還可以通過JavaScript自動點擊按鈕,實現(xiàn)自動翻頁。所以你只需要把網(wǎng)頁打開,啟動插件,然后他就能自動刷新,自動獲取數(shù)據(jù)了。
這個方法看起來非常萬能,而且無法被防御……
事實真的是這樣嗎?我寫了一個Demo來做測試。Demo頁面長下面這樣:

當我手動點擊點擊我
按鈕的時候,會彈出一個框:

現(xiàn)在,我使用JavaScript來選擇這個按鈕,然后點擊它:

為什么網(wǎng)站知道我在用JavaScript點擊了按鈕呢?其實只要我給你看這個頁面的HTML,你就知道了:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test Event</title>
</head>
<body>
<div id="app">
<template v-if="spider">
<div>你這個狗爬蟲</div>
</template>
<template v-else>
<button v-on:click="check">點擊我</button>
</template>
</div>
<script src="./vue.min.js"></script>
<script>
var example2 = new Vue({
el: '#app',
data: {
spider: false
},
methods: {
check: function (event) {
if (event.isTrusted) {
alert('主人你好,歡迎回家!')
} else {
this.spider = true
}
}
}
})
</script>
</body>
</html>
關(guān)鍵的點就是這個event.isTrusted
。它是瀏覽器的一個功能,如果這個事件是人通過鼠標點擊的,那么它是true
。如果事件是通過JavaScript觸發(fā)的,那么它是false
。
關(guān)于這個屬性,你可以查看Event.isTrusted - Web API 接口參考 | MDN[1]。這個例子里面,我用的是Vue來操作頁面,但實際上event
是瀏覽器的特性,使用原生JavaScript也可以實現(xiàn):
document.querySelector("button").addEventListener("click", function( event ) {
if (event.isTrusted) {
alert('主人你好,歡迎回家!')
} else {
this.spider = true
}
}, false);
那么如何繞過這個event.isTrusted
呢?其實很簡單,你使用Selenium/Puppeteer,天然就能繞過它。
看到這里,大家肯定發(fā)現(xiàn)一個很好笑的問題,Selenium/Puppeteer不能解決的問題,用JavaScript輕松就能解決。但JavaScript解決不了的問題,用Selenium/Puppeteer又完全沒有問題。
這就像是貓吃老鼠,老虎吃貓,大象吃老虎,但是老鼠可以吃大象。寸有所長,必有所短,寸有所短,也可能有所長。
參考文獻
[1] Event.isTrusted - Web API 接口參考 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/Event/isTrusted