Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美小视频在线观看,三级在线观看视频网站,国产日本特黄特色大片免费视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          HTML+CSS 前端開發(fā) 元素不可見 displa

          HTML+CSS 前端開發(fā) 元素不可見 display opacity visibility

          eb中,某一元素不可見是操作中非常常見的交互,彈出層、提示框、tab切換等都利用到了元素不可見屬性,實(shí)現(xiàn)元素不可見是元素不存在或是視覺上的不可見,實(shí)例對(duì)比講解“元素不可見”。


          互聯(lián)網(wǎng)上進(jìn)行自動(dòng)數(shù)據(jù)采集(抓?。┻@件事和互聯(lián)網(wǎng)存在的時(shí)間差不多一樣長(zhǎng)。今天大眾好像更傾向于用“網(wǎng)絡(luò)數(shù)據(jù)采集”,有時(shí)會(huì)把網(wǎng)絡(luò)數(shù)據(jù)采集程序稱為網(wǎng)絡(luò)機(jī)器人(bots)。最常用的方法是寫一個(gè)自動(dòng)化程序向網(wǎng)絡(luò)服務(wù)器請(qǐng)求數(shù)據(jù)(通常是用 HTML 表單或其他網(wǎng)頁文件),然后對(duì)數(shù)據(jù)進(jìn)行解析,提取需要的信息。

          本文假定讀者已經(jīng)了解如何用代碼來抓取一個(gè)遠(yuǎn)程的 URL,并具備表單如何提交及 JavaScript 在瀏覽器如何運(yùn)行的機(jī)制。想更多了解網(wǎng)絡(luò)數(shù)據(jù)采集基礎(chǔ)知識(shí),可以參考文后的資料。

          在采集網(wǎng)站的時(shí)會(huì)遇到一些比數(shù)據(jù)顯示在瀏覽器上卻抓取不出來更令人沮喪的事情。也許是向服務(wù)器提交自認(rèn)為已經(jīng)處理得很好的表單卻被拒絕,也許是自己的 IP 地址不知道什么原因直接被網(wǎng)站封殺,無法繼續(xù)訪問。

          原因可能是一些最復(fù)雜的 bug,也可能是這些 bug 讓人意想不到(程序在一個(gè)網(wǎng)站上可以正常使用,但在另一個(gè)看起來完全一樣的網(wǎng)站上卻用不了)。最有可能出現(xiàn)的情況是:對(duì)方有意不讓爬蟲抓取信息。網(wǎng)站已經(jīng)把你定性為一個(gè)網(wǎng)絡(luò)機(jī)器人直接拒絕了,你無法找出原因。

          接下來就介紹一些網(wǎng)絡(luò)采集的黑魔法(HTTP headers、CSS 和 HTML 表單等),以克服網(wǎng)站阻止自動(dòng)采集。不過,先讓我們聊聊道德問題。

          網(wǎng)絡(luò)爬蟲的道德與禮儀

          說實(shí)話,從道德角度講,寫作以下文字不易。我自己的網(wǎng)站被網(wǎng)絡(luò)機(jī)器人、垃圾郵件生成器、網(wǎng)絡(luò)爬蟲和其他各種不受歡迎的虛擬訪問者騷擾過很多次了,你的網(wǎng)站可能也一樣。既然如此,為什么還要介紹那些更強(qiáng)大的網(wǎng)絡(luò)機(jī)器人呢?有幾個(gè)很重要的理由。

          • 白帽子工作。在采集那些不想被采集的網(wǎng)站時(shí),其實(shí)存在一些非常符合道德和法律規(guī)范的理由。比如我之前的工作就是做網(wǎng)絡(luò)爬蟲,我曾做過一個(gè)自動(dòng)信息收集器,從未經(jīng)許可的網(wǎng)站上自動(dòng)收集客戶的名稱、地址、電話號(hào)碼和其他個(gè)人信息,然后把采集的信息提交到網(wǎng)站上,讓服務(wù)器刪除這些客戶信息。為了避免競(jìng)爭(zhēng),這些網(wǎng)站都會(huì)對(duì)網(wǎng)絡(luò)爬蟲嚴(yán)防死守。但是,我的工作要確保公司的客戶們都匿名(這些人都是家庭暴力受害者,或者因其他正當(dāng)理由想保持低調(diào)的人),這為網(wǎng)絡(luò)數(shù)據(jù)采集工作創(chuàng)造了極其合理的條件,我很高興自己有能力從事這項(xiàng)工作。

          • 雖然不太可能建立一個(gè)完全“防爬蟲”的網(wǎng)站(最起碼得讓合法的用戶可以方便地訪問網(wǎng)站),但我還是希望以下內(nèi)容可以幫助人們保護(hù)自己的網(wǎng)站不被惡意攻擊。下文將指出每一種網(wǎng)絡(luò)數(shù)據(jù)采集技術(shù)的缺點(diǎn),你可以利用這些缺點(diǎn)保護(hù)自己的網(wǎng)站。其實(shí),大多數(shù)網(wǎng)絡(luò)機(jī)器人一開始都只能做一些寬泛的信息和漏洞掃描,接下來介紹的幾個(gè)簡(jiǎn)單技術(shù)就可以擋住 99% 的機(jī)器人。但是,它們進(jìn)化的速度非???,最好時(shí)刻準(zhǔn)備迎接新的攻擊。

          • 和大多數(shù)程序員一樣,我從來不相信禁止某一類信息的傳播就可以讓世界變得更和諧。

          閱讀之前,請(qǐng)牢記:這里演示的許多程序和介紹的技術(shù)都不應(yīng)該在網(wǎng)站上使用。

          爬蟲黑科技:

          網(wǎng)絡(luò)機(jī)器人看起來像人類用戶的一些方法

          網(wǎng)站防采集的前提就是要正確地區(qū)分人類訪問用戶和網(wǎng)絡(luò)機(jī)器人。雖然網(wǎng)站可以使用很多識(shí)別技術(shù)(比如驗(yàn)證碼)來防止爬蟲,但還是有一些十分簡(jiǎn)單的方法,可以讓你的網(wǎng)絡(luò)機(jī)器人看起來更像人類訪問用戶。

          1. 構(gòu)造合理的 HTTP 請(qǐng)求頭

          除了處理網(wǎng)站表單,requests 模塊還是一個(gè)設(shè)置請(qǐng)求頭的利器。HTTP 的請(qǐng)求頭是在你每次向網(wǎng)絡(luò)服務(wù)器發(fā)送請(qǐng)求時(shí),傳遞的一組屬性和配置信息。HTTP 定義了十幾種古怪的請(qǐng)求頭類型,不過大多數(shù)都不常用。只有下面的七個(gè)字段被大多數(shù)瀏覽器用來初始化所有網(wǎng)絡(luò)請(qǐng)求(表中信息是我自己瀏覽器的數(shù)據(jù))。

          經(jīng)典的 Python 爬蟲在使用 urllib 標(biāo)準(zhǔn)庫(kù)時(shí),都會(huì)發(fā)送如下的請(qǐng)求頭:

          如果你是一個(gè)防范爬蟲的網(wǎng)站管理員,你會(huì)讓哪個(gè)請(qǐng)求頭訪問你的網(wǎng)站呢?

          安裝 Requests


          可在模塊的網(wǎng)站上找到下載鏈接(http://docs.python-requests.org/en/latest/user/install/)和安裝方法,或者用任意第三方 Python 模塊安裝器進(jìn)行安裝。

          請(qǐng)求頭可以通過 requests 模塊進(jìn)行自定義。https://www.whatismybrowser.com/網(wǎng)站就是一個(gè)非常棒的網(wǎng)站,可以讓服務(wù)器測(cè)試瀏覽器的屬性。我們用下面的程序來采集這個(gè)網(wǎng)站的信息,驗(yàn)證我們?yōu)g覽器的 cookie 設(shè)置:

          點(diǎn)擊可查看大圖

          程序輸出結(jié)果中的請(qǐng)求頭應(yīng)該和程序中設(shè)置的 headers 是一樣的。

          雖然網(wǎng)站可能會(huì)對(duì) HTTP 請(qǐng)求頭的每個(gè)屬性進(jìn)行“是否具有人性”的檢查,但是我發(fā)現(xiàn)通常真正重要的參數(shù)就是 User-Agent。無論做什么項(xiàng)目,一定要記得把 User-Agent 屬性設(shè)置成不容易引起懷疑的內(nèi)容,不要用 Python-urllib/3.4。另外,如果你正在處理一個(gè)警覺性非常高的網(wǎng)站,就要注意那些經(jīng)常用卻很少檢查的請(qǐng)求頭,比如 Accept-Language 屬性,也許它正是那個(gè)網(wǎng)站判斷你是個(gè)人類訪問者的關(guān)鍵。

          請(qǐng)求頭會(huì)改變你觀看網(wǎng)絡(luò)世界的方式

          假設(shè)你想為一個(gè)機(jī)器學(xué)習(xí)的研究項(xiàng)目寫一個(gè)語言翻譯機(jī),卻沒有大量的翻譯文本來測(cè)試它的效果。很多大型網(wǎng)站都會(huì)為同樣的內(nèi)容提供不同的語言翻譯,根據(jù)請(qǐng)求頭的參數(shù)響應(yīng)網(wǎng)站不同的語言版本。因此,你只要簡(jiǎn)單地把請(qǐng)求頭屬性從 Accept-Language:en-US修改成Accept-Language:fr,就可以從網(wǎng)站上獲得“Bonjour”(法語,你好)這些數(shù)據(jù)來改善翻譯機(jī)的翻譯效果了(大型跨國(guó)企業(yè)通常都是好的采集對(duì)象)。

          請(qǐng)求頭還可以讓網(wǎng)站改變內(nèi)容的布局樣式。例如,用移動(dòng)設(shè)備瀏覽網(wǎng)站時(shí),通常會(huì)看到一個(gè)沒有廣告、Flash 以及其他干擾的簡(jiǎn)化的網(wǎng)站版本。因此,把你的請(qǐng)求頭 User-Agent 改成下面這樣,就可以看到一個(gè)更容易采集的網(wǎng)站了!

          User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

          2. 設(shè)置 cookie 的學(xué)問

          雖然 cookie 是一把雙刃劍,但正確地處理 cookie 可以避免許多采集問題。網(wǎng)站會(huì)用 cookie 跟蹤你的訪問過程,如果發(fā)現(xiàn)了爬蟲異常行為就會(huì)中斷你的訪問,比如特別快速地填寫表單,或者瀏覽大量頁面。雖然這些行為可以通過關(guān)閉并重新連接或者改變 IP 地址來偽裝,但是如果 cookie 暴露了你的身份,再多努力也是白費(fèi)。

          在采集一些網(wǎng)站時(shí) cookie 是不可或缺的。要在一個(gè)網(wǎng)站上持續(xù)保持登錄狀態(tài),需要在多個(gè)頁面中保存一個(gè) cookie。有些網(wǎng)站不要求在每次登錄時(shí)都獲得一個(gè)新 cookie,只要保存一個(gè)舊的“已登錄”的 cookie 就可以訪問。

          如果你在采集一個(gè)或者幾個(gè)目標(biāo)網(wǎng)站,建議你檢查這些網(wǎng)站生成的 cookie,然后想想哪一個(gè) cookie 是爬蟲需要處理的。有一些瀏覽器插件可以為你顯示訪問網(wǎng)站和離開網(wǎng)站時(shí) cookie 是如何設(shè)置的。EditThisCookie(http://www.editthiscookie.com/)是我最喜歡的 Chrome 瀏覽器插件之一。

          因?yàn)?requests 模塊不能執(zhí)行 JavaScript,所以它不能處理很多新式的跟蹤軟件生成的 cookie,比如 Google Analytics,只有當(dāng)客戶端腳本執(zhí)行后才設(shè)置 cookie(或者在用戶瀏覽頁面時(shí)基于網(wǎng)頁事件產(chǎn)生 cookie,比如點(diǎn)擊按鈕)。要處理這些動(dòng)作,需要用 Selenium 和 PhantomJS 包。

          Selenium 與 PhantomJS

          Selenium(http://www.seleniumhq.org/)是一個(gè)強(qiáng)大的網(wǎng)絡(luò)數(shù)據(jù)采集工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開發(fā)的。近幾年,它還被廣泛用于獲取精確的網(wǎng)站快照,因?yàn)樗鼈兛梢灾苯舆\(yùn)行在瀏覽器上。Selenium 可以讓瀏覽器自動(dòng)加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏,或者判斷網(wǎng)站上某些動(dòng)作是否發(fā)生。

          Selenium 自己不帶瀏覽器,它需要與第三方瀏覽器結(jié)合在一起使用。例如,如果你在 Firefox 上運(yùn)行 Selenium,可以直接看到 Firefox 窗口被打開,進(jìn)入網(wǎng)站,然后執(zhí)行你在代碼中設(shè)置的動(dòng)作。雖然這樣可以看得更清楚,但是我更喜歡讓程序在后臺(tái)運(yùn)行,所以我 PhantomJS(http://phantomjs.org/download.html)代替真實(shí)的瀏覽器。

          PhantomJS 是一個(gè)“無頭”(headless)瀏覽器。它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的 JavaScript,但不會(huì)向用戶展示網(wǎng)頁的圖形界面。將 Selenium 和 PhantomJS 結(jié)合在一起,就可以運(yùn)行一個(gè)非常強(qiáng)大的網(wǎng)絡(luò)爬蟲了,可以處理 cookie、JavaScrip、header,以及任何你需要做的事情。

          可以從PyPI網(wǎng)站(https://pypi.python.org/simple/selenium/)下載Selenium庫(kù),也可以用第三方管理器(像pip)用命令行安裝。

          你可以對(duì)任意網(wǎng)站(本例用的是 http://pythonscraping.com)調(diào)用 webdriver 的 get_cookie方法來查看 cookie:

          點(diǎn)擊可查看大圖

          這樣就可以獲得一個(gè)非常典型的 Google Analytics 的 cookie 列表:

          點(diǎn)擊可查看大圖

          還可以調(diào)用 delete_cookie、add_cookie 和 delete_all_cookies 方法來處理 cookie。另外,還可以保存 cookie 以備其他網(wǎng)絡(luò)爬蟲使用。下面的例子演示了如何把這些函數(shù)組合在一起:

          點(diǎn)擊可查看大圖

          在這個(gè)例子中,第一個(gè) webdriver 獲得了一個(gè)網(wǎng)站,打印 cookie 并把它們保存到變量savedCookies 里。第二個(gè) webdriver 加載同一個(gè)網(wǎng)站(技術(shù)提示:必須首先加載網(wǎng)站,這樣 Selenium 才能知道 cookie 屬于哪個(gè)網(wǎng)站,即使加載網(wǎng)站的行為對(duì)我們沒任何用處),刪除所有的 cookie,然后替換成第一個(gè) webdriver 得到的 cookie。當(dāng)再次加載這個(gè)頁面時(shí),兩組 cookie 的時(shí)間戳、源代碼和其他信息應(yīng)該完全一致。從 Google Analytics 的角度看,第二個(gè) webdriver 現(xiàn)在和第一個(gè) webdriver 完全一樣。

          3. 正常的時(shí)間訪問路徑

          有一些防護(hù)措施完備的網(wǎng)站可能會(huì)阻止你快速地提交表單,或者快速地與網(wǎng)站進(jìn)行交互。即使沒有這些安全措施,用一個(gè)比普通人快很多的速度從一個(gè)網(wǎng)站下載大量信息也可能讓自己被網(wǎng)站封殺。

          因此,雖然多線程程序可能是一個(gè)快速加載頁面的好辦法——在一個(gè)線程中處理數(shù)據(jù),另一個(gè)線程中加載頁面——但是這對(duì)編寫好的爬蟲來說是恐怖的策略。還是應(yīng)該盡量保證一次加載頁面加載且數(shù)據(jù)請(qǐng)求最小化。如果條件允許,盡量為每個(gè)頁面訪問增加一點(diǎn)兒時(shí)間間隔,即使你要增加一行代碼:

          time.sleep(3)

          (小編:3 + 隨機(jī)數(shù) 是不是更好一些?)

          合理控制速度是你不應(yīng)該破壞的規(guī)則。過度消耗別人的服務(wù)器資源會(huì)讓你置身于非法境地,更嚴(yán)重的是這么做可能會(huì)把一個(gè)小型網(wǎng)站拖垮甚至下線。拖垮網(wǎng)站是不道德的,是徹頭徹尾的錯(cuò)誤。所以請(qǐng)控制采集速度!

          常見表單反爬蟲安全措施解密

          許多像 Litmus 之類的測(cè)試工具已經(jīng)用了很多年了,現(xiàn)在仍用于區(qū)分網(wǎng)絡(luò)爬蟲和使用瀏覽器的人類訪問者,這類手段都取得了不同程度的效果。雖然網(wǎng)絡(luò)機(jī)器人下載一些公開的文章和博文并不是什么大事,但是如果網(wǎng)絡(luò)機(jī)器人在你的網(wǎng)站上創(chuàng)造了幾千個(gè)賬號(hào)并開始向所有用戶發(fā)送垃圾郵件,就是一個(gè)大問題了。網(wǎng)絡(luò)表單,尤其是那些用于賬號(hào)創(chuàng)建和登錄的網(wǎng)站,如果被機(jī)器人肆意地濫用,網(wǎng)站的安全和流量費(fèi)用就會(huì)面臨嚴(yán)重威脅,因此努力限制網(wǎng)站的接入是最符合許多網(wǎng)站所有者的利益的(至少他們這么認(rèn)為)。

          這些集中在表單和登錄環(huán)節(jié)上的反機(jī)器人安全措施,對(duì)網(wǎng)絡(luò)爬蟲來說確實(shí)是嚴(yán)重的挑戰(zhàn)。

          4. 注意隱含輸入字段值

          在 HTML 表單中,“隱含”字段可以讓字段的值對(duì)瀏覽器可見,但是對(duì)用戶不可見(除非看網(wǎng)頁源代碼)。隨著越來越多的網(wǎng)站開始用 cookie 存儲(chǔ)狀態(tài)變量來管理用戶狀態(tài),在找到另一個(gè)最佳用途之前,隱含字段主要用于阻止爬蟲自動(dòng)提交表單。

          下圖顯示的例子就是 Facebook 登錄頁面上的隱含字段。雖然表單里只有三個(gè)可見字段(username、password 和一個(gè)確認(rèn)按鈕),但是在源代碼里表單會(huì)向服務(wù)器傳送大量的信息。

          Facebook 登錄頁面上的隱含字段

          用隱含字段阻止網(wǎng)絡(luò)數(shù)據(jù)采集的方式主要有兩種。第一種是表單頁面上的一個(gè)字段可以用服務(wù)器生成的隨機(jī)變量表示。如果提交時(shí)這個(gè)值不在表單處理頁面上,服務(wù)器就有理由認(rèn)為這個(gè)提交不是從原始表單頁面上提交的,而是由一個(gè)網(wǎng)絡(luò)機(jī)器人直接提交到表單處理頁面的。繞開這個(gè)問題的最佳方法就是,首先采集表單所在頁面上生成的隨機(jī)變量,然后再提交到表單處理頁面。

          第二種方式是“蜜罐”(honey pot)。如果表單里包含一個(gè)具有普通名稱的隱含字段(設(shè)置蜜罐圈套),比如“用戶名”(username)或“郵箱地址”(email address),設(shè)計(jì)不太好的網(wǎng)絡(luò)機(jī)器人往往不管這個(gè)字段是不是對(duì)用戶可見,直接填寫這個(gè)字段并向服務(wù)器提交,這樣就會(huì)中服務(wù)器的蜜罐圈套。服務(wù)器會(huì)把所有隱含字段的真實(shí)值(或者與表單提交頁面的默認(rèn)值不同的值)都忽略,而且填寫隱含字段的訪問用戶也可能被網(wǎng)站封殺。

          總之,有時(shí)檢查表單所在的頁面十分必要,看看有沒有遺漏或弄錯(cuò)一些服務(wù)器預(yù)先設(shè)定好的隱含字段(蜜罐圈套)。如果你看到一些隱含字段,通常帶有較大的隨機(jī)字符串變量,那么很可能網(wǎng)絡(luò)服務(wù)器會(huì)在表單提交的時(shí)候檢查它們。另外,還有其他一些檢查,用來保證這些當(dāng)前生成的表單變量只被使用一次或是最近生成的(這樣可以避免變量被簡(jiǎn)單地存儲(chǔ)到一個(gè)程序中反復(fù)使用)。

          5. 爬蟲通常如何避開蜜罐

          雖然在進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)采集時(shí)用 CSS 屬性區(qū)分有用信息和無用信息會(huì)很容易(比如,通過讀取 id和 class 標(biāo)簽獲取信息),但這么做有時(shí)也會(huì)出問題。如果網(wǎng)絡(luò)表單的一個(gè)字段通過 CSS 設(shè)置成對(duì)用戶不可見,那么可以認(rèn)為普通用戶訪問網(wǎng)站的時(shí)候不能填寫這個(gè)字段,因?yàn)樗鼪]有顯示在瀏覽器上。如果這個(gè)字段被填寫了,就可能是機(jī)器人干的,因此這個(gè)提交會(huì)失效。

          這種手段不僅可以應(yīng)用在網(wǎng)站的表單上,還可以應(yīng)用在鏈接、圖片、文件,以及一些可以被機(jī)器人讀取,但普通用戶在瀏覽器上卻看不到的任何內(nèi)容上面。訪問者如果訪問了網(wǎng)站上的一個(gè)“隱含”內(nèi)容,就會(huì)觸發(fā)服務(wù)器腳本封殺這個(gè)用戶的 IP 地址,把這個(gè)用戶踢出網(wǎng)站,或者采取其他措施禁止這個(gè)用戶接入網(wǎng)站。實(shí)際上,許多商業(yè)模式就是在干這些事情。

          下面的例子所用的網(wǎng)頁在 http://pythonscraping.com/pages/itsatrap.html。這個(gè)頁面包含了兩個(gè)鏈接,一個(gè)通過 CSS 隱含了,另一個(gè)是可見的。另外,頁面上還包括兩個(gè)隱含字段:

          點(diǎn)擊可查看大圖

          這三個(gè)元素通過三種不同的方式對(duì)用戶隱藏:

          • 第一個(gè)鏈接是通過簡(jiǎn)單的 CSS 屬性設(shè)置 display:none進(jìn)行隱藏

          • 電話號(hào)碼字段 name="phone"是一個(gè)隱含的輸入字段

          • 郵箱地址字段 name="email"是將元素向右移動(dòng) 50 000 像素(應(yīng)該會(huì)超出電腦顯示器的邊界)并隱藏滾動(dòng)條

          因?yàn)?Selenium 可以獲取訪問頁面的內(nèi)容,所以它可以區(qū)分頁面上的可見元素與隱含元素。通過 is_displayed 可以判斷元素在頁面上是否可見。

          例如,下面的代碼示例就是獲取前面那個(gè)頁面的內(nèi)容,然后查找隱含鏈接和隱含輸入字段:

          點(diǎn)擊可查看大圖

          Selenium 抓取出了每個(gè)隱含的鏈接和字段,結(jié)果如下所示:

          點(diǎn)擊可查看大圖

          雖然你不太可能會(huì)去訪問你找到的那些隱含鏈接,但是在提交前,記得確認(rèn)一下那些已經(jīng)在表單中、準(zhǔn)備提交的隱含字段的值(或者讓 Selenium 為你自動(dòng)提交)。

          使用遠(yuǎn)程服務(wù)器來避免 IP 封鎖

          啟用遠(yuǎn)程平臺(tái)的人通常有兩個(gè)目的:對(duì)更大計(jì)算能力和靈活性的需求,以及對(duì)可變 IP 地址的需求

          6. 使用可變的遠(yuǎn)程 IP 地址

          建立網(wǎng)絡(luò)爬蟲的第一原則是:所有信息都可以偽造。你可以用非本人的郵箱發(fā)送郵件,通過命令行自動(dòng)化鼠標(biāo)的行為,或者通過 IE 5.0 瀏覽器耗費(fèi)網(wǎng)站流量來嚇唬網(wǎng)管。

          但是有一件事情是不能作假的,那就是你的 IP 地址。任何人都可以用這個(gè)地址給你寫信:“美國(guó)華盛頓特區(qū)賓夕法尼亞大道西北 1600 號(hào),總統(tǒng),郵編 20500?!钡牵绻@封信是從新墨西哥州的阿爾伯克基市發(fā)來的,那么你肯定可以確信給你寫信的不是美國(guó)總統(tǒng)。

          從技術(shù)上說,IP 地址是可以通過發(fā)送數(shù)據(jù)包進(jìn)行偽裝的,就是分布式拒絕服務(wù)攻擊技術(shù)(Distributed Denial of Service,DDoS),攻擊者不需要關(guān)心接收的數(shù)據(jù)包(這樣發(fā)送請(qǐng)求的時(shí)候就可以使用假 IP 地址)。但是網(wǎng)絡(luò)數(shù)據(jù)采集是一種需要關(guān)心服務(wù)器響應(yīng)的行為,所以我們認(rèn)為 IP 地址是不能造假的。

          阻止網(wǎng)站被采集的注意力主要集中在識(shí)別人類與機(jī)器人的行為差異上面。封殺 IP 地址這種矯枉過正的行為,就好像是農(nóng)民不靠噴農(nóng)藥給莊稼殺蟲,而是直接用火燒徹底解決問題。它是最后一步棋,不過是一種非常有效的方法,只要忽略危險(xiǎn) IP 地址發(fā)來的數(shù)據(jù)包就可以了。但是,使用這種方法會(huì)遇到以下幾個(gè)問題。

          • IP 地址訪問列表很難維護(hù)。雖然大多數(shù)大型網(wǎng)站都會(huì)用自己的程序自動(dòng)管理 IP 地址訪問列表(機(jī)器人封殺機(jī)器人),但是至少需要人偶爾檢查一下列表,或者至少要監(jiān)控問題的增長(zhǎng)。

          • 因?yàn)榉?wù)器需要根據(jù) IP 地址訪問列表去檢查每個(gè)準(zhǔn)備接收的數(shù)據(jù)包,所以檢查接收數(shù)據(jù)包時(shí)會(huì)額外增加一些處理時(shí)間。多個(gè) IP 地址乘以海量的數(shù)據(jù)包更會(huì)使檢查時(shí)間指數(shù)級(jí)增長(zhǎng)。為了降低處理時(shí)間和處理復(fù)雜度,管理員通常會(huì)對(duì) IP 地址進(jìn)行分組管理并制定相應(yīng)的規(guī)則,比如如果這組 IP 中有一些危險(xiǎn)分子就“把這個(gè)區(qū)間的所有 256 個(gè)地址全部封殺”。于是產(chǎn)生了下一個(gè)問題。

          • 封殺 IP 地址可能會(huì)導(dǎo)致意外后果。例如,當(dāng)我還在美國(guó)麻省歐林工程學(xué)院讀本科的時(shí)候,有個(gè)同學(xué)寫了一個(gè)可以在 http://digg.com/網(wǎng)站(在 Reddit 流行之前大家都用 Digg)上對(duì)熱門內(nèi)容進(jìn)行投票的軟件。這個(gè)軟件的服務(wù)器 IP 地址被 Digg 封殺,導(dǎo)致整個(gè)網(wǎng)站都不能訪問。于是這個(gè)同學(xué)就把軟件移到了另一個(gè)服務(wù)器上,而 Digg 自己卻失去了許多主要目標(biāo)用戶的訪問量。

          雖然有這些缺點(diǎn),但封殺 IP 地址依然是一種十分常用的手段,服務(wù)器管理員用它來阻止可疑的網(wǎng)絡(luò)爬蟲入侵服務(wù)器。

          Tor 代理服務(wù)器

          洋蔥路由(The Onion Router)網(wǎng)絡(luò),常用縮寫為 Tor,是一種 IP 地址匿名手段。由網(wǎng)絡(luò)志愿者服務(wù)器構(gòu)建的洋蔥路由器網(wǎng)絡(luò),通過不同服務(wù)器構(gòu)成多個(gè)層(就像洋蔥)把客戶端包在最里面。數(shù)據(jù)進(jìn)入網(wǎng)絡(luò)之前會(huì)被加密,因此任何服務(wù)器都不能偷取通信數(shù)據(jù)。另外,雖然每一個(gè)服務(wù)器的入站和出站通信都可以被查到,但是要想查出通信的真正起點(diǎn)和終點(diǎn),必須知道整個(gè)通信鏈路上所有服務(wù)器的入站和出站通信細(xì)節(jié),而這基本是不可能實(shí)現(xiàn)的。

          Tor 匿名的局限性

          雖然我們?cè)诒疚闹杏?Tor 的目的是改變 IP 地址,而不是實(shí)現(xiàn)完全匿名,但有必要關(guān)注一下 Tor 匿名方法的能力和不足。


          雖然 Tor 網(wǎng)絡(luò)可以讓你訪問網(wǎng)站時(shí)顯示的 IP 地址是一個(gè)不能跟蹤到你的 IP 地址,但是你在網(wǎng)站上留給服務(wù)器的任何信息都會(huì)暴露你的身份。例如,你登錄 Gmail 賬號(hào)后再用 Google 搜索,那些搜索歷史就會(huì)和你的身份綁定在一起。


          另外,登錄 Tor 的行為也可能讓你的匿名狀態(tài)處于危險(xiǎn)之中。2013 年 12 月,一個(gè)哈佛大學(xué)本科生想逃避期末考試,就用一個(gè)匿名郵箱賬號(hào)通過 Tor 網(wǎng)絡(luò)給學(xué)校發(fā)了一封炸彈威脅信。結(jié)果哈佛大學(xué)的 IT 部門通過日志查到,在炸彈威脅信發(fā)來的時(shí)候,Tor 網(wǎng)絡(luò)的流量只來自一臺(tái)機(jī)器,而且是一個(gè)在校學(xué)生注冊(cè)的。雖然他們不能確定流量的最初源頭(只知道是通過 Tor 發(fā)送的),但是作案時(shí)間和注冊(cè)信息證據(jù)充分,而且那個(gè)時(shí)間段內(nèi)只有一臺(tái)機(jī)器是登錄狀態(tài),這就有充分理由起訴那個(gè)學(xué)生了。


          登錄 Tor 網(wǎng)絡(luò)不是一個(gè)自動(dòng)的匿名措施,也不能讓你進(jìn)入互聯(lián)網(wǎng)上任何區(qū)域。雖然它是一個(gè)實(shí)用的工具,但是用它的時(shí)候一定要謹(jǐn)慎、清醒,并且遵守道德規(guī)范。

          在 Python 里使用 Tor,需要先安裝運(yùn)行 Tor,下一節(jié)將介紹。Tor 服務(wù)很容易安裝和開啟。只要去 Tor 下載頁面下載并安裝,打開后連接就可以。不過要注意,當(dāng)你用 Tor 的時(shí)候網(wǎng)速會(huì)變慢。這是因?yàn)榇碛锌赡芤仍谌澜缇W(wǎng)絡(luò)上轉(zhuǎn)幾次才到目的地!

          PySocks

          PySocks 是一個(gè)非常簡(jiǎn)單的 Python 代理服務(wù)器通信模塊,它可以和 Tor 配合使用。你可以從它的網(wǎng)站(https://pypi.python.org/pypi/PySocks)上下載,或者使用任何第三方模塊管理器安裝。

          這個(gè)模塊的用法很簡(jiǎn)單。示例代碼如下所示。運(yùn)行的時(shí)候,Tor 服務(wù)必須運(yùn)行在 9150 端口(默認(rèn)值)上:

          網(wǎng)站 http://icanhazip.com/ 會(huì)顯示客戶端連接的網(wǎng)站服務(wù)器的 IP 地址,可以用來測(cè)試 Tor 是否正常運(yùn)行。當(dāng)程序執(zhí)行之后,顯示的 IP 地址就不是你原來的 IP 了。

          如果你想在 Tor 里面用 Selenium 和 PhantomJS,不需要 PySocks,只要保證 Tor 在運(yùn)行,然后增加 service_args參數(shù)設(shè)置代理端口,讓 Selenium 通過端口 9150 連接網(wǎng)站就可以了:

          和之前一樣,這個(gè)程序打印的 IP 地址也不是你原來的,而是你通過 Tor 客戶端獲得的 IP 地址。

          從網(wǎng)站主機(jī)運(yùn)行

          如果你擁有個(gè)人網(wǎng)站或公司網(wǎng)站,那么你可能已經(jīng)知道如何使用外部服務(wù)器運(yùn)行你的網(wǎng)絡(luò)爬蟲了。即使是一些相對(duì)封閉的網(wǎng)絡(luò)服務(wù)器,沒有可用的命令行接入方式,你也可以通過網(wǎng)頁界面對(duì)程序進(jìn)行控制。

          如果你的網(wǎng)站部署在 Linux 服務(wù)器上,應(yīng)該已經(jīng)運(yùn)行了 Python。如果你用的是 Windows 服務(wù)器,可能就沒那么幸運(yùn)了;你需要仔細(xì)檢查一下 Python 有沒有安裝,或者問問網(wǎng)管可不可以安裝。

          大多數(shù)小型網(wǎng)絡(luò)主機(jī)都會(huì)提供一個(gè)軟件叫 cPanel,提供網(wǎng)站管理和后臺(tái)服務(wù)的基本管理功能和信息。如果你接入了 cPanel,就可以設(shè)置 Python 在服務(wù)器上運(yùn)行——進(jìn)入“Apache Handlers”然后增加一個(gè) handler(如還沒有的話):

          這會(huì)告訴服務(wù)器所有的 Python 腳本都將作為一個(gè) CGI 腳本運(yùn)行。CGI 就是通用網(wǎng)關(guān)接口(Common Gateway Interface),是可以在服務(wù)器上運(yùn)行的任何程序,會(huì)動(dòng)態(tài)地生成內(nèi)容并顯示在網(wǎng)站上。把 Python 腳本顯式地定義成 CGI 腳本,就是給服務(wù)器權(quán)限去執(zhí)行 Python 腳本,而不只是在瀏覽器上顯示它們或者讓用戶下載它們。

          寫完 Python 腳本后上傳到服務(wù)器,然后把文件權(quán)限設(shè)置成 755,讓它可執(zhí)行。通過瀏覽器找到程序上傳的位置(也可以寫一個(gè)爬蟲來自動(dòng)做這件事情)就可以執(zhí)行程序。如果你擔(dān)心在公共領(lǐng)域執(zhí)行腳本不安全,可以采取以下兩種方法。

          • 把腳本存儲(chǔ)在一個(gè)隱晦或深層的 URL 里,確保其他 URL 鏈接都不能接入這個(gè)腳本,這樣可以避免搜索引擎發(fā)現(xiàn)它。

          • 用密碼保護(hù)腳本,或者在執(zhí)行腳本之前用密碼或加密令牌進(jìn)行確認(rèn)。

          確實(shí),通過這些原本主要是用來顯示網(wǎng)站的服務(wù)運(yùn)行 Python 腳本有點(diǎn)兒復(fù)雜。比如,你可能會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)爬蟲運(yùn)行時(shí)網(wǎng)站的加載速度變慢了。其實(shí),在整個(gè)采集任務(wù)完成之前頁面都是不會(huì)加載的(得等到所有“print”語句的輸出內(nèi)容都顯示完)。這可能會(huì)消耗幾分鐘,幾小時(shí),甚至永遠(yuǎn)也完成不了,要看程序的具體情況了。雖然它最終一定能完成任務(wù),但是可能你還想看到實(shí)時(shí)的結(jié)果,這樣就需要一臺(tái)真正的服務(wù)器了。

          從云主機(jī)運(yùn)行

          雖然云計(jì)算的花費(fèi)可能是無底洞,但是寫這篇文章時(shí),啟動(dòng)一個(gè)計(jì)算實(shí)例最便宜只要每小時(shí) 1.3 美分(亞馬遜 EC2 的 micro 實(shí)例,其他實(shí)例會(huì)更貴),Google 最便宜的計(jì)算實(shí)例是每小時(shí) 4.5 美分,最少需要用 10 分鐘??紤]計(jì)算能力的規(guī)模效應(yīng),從大公司買一個(gè)小型的云計(jì)算實(shí)例的費(fèi)用,和自己買一臺(tái)專業(yè)實(shí)體機(jī)的費(fèi)用應(yīng)該差不多——不過用云計(jì)算不需要雇人去維護(hù)設(shè)備。

          設(shè)置好計(jì)算實(shí)例之后,你就有了新 IP 地址、用戶名,以及可以通過 SSH 進(jìn)行實(shí)例連接的公私密鑰了。后面要做的每件事情,都應(yīng)該和你在實(shí)體服務(wù)器上干的事情一樣了——當(dāng)然,你不需要再擔(dān)心硬件維護(hù),也不用運(yùn)行復(fù)雜多余的監(jiān)控工具了。

          總結(jié)

          爬蟲被封禁常見原因列表

          如果你一直被網(wǎng)站封殺卻找不到原因,那么這里有個(gè)檢查列表,可以幫你診斷一下問題出在哪里。

          • 首先,檢查 JavaScript 。如果你從網(wǎng)絡(luò)服務(wù)器收到的頁面是空白的,缺少信息,或其遇到他不符合你預(yù)期的情況(或者不是你在瀏覽器上看到的內(nèi)容),有可能是因?yàn)榫W(wǎng)站創(chuàng)建頁面的JavaScript 執(zhí)行有問題。

          • 檢查正常瀏覽器提交的參數(shù)。如果你準(zhǔn)備向網(wǎng)站提交表單或發(fā)出POST請(qǐng)求,記得檢查一下頁面的內(nèi)容,看看你想提交的每個(gè)字段是不是都已經(jīng)填好,而且格式也正確。用 Chrome 瀏覽器的網(wǎng)絡(luò)面板(快捷鍵 F12 打開開發(fā)者控制臺(tái),然后點(diǎn)擊“Network”即可看到)查看發(fā)送到網(wǎng)站的POST命令,確認(rèn)你的每個(gè)參數(shù)都是正確的。

          • 是否有合法的 Cookie?如果你已經(jīng)登錄網(wǎng)站卻不能保持登錄狀態(tài),或者網(wǎng)站上出現(xiàn)了其他的“登錄狀態(tài)”異常,請(qǐng)檢查你的 cookie。確認(rèn)在加載每個(gè)頁面時(shí) cookie 都被正確調(diào)用,而且你的 cookie 在每次發(fā)起請(qǐng)求時(shí)都發(fā)送到了網(wǎng)站上。

          • IP 被封禁?如果你在客戶端遇到了 HTTP 錯(cuò)誤,尤其是 403 禁止訪問錯(cuò)誤,這可能說明網(wǎng)站已經(jīng)把你的 IP 當(dāng)作機(jī)器人了,不再接受你的任何請(qǐng)求。你要么等待你的 IP 地址從網(wǎng)站黑名單里移除,要么就換個(gè) IP 地址(可以去星巴克上網(wǎng))。如果你確定自己并沒有被封殺,那么再檢查下面的內(nèi)容。

            • 確認(rèn)你的爬蟲在網(wǎng)站上的速度不是特別快。快速采集是一種惡習(xí),會(huì)對(duì)網(wǎng)管的服務(wù)器造成沉重的負(fù)擔(dān),還會(huì)讓你陷入違法境地,也是 IP 被網(wǎng)站列入黑名單的首要原因。給你的爬蟲增加延遲,讓它們?cè)谝股钊遂o的時(shí)候運(yùn)行。切記:匆匆忙忙寫程序或收集數(shù)據(jù)都是拙劣項(xiàng)目管理的表現(xiàn);應(yīng)該提前做好計(jì)劃,避免臨陣慌亂。

            • 還有一件必須做的事情:修改你的請(qǐng)求頭!有些網(wǎng)站會(huì)封殺任何聲稱自己是爬蟲的訪問者。如果你不確定請(qǐng)求頭的值怎樣才算合適,就用你自己瀏覽器的請(qǐng)求頭吧。

            • 確認(rèn)你沒有點(diǎn)擊或訪問任何人類用戶通常不能點(diǎn)擊或接入的信息。

            • 如果你用了一大堆復(fù)雜的手段才接入網(wǎng)站,考慮聯(lián)系一下網(wǎng)管吧,告訴他們你的目的。試試發(fā)郵件到 webmaster@< 域名 > 或 admin@< 域名 >,請(qǐng)求網(wǎng)管允許你使用爬蟲采集數(shù)據(jù)。管理員也是人嘛!

          【以上內(nèi)容整理自《Python 網(wǎng)絡(luò)數(shù)據(jù)采集》第 10、12、14 章】

          作者:Ryan Mitchell

          譯者:陶俊杰,陳小莉

          定價(jià):59

          • 原書4.6星好評(píng),一本書搞定數(shù)據(jù)采集

          • 涵蓋數(shù)據(jù)抓取、數(shù)據(jù)挖掘和數(shù)據(jù)分析

          • 提供詳細(xì)代碼示例,快速解決實(shí)際問題

          網(wǎng)絡(luò)上的數(shù)據(jù)量越來越大,單靠瀏覽網(wǎng)頁獲取信息越來越困難,如何有效地提取并利用信息已成為一個(gè)巨大的挑戰(zhàn)。

          本書采用簡(jiǎn)潔強(qiáng)大的 Python 語言,介紹了網(wǎng)絡(luò)數(shù)據(jù)采集,并為采集新式網(wǎng)絡(luò)中的各種數(shù)據(jù)類型提供了全面的指導(dǎo)。第一部分重點(diǎn)介紹網(wǎng)絡(luò)數(shù)據(jù)采集的基本原理:如何用 Python 從網(wǎng)絡(luò)服務(wù)器請(qǐng)求信息,如何對(duì)服務(wù)器的響應(yīng)進(jìn)行基本處理,以及如何以自動(dòng)化手段與網(wǎng)站進(jìn)行交互。第二部分介紹如何用網(wǎng)絡(luò)爬蟲測(cè)試網(wǎng)站,自動(dòng)化處理,以及如何通過更多的方式接入網(wǎng)絡(luò)。

          對(duì)網(wǎng)絡(luò)數(shù)據(jù)采集及爬蟲技術(shù)、工具感興趣的朋友,歡迎加入以下微信群交流。

          高可用架構(gòu)-爬蟲技術(shù)交流

          長(zhǎng)按二維碼申請(qǐng)進(jìn)群,6 月 2 日之前有效

          Python 編程中,不可見零寬度字符可能會(huì)在各種場(chǎng)景下悄悄出現(xiàn),對(duì)文本處理造成干擾。這些字符在視覺上并不顯現(xiàn),但它們的存在可能會(huì)導(dǎo)致字符串比較失敗、正則表達(dá)式匹配錯(cuò)誤、編碼問題等多種問題。本文將深入探討這些字符的識(shí)別方法、處理策略以及實(shí)際應(yīng)用場(chǎng)景,并附上相應(yīng)的代碼示例。

          識(shí)別不可見零寬度字符

          識(shí)別不可見零寬度字符通常涉及到對(duì)字符編碼和 Unicode 標(biāo)準(zhǔn)的了解。Python 提供了多種工具和函數(shù)來幫助我們檢測(cè)這些字符。

          例如,我們可以使用 ord() 函數(shù)來檢查字符的 Unicode 碼點(diǎn),進(jìn)而判斷它是否為不可見零寬度字符。下面是一個(gè)簡(jiǎn)單的示例:

          def contains_zero_width_chars(s):
              for char in s:
                  # 檢查是否屬于零寬度字符的 Unicode 范圍
                  if ord(char) in range(8202, 8208):  # 舉例:零寬度字符范圍
                      return True
              return False
          
          
          text="Hello\u200bWorld"  # 包含一個(gè)零寬度空格
          print(contains_zero_width_chars(text))  # 輸出:True

          此外,正則表達(dá)式也是檢測(cè)不可見零寬度字符的強(qiáng)大工具。例如,我們可以使用 re 模塊來查找字符串中的零寬度空格:

          import re
          
          text="Hello\u200bWorld"  # 包含一個(gè)零寬度空格  
          zero_width_space=re.search(r'\u200b', text)
          
          if zero_width_space:
              print("Found zero-width space!")
          else:
              print("No zero-width space found.")

          處理不可見零寬度字符

          一旦識(shí)別出不可見零寬度字符,我們可以采取多種策略來處理它們,例如移除、替換或忽略這些字符。

          移除字符

          import re
          
          
          def remove_zero_width_chars(s):
              # 使用正則表達(dá)式替換所有零寬度字符為空字符串  
              return re.sub(r'[\u2000-\u200F]', '', s)
          
          
          text="Hello\u200bWorld"
          cleaned_text=remove_zero_width_chars(text)
          print(cleaned_text)  # 輸出:HelloWorld

          替換字符

          import re
          
          
          def replace_zero_width_chars(s, replacement=' '):
              # 使用正則表達(dá)式替換所有零寬度字符為指定字符  
              return re.sub(r'[\u2000-\u200F]', replacement, s)
          
          
          text="Hello\u200bWorld"
          replaced_text=replace_zero_width_chars(text)
          print(replaced_text)  # 輸出:Hello World

          應(yīng)用場(chǎng)景

          不可見零寬度字符在實(shí)際應(yīng)用中可能出現(xiàn)在多種場(chǎng)景,以下是一些例子:

          1. 文本處理與清洗
          在文本處理任務(wù)中,如自然語言處理、數(shù)據(jù)挖掘或搜索引擎中,清洗文本數(shù)據(jù)是非常重要的步驟。不可見零寬度字符可能會(huì)導(dǎo)致分詞錯(cuò)誤、關(guān)鍵詞匹配失敗等問題,因此需要在預(yù)處理階段進(jìn)行識(shí)別和清理。

          2. 網(wǎng)頁內(nèi)容爬取
          從網(wǎng)頁爬取文本時(shí),由于 HTML 或 CSS 的原因,可能會(huì)包含不可見零寬度字符。這些字符可能會(huì)影響后續(xù)的數(shù)據(jù)分析或展示,因此需要去除。

          3. 用戶輸入驗(yàn)證
          在接收用戶輸入時(shí),為確保數(shù)據(jù)的完整性和準(zhǔn)確性,需要檢查并處理不可見零寬度字符。這些字符可能是用戶無意中引入的,或者是惡意用戶為了繞過某些驗(yàn)證機(jī)制而故意插入的。

          4. 跨平臺(tái)文件傳輸
          在跨平臺(tái)文件傳輸或文本編輯過程中,由于不同平臺(tái)或軟件對(duì)字符編碼的處理差異,可能會(huì)引入不可見零寬度字符。在文件接收方,需要處理這些字符以確保數(shù)據(jù)的一致性。

          通過了解不可見零寬度字符的識(shí)別和處理方法,并結(jié)合實(shí)際應(yīng)用場(chǎng)景,我們可以更好地處理文本數(shù)據(jù),提高程序的健壯性和準(zhǔn)確性。在編寫代碼時(shí),應(yīng)該始終注意檢查和處理這些潛在的字符問題。


          主站蜘蛛池模板: 精品一区二区三区四区在线播放| 日韩人妻无码一区二区三区久久99 | 国产在线精品观看一区| 精品国产免费一区二区| 国产一区二区三区在线观看精品| 日韩AV无码一区二区三区不卡毛片| 亚州日本乱码一区二区三区| 亚洲福利一区二区精品秒拍| 国产福利在线观看一区二区| 亚洲国产高清在线精品一区| 亚洲av片一区二区三区| 亚洲综合无码一区二区痴汉 | 免费高清在线影片一区| 国产成人精品视频一区二区不卡| 无码精品一区二区三区| 射精专区一区二区朝鲜| 国产成人精品一区在线 | 国产精品电影一区二区三区| 亚洲一区二区三区首页| 日本欧洲视频一区| 精品一区二区三区高清免费观看 | 中文字幕一区二区三区久久网站| 国产一区二区三区四| 国产日韩视频一区| 国产一区内射最近更新| 成人精品一区久久久久| 精品一区二区高清在线观看| 国产在线一区观看| 国产福利电影一区二区三区久久久久成人精品综合 | 国产一区二区三区免费| a级午夜毛片免费一区二区| AV怡红院一区二区三区| 一区二区视频在线播放| 蜜桃无码AV一区二区| 国产精品视频一区国模私拍| 国产在线视频一区二区三区| 国产成人精品第一区二区| 久久99精品国产一区二区三区| 无码精品人妻一区二区三区中| 久久久一区二区三区| 亚洲国产AV无码一区二区三区|