777奇米影视色888成人-777奇米影视视频在线播放-777奇米影视网-777奇米影音-777色狠狠一区二区三区-777色狠狠一区二区三区香蕉

資訊

IT'S A SERVICE THAT TOUCHES YOU

吸引你的也許是品牌,感動(dòng)你的絕對(duì)是服務(wù)

首頁>>資訊>>常見問題 > 為什么很多企業(yè)網(wǎng)站做好之后搜索引擎蜘蛛網(wǎng)不能抓取

為什么很多企業(yè)網(wǎng)站做好之后搜索引擎蜘蛛網(wǎng)不能抓取

為什么很多企業(yè)網(wǎng)站做好之后搜索引擎蜘蛛網(wǎng)不能抓取

資訊分類:常見問題 | 文章編輯:陳婷 | 發(fā)布日期:2020-01-19 | 瀏覽量:3072次

為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法,網(wǎng)站防采集的前提就是要正確地區(qū)分人類訪問用戶和網(wǎng)絡(luò)機(jī)器人。雖然網(wǎng)站可以使用很多識(shí)別技術(shù)(比如驗(yà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ù))。


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


雖然網(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ī),卻沒有大量的翻譯文本來測試它的效果。很多大型網(wǎng)站都會(huì)為同樣的內(nèi)容提供不同的語言翻譯,根據(jù)請(qǐng)求頭的參數(shù)響應(yīng)網(wǎng)站不同的語言版本。因此,你只要簡單地把請(qǐng)求頭屬性從 Accept-Language:en-US修改成Accept-Language:fr,就可以從網(wǎng)站上獲得“Bonjour”(法語,你好)這些數(shù)據(jù)來改善翻譯機(jī)的翻譯效果了(大型跨國企業(yè)通常都是好的采集對(duì)象)。


請(qǐng)求頭還可以讓網(wǎng)站改變內(nèi)容的布局樣式。例如,用移動(dòng)設(shè)備瀏覽網(wǎng)站時(shí),通常會(huì)看到一個(gè)沒有廣告、Flash 以及其他干擾的簡化的網(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)化測試而開發(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庫,也可以用第三方管理器(像pip)用命令行安裝。


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


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


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


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


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


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


點(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 之類的測試工具已經(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ù)器傳送大量的信息。


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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)前生成的表單變量只被使用一次或是最近生成的(這樣可以避免變量被簡單地存儲(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è)隱含字段:


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


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


第一個(gè)鏈接是通過簡單的 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)容,然后查找隱含鏈接和隱含輸入字段:


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


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


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


為何大量網(wǎng)站不能抓取?爬蟲突破封禁的6種常見方法


點(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è)地址給你寫信:“美國華盛頓特區(qū)賓夕法尼亞大道西北 1600 號(hào),總統(tǒng),郵編 20500。”但是,如果這封信是從新墨西哥州的阿爾伯克基市發(fā)來的,那么你肯定可以確信給你寫信的不是美國總統(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)控問題的增長。


因?yàn)榉?wù)器需要根據(jù) IP 地址訪問列表去檢查每個(gè)準(zhǔn)備接收的數(shù)據(jù)包,所以檢查接收數(shù)據(jù)包時(shí)會(huì)額外增加一些處理時(shí)間。多個(gè) IP 地址乘以海量的數(shù)據(jù)包更會(huì)使檢查時(shí)間指數(shù)級(jí)增長。為了降低處理時(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)我還在美國麻省歐林工程學(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)用戶的訪問量。


卓商網(wǎng)-聯(lián)系方式

東莞公司
服務(wù)熱線:0769-89801111(總機(jī))
地址:東莞市南城區(qū)莞太路60號(hào)星鵬商務(wù)大廈B座8樓
深圳公司
服務(wù)熱線:400-800-2455(免長途費(fèi))
地址:深圳市龍崗區(qū)布吉街道大都匯大廈B座1605室
惠州公司
服務(wù)熱線:13549397005(陳婷)
地址:惠州市惠城區(qū)麥科特大道69號(hào)達(dá)利大廈1807室
廣州公司
服務(wù)熱線:18607694001(馬先生)
地址:廣東省廣州市白云區(qū)機(jī)場路匯創(chuàng)意產(chǎn)業(yè)園A4棟206室
湖南公司
服務(wù)熱線:18607314008(胡先生)
地址:湖南長沙市岳麓區(qū)學(xué)士路8號(hào)含浦科教綜合樓601室

—— 卓商網(wǎng)微信公眾號(hào) ——