小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

你以為的萬能爬蟲方法,其實(shí)一行代碼就能識(shí)別!

 風(fēng)聲之家 2022-06-15 發(fā)布于江蘇

Python綠色通道 2022-06-09 08:30 發(fā)表于廣東

以下文章來源于未聞Code ,作者kingname

未聞Code

博主喜歡Python和爬蟲,已經(jīng)出了兩本書。這里是他靈感的發(fā)源地。關(guān)注這個(gè)公眾號(hào),你的生產(chǎn)效率在三天內(nèi)就會(huì)得到提高。P.S.: 這個(gè)公眾號(hào)日更。

↑ 關(guān)注 + 星標(biāo) ,每天學(xué)Python新技能

后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包

Selenium/Puppeteer/Pyppeteer有很多特征可以被網(wǎng)站檢測(cè)到。于是,有些同學(xué)想到了另一個(gè)方法,就是自己寫一個(gè)Chrome插件,在網(wǎng)站打開的時(shí)候,注入到頁面中,然后通過這個(gè)注入的JavaScript代碼來操作頁面,獲取數(shù)據(jù)。

這個(gè)方法理論上說是萬能的,因?yàn)樽⑷氲腏avaScript能夠獲取當(dāng)前Dom樹,任何接口簽名都無法攔截到自己注入的JavaScript代碼,如下圖所示:

圖片

而Chrome插件訪問自己的服務(wù)器后端是沒有跨域問題的,完全可以讓插件獲取到數(shù)據(jù)以后,發(fā)送給自己的服務(wù)器,這樣就可以把數(shù)據(jù)收入囊中了。

你還可以通過JavaScript自動(dòng)點(diǎn)擊按鈕,實(shí)現(xiàn)自動(dòng)翻頁。所以你只需要把網(wǎng)頁打開,啟動(dòng)插件,然后他就能自動(dòng)刷新,自動(dòng)獲取數(shù)據(jù)了。

這個(gè)方法看起來非常萬能,而且無法被防御……

事實(shí)真的是這樣嗎?我寫了一個(gè)Demo來做測(cè)試。Demo頁面長(zhǎng)下面這樣:

圖片

當(dāng)我手動(dòng)點(diǎn)擊點(diǎn)擊我按鈕的時(shí)候,會(huì)彈出一個(gè)框:

圖片

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

圖片

為什么網(wǎng)站知道我在用JavaScript點(diǎn)擊了按鈕呢?其實(shí)只要我給你看這個(gè)頁面的HTML,你就知道了:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Test Event</title>
    </head>
    <body>
        <div id="app">
            <template v-if="spider">
                <div>你這個(gè)狗爬蟲</div>
            </template>
            <template v-else>
                <button v-on:click="check">點(diǎn)擊我</button>
            </template>
          </div>
        <script src="./vue.min.js"></script>
        <script>
            var example2 = new Vue({
            el'#app',
            data: {
                spiderfalse
            },
            methods: {
                checkfunction (event{
                    if (event.isTrusted) {
                        alert('主人你好,歡迎回家!')
                    } else {
                        this.spider = true
                    }
                }
            }
            })
        </script>

    </body>
</html>

關(guān)鍵的點(diǎn)就是這個(gè)event.isTrusted。它是瀏覽器的一個(gè)功能,如果這個(gè)事件是人通過鼠標(biāo)點(diǎn)擊的,那么它是true。如果事件是通過JavaScript觸發(fā)的,那么它是false

關(guān)于這個(gè)屬性,你可以查看Event.isTrusted - Web API 接口參考 | MDN[1]。這個(gè)例子里面,我用的是Vue來操作頁面,但實(shí)際上event是瀏覽器的特性,使用原生JavaScript也可以實(shí)現(xiàn):

  document.querySelector("button").addEventListener("click"function( event {
    if (event.isTrusted) {
        alert('主人你好,歡迎回家!')
     } else {
        this.spider = true
     }
  }, false);

那么如何繞過這個(gè)event.isTrusted呢?其實(shí)很簡(jiǎn)單,你使用Selenium/Puppeteer,天然就能繞過它。

看到這里,大家肯定發(fā)現(xiàn)一個(gè)很好笑的問題,Selenium/Puppeteer不能解決的問題,用JavaScript輕松就能解決。但JavaScript解決不了的問題,用Selenium/Puppeteer又完全沒有問題。

這就像是貓吃老鼠,老虎吃貓,大象吃老虎,但是老鼠可以吃大象。寸有所長(zhǎng),必有所短,寸有所短,也可能有所長(zhǎng)。

參考文獻(xiàn)

[1] Event.isTrusted - Web API 接口參考 | MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/Event/isTrusted

圖片

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多