1. 程式人生 > >Python爬蟲突破封禁的6種常見方法

Python爬蟲突破封禁的6種常見方法

在網際網路上進行自動資料採集(抓取)這件事和網際網路存在的時間差不多一樣長。今天大眾好像更傾向於用“網路資料採集”,有時會把網路資料採集程式稱為網路機器人(bots)。最常用的方法是寫一個自動化程式向網路伺服器請求資料(通常是用HTML表單或其他網頁檔案),然後對資料進行解析,提取需要的資訊。

本文假定讀者已經瞭解如何用程式碼來抓取一個遠端的URL,並具備表單如何提交及JavaScript在瀏覽器如何執行的機制。想更多瞭解網路資料採集基礎知識,可以參考文後的資料。

在採集網站的時會遇到一些比資料顯示在瀏覽器上卻抓取不出來更令人沮喪的事情。也許是向伺服器提交自認為已經處理得很好的表單卻被拒絕,也許是自己的IP地址不知道什麼原因直接被網站封殺,無法繼續訪問。

圖片1

原因可能是一些最複雜的bug,也可能是這些bug讓人意想不到(程式在一個網站上可以正常使用,但在另一個看起來完全一樣的網站上卻用不了)。最有可能出現的情況是:對方有意不讓爬蟲抓取資訊。網站已經把你定性為一個網路機器人直接拒絕了,你無法找出原因。

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

網路爬蟲的道德與禮儀

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

  • 白帽子工作。在採集那些不想被採集的網站時,其實存在一些非常符合道德和法律規範的理由。比如我之前的工作就是做網路爬蟲,我曾做過一個自動資訊收集器,從未經許可的網站上自動收集客戶的名稱、地址、電話號碼和其他個人資訊,然後把採集的資訊提交到網站上,讓伺服器刪除這些客戶資訊。為了避免競爭,這些網站都會對網路爬蟲嚴防死守。但是,我的工作要確保公司的客戶們都匿名(這些人都是家庭暴力受害者,或者因其他正當理由想保持低調的人),這為網路資料採集工作創造了極其合理的條件,我很高興自己有能力從事這項工作。 
  • 雖然不太可能建立一個完全“防爬蟲”的網站(最起碼得讓合法的使用者可以方便地訪問網站),但我還是希望以下內容可以幫助人們保護自己的網站不被惡意攻擊。下文將指出每一種網路資料採集技術的缺點,你可以利用這些缺點保護自己的網站
    。其實,大多數網路機器人一開始都只能做一些寬泛的資訊和漏洞掃描,接下來介紹的幾個簡單技術就可以擋住99%的機器人。但是,它們進化的速度非常快,最好時刻準備迎接新的攻擊。 
  • 和大多數程式設計師一樣,我從來不相信禁止某一類資訊的傳播就可以讓世界變得更和諧

閱讀之前,請牢記: 這裡演示的許多程式和介紹的技術都不應該在網站上使用。

爬蟲黑科技:網路機器人看起來像人類使用者的一些方法

網站防採集的前提就是要正確地區分人類訪問使用者和網路機器人。雖然網站可以使用很多識別技術(比如驗證碼)來防止爬蟲,但還是有一些十分簡單的方法,可以讓你的網路機器人看起來更像人類訪問使用者。

1. 構造合理的HTTP請求頭

除了處理網站表單,requests模組還是一個設定請求頭的利器。HTTP的請求頭是在你每次向網路伺服器傳送請求時,傳遞的一組屬性和配置資訊。HTTP定義了十幾種古怪的請求頭型別,不過大多數都不常用。只有下面的七個欄位被大多數瀏覽器用來初始化所有網路請求(表中資訊是我自己瀏覽器的資料)。

圖片2

經典的Python爬蟲在使用urllib標準庫時,都會發送如下的請求頭:

圖片3

如果你是一個防範爬蟲的網站管理員,你會讓哪個請求頭訪問你的網站呢?

安裝Requests

  • 可在模組的網站上找到下載連結
  • (http://docs.python-requests.org/en/latest/user/install/)和安裝方法,或者用任意第三方Python模組安裝器進行安裝。

請求頭可以通過requests模組進行自定義。https://www.whatismybrowser.com/網站就是一個非常棒的網站,可以讓伺服器測試瀏覽器的屬性。我們用下面的程式來採集這個網站的資訊,驗證我們瀏覽器的cookie設定:

圖片4

程式輸出結果中的請求頭應該和程式中設定的headers是一樣的。

雖然網站可能會對HTTP請求頭的每個屬性進行“是否具有人性”的檢查,但是我發現通常真正重要的引數就是User-Agent。無論做什麼專案,一定要記得把User-Agent屬性設定成不容易引起懷疑的內容,不要用Python-urllib/3.4。另外,如果你正在處理一個警覺性非常高的網站,就要注意那些經常用卻很少檢查的請求頭,比如Accept-Language屬性,也許它正是那個網站判斷你是個人類訪問者的關鍵。

請求頭會改變你觀看網路世界的方式 
假設你想為一個機器學習的研究專案寫一個語言翻譯機,卻沒有大量的翻譯文字來測試它的效果。很多大型網站都會為同樣的內容提供不同的語言翻譯,根據請求頭的引數響應網站不同的語言版本。因此,你只要簡單地把請求頭屬性從Accept-Language:en-US修改成Accept-Language:fr,就可以從網站上獲得“Bonjour”(法語,你好)這些資料來改善翻譯機的翻譯效果了(大型跨國企業通常都是好的採集物件)。 
請求頭還可以讓網站改變內容的佈局樣式。例如,用移動裝置瀏覽網站時,通常會看到一個沒有廣告、Flash以及其他干擾的簡化的網站版本。因此,把你的請求頭User-Agent改成下面這樣,就可以看到一個更容易採集的網站了! 
User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 712 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

2. 設定cookie的學問

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

在採集一些網站時cookie是不可或缺的。要在一個網站上持續保持登入狀態,需要在多個頁面中儲存一個cookie。有些網站不要求在每次登入時都獲得一個新cookie,只要儲存一箇舊的“已登入”的cookie就可以訪問。

如果你在採集一個或者幾個目標網站,建議你檢查這些網站生成的cookie,然後想想哪一個cookie是爬蟲需要處理的。有一些瀏覽器外掛可以為你顯示訪問網站和離開網站時cookie是如何設定的。EditThisCookie(http://www.editthiscookie.com/)是我最喜歡的Chrome瀏覽器外掛之一。

因為requests模組不能執行JavaScript,所以它不能處理很多新式的跟蹤軟體生成的cookie,比如GoogleAnalytics,只有當客戶端指令碼執行後才設定cookie(或者在使用者瀏覽頁面時基於網頁事件產生cookie,比如點選按鈕)。要處理這些動作,需要用Selenium和PhantomJS包。

Selenium與PhantomJS 
Selenium(http://www.seleniumhq.org/)是一個強大的網路資料採集工具,最初是為網站自動化測試而開發的。近幾年,它還被廣泛用於獲取精確的網站快照,因為它們可以直接執行在瀏覽器上。Selenium可以讓瀏覽器自動載入頁面,獲取需要的資料,甚至頁面截圖,或者判斷網站上某些動作是否發生。 
Selenium自己不帶瀏覽器,它需要與第三方瀏覽器結合在一起使用。例如,如果你在Firefox上執行Selenium,可以直接看到Firefox視窗被開啟,進入網站,然後執行你在程式碼中設定的動作。雖然這樣可以看得更清楚,但是我更喜歡讓程式在後臺執行,所以我PhantomJS(http://phantomjs.org/download.html)代替真實的瀏覽器。 
PhantomJS是一個“無頭”(headless)瀏覽器。它會把網站載入到記憶體並執行頁面上的JavaScript,但不會向用戶展示網頁的圖形介面。將Selenium和PhantomJS結合在一起,就可以執行一個非常強大的網路爬蟲了,可以處理cookie、JavaScrip、header,以及任何你需要做的事情。 
可以從PyPI網站(https://pypi.python.org/simple/selenium/)下載Selenium庫,也可以用第三方管理器(像pip)用命令列安裝。

你可以對任意網站(本例用的是http://pythonscraping.com)呼叫webdriver的get_cookie()方法來檢視cookie:

圖片5

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

圖片6

還可以呼叫deletecookie()、addcookie()和deleteallcookies()方法來處理cookie。另外,還可以儲存cookie以備其他網路爬蟲使用。下面的例子演示瞭如何把這些函式組合在一起:

圖片7

在這個例子中,第一個webdriver獲得了一個網站,列印cookie並把它們儲存到變數savedCookies裡。第二個webdriver載入同一個網站(技術提示:必須首先載入網站,這樣Selenium才能知道cookie屬於哪個網站,即使載入網站的行為對我們沒任何用處),刪除所有的cookie,然後替換成第一個webdriver得到的cookie。當再次載入這個頁面時,兩組cookie的時間戳、原始碼和其他資訊應該完全一致。從GoogleAnalytics的角度看,第二個webdriver現在和第一個webdriver完全一樣。

3. 正常的時間訪問路徑

有一些防護措施完備的網站可能會阻止你快速地提交表單,或者快速地與網站進行互動。即使沒有這些安全措施,用一個比普通人快很多的速度從一個網站下載大量資訊也可能讓自己被網站封殺。

因此,雖然多執行緒程式可能是一個快速載入頁面的好辦法——在一個執行緒中處理資料,另一個執行緒中載入頁面——但是這對編寫好的爬蟲來說是恐怖的策略。還是應該儘量保證一次載入頁面載入且資料請求最小化。如果條件允許,儘量為每個頁面訪問增加一點兒時間間隔,即使你要增加一行程式碼:

**

time.sleep(3)
(小編:3 + 隨機數 是不是更好一些?)

**

合理控制速度是你不應該破壞的規則。過度消耗別人的伺服器資源會讓你置身於非法境地,更嚴重的是這麼做可能會把一個小型網站拖垮甚至下線。拖垮網站是不道德的,是徹頭徹尾的錯誤。所以請控制採集速度!

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

許多像Litmus之類的測試工具已經用了很多年了,現在仍用於區分網路爬蟲和使用瀏覽器的人類訪問者,這類手段都取得了不同程度的效果。雖然網路機器人下載一些公開的文章和博文並不是什麼大事,但是如果網路機器人在你的網站上創造了幾千個賬號並開始向所有使用者傳送垃圾郵件,就是一個大問題了。網路表單,尤其是那些用於賬號建立和登入的網站,如果被機器人肆意地濫用,網站的安全和流量費用就會面臨嚴重威脅,因此努力限制網站的接入是最符合許多網站所有者的利益的(至少他們這麼認為)。

這些集中在表單和登入環節上的反機器人安全措施,對網路爬蟲來說確實是嚴重的挑戰。

4. 注意隱含輸入欄位值

在HTML表單中,“隱含”欄位可以讓欄位的值對瀏覽器可見,但是對使用者不可見(除非看網頁原始碼)。隨著越來越多的網站開始用cookie儲存狀態變數來管理使用者狀態,在找到另一個最佳用途之前,隱含欄位主要用於阻止爬蟲自動提交表單。

下圖顯示的例子就是Facebook登入頁面上的隱含欄位。雖然表單裡只有三個可見欄位(username、password和一個確認按鈕),但是在原始碼裡表單會向伺服器傳送大量的資訊。

圖片8

Facebook登入頁面上的隱含欄位

用隱含欄位阻止網路資料採集的方式主要有兩種。第一種是表單頁面上的一個欄位可以用伺服器生成的隨機變量表示。如果提交時這個值不在表單處理頁面上,伺服器就有理由認為這個提交不是從原始表單頁面上提交的,而是由一個網路機器人直接提交到表單處理頁面的。繞開這個問題的最佳方法就是,首先採集表單所在頁面上生成的隨機變數,然後再提交到表單處理頁面。

第二種方式是“蜜罐”(honey pot)。如果表單裡包含一個具有普通名稱的隱含欄位(設定蜜罐圈套),比如“使用者名稱”(username)或“郵箱地址”(email address),設計不太好的網路機器人往往不管這個欄位是不是對使用者可見,直接填寫這個欄位並向伺服器提交,這樣就會中伺服器的蜜罐圈套。伺服器會把所有隱含欄位的真實值(或者與表單提交頁面的預設值不同的值)都忽略,而且填寫隱含欄位的訪問使用者也可能被網站封殺。

總之,有時檢查表單所在的頁面十分必要,看看有沒有遺漏或弄錯一些伺服器預先設定好的隱含欄位(蜜罐圈套)。如果你看到一些隱含欄位,通常帶有較大的隨機字串變數,那麼很可能網路伺服器會在表單提交的時候檢查它們。另外,還有其他一些檢查,用來保證這些當前生成的表單變數只被使用一次或是最近生成的(這樣可以避免變數被簡單地儲存到一個程式中反覆使用)。

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

雖然在進行網路資料採集時用CSS屬性區分有用資訊和無用資訊會很容易(比如,通過讀取id和class標籤獲取資訊),但這麼做有時也會出問題。如果網路表單的一個欄位通過CSS設定成對使用者不可見,那麼可以認為普通使用者訪問網站的時候不能填寫這個欄位,因為它沒有顯示在瀏覽器上。如果這個欄位被填寫了,就可能是機器人乾的,因此這個提交會失效。

這種手段不僅可以應用在網站的表單上,還可以應用在連結、圖片、檔案,以及一些可以被機器人讀取,但普通使用者在瀏覽器上卻看不到的任何內容上面。訪問者如果訪問了網站上的一個“隱含”內容,就會觸發伺服器指令碼封殺這個使用者的IP地址,把這個使用者踢出網站,或者採取其他措施禁止這個使用者接入網站。實際上,許多商業模式就是在幹這些事情。

下面的例子所用的網頁在http://pythonscraping.com/pages/itsatrap.html。這個頁面包含了兩個連結,一個通過CSS隱含了,另一個是可見的。另外,頁面上還包括兩個隱含欄位:

圖片9

這三個元素通過三種不同的方式對使用者隱藏:

  • 第一個連結是通過簡單的CSS屬性設定display:none進行隱藏
  • 電話號碼欄位name="phone"是一個隱含的輸入欄位
  • 郵箱地址欄位name="email"是將元素向右移動50 000畫素(應該會超出電腦顯示器的邊界)並隱藏滾動條

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

例如,下面的程式碼示例就是獲取前面那個頁面的內容,然後查詢隱含連結和隱含輸入欄位:

圖片10

Selenium抓取出了每個隱含的連結和欄位,結果如下所示:

圖片11

雖然你不太可能會去訪問你找到的那些隱含連結,但是在提交前,記得確認一下那些已經在表單中、準備提交的隱含欄位的值(或者讓Selenium為你自動提交)。

使用遠端伺服器來避免IP封鎖

啟用遠端平臺的人通常有兩個目的:對更大計算能力和靈活性的需求,以及對可變IP地址的需求。

6.使用可變的遠端IP地址

建立網路爬蟲的第一原則是:所有資訊都可以偽造。你可以用非本人的郵箱傳送郵件,通過命令列自動化滑鼠的行為,或者通過IE 5.0瀏覽器耗費網站流量來嚇唬網管。

但是有一件事情是不能作假的,那就是你的IP地址。任何人都可以用這個地址給你寫信:“美國華盛頓特區賓夕法尼亞大道西北1600號,總統,郵編20500。”但是,如果這封信是從新墨西哥州的阿爾伯克基市發來的,那麼你肯定可以確信給你寫信的不是美國總統。

從技術上說,IP地址是可以通過傳送資料包進行偽裝的,就是分散式拒絕服務攻擊技術(Distributed Denial of Service,DDoS),攻擊者不需要關心接收的資料包(這樣傳送請求的時候就可以使用假IP地址)。但是網路資料採集是一種需要關心伺服器響應的行為,所以我們認為IP地址是不能造假的。

阻止網站被採集的注意力主要集中在識別人類與機器人的行為差異上面。封殺IP地址這種矯枉過正的行為,就好像是農民不靠噴農藥給莊稼殺蟲,而是直接用火燒徹底解決問題。它是最後一步棋,不過是一種非常有效的方法,只要忽略危險IP地址發來的資料包就可以了。但是,使用這種方法會遇到以下幾個問題。

  • IP地址訪問列表很難維護。雖然大多數大型網站都會用自己的程式自動管理IP地址訪問列表(機器人封殺機器人),但是至少需要人偶爾檢查一下列表,或者至少要監控問題的增長。 
    • 因為伺服器需要根據I地址訪問列表去檢查每個準備接收的資料包,所以檢查接收資料包時會額外增加一些處理時間。多個IP地址乘以海量的資料包更會使檢查時間指數級增長。為了降低處理時間和處理複雜度,管理員通常會對IP地址進行分組管理並制定相應的規則,比如如果這組IP中有一些危險分子就“把這個區間的所有256個地址全部封殺”。於是產生了下一個問題。 
    • 封殺IP地址可能會導致意外後果。例如,當我還在美國麻省歐林工程學院讀本科的時候,有個同學寫了一個可以在http://digg.com/網站(在Reddit流行之前大家都用Digg)上對熱門內容進行投票的軟體。這個軟體的伺服器IP地址被Digg封殺,導致整個網站都不能訪問。於是這個同學就把軟體移到了另一個伺服器上,而Digg自己卻失去了許多主要目標使用者的訪問量。

雖然有這些缺點,但封殺IP地址依然是一種十分常用的手段,伺服器管理員用它來阻止可疑的網路爬蟲入侵伺服器。

Tor代理伺服器

洋蔥路由(The Onion Router)網路,常用縮寫為Tor,是一種IP地址匿名手段。由網路志願者伺服器構建的洋蔥路由器網路,通過不同伺服器構成多個層(就像洋蔥)把客戶端包在最裡面。資料進入網路之前會被加密,因此任何伺服器都不能偷取通訊資料。另外,雖然每一個伺服器的入站和出站通訊都可以被查到,但是要想查出通訊的真正起點和終點,必須知道整個通訊鏈路上所有伺服器的入站和出站通訊細節,而這基本是不可能實現的。

Tor匿名的侷限性

>

雖然我們在本文中用Tor的目的是改變IP地址,而不是實現完全匿名,但有必要關注一下Tor匿名方法的能力和不足。 
雖然Tor網路可以讓你訪問網站時顯示的IP地址是一個不能跟蹤到你的IP地址,但是你在網站上留給伺服器的任何資訊都會暴露你的身份。例如,你登入Gmail賬號後再用Google搜尋,那些搜尋歷史就會和你的身份繫結在一起。 
另外,登入Tor的行為也可能讓你的匿名狀態處於危險之中。2013年12月,一個哈佛大學本科生想逃避期末考試,就用一個匿名郵箱賬號通過Tor網路給學校發了一封炸彈威脅信。結果哈佛大學的IT部門通過日誌查到,在炸彈威脅信發來的時候,Tor網路的流量只來自一臺機器,而且是一個在校學生註冊的。雖然他們不能確定流量的最初源頭(只知道是通過Tor傳送的),但是作案時間和註冊資訊證據充分,而且那個時間段內只有一臺機器是登入狀態,這就有充分理由起訴那個學生了。 
登入Tor網路不是一個自動的匿名措施,也不能讓你進入網際網路上任何區域。雖然它是一個實用的工具,但是用它的時候一定要謹慎、清醒,並且遵守道德規範。

在Python裡使用Tor,需要先安裝執行Tor,下一節將介紹。Tor服務很容易安裝和開啟。只要去Tor下載頁面下載並安裝,開啟後連線就可以。不過要注意,當你用Tor的時候網速會變慢。這是因為代理有可能要先在全世界網路上轉幾次才到目的地!

PySocks

PySocks是一個非常簡單的Python代理伺服器通訊模組,它可以和Tor配合使用。你可以從它的網站(https://pypi.python.org/pypi/PySocks)上下載,或者使用任何第三方模組管理器安裝。

這個模組的用法很簡單。示例程式碼如下所示。執行的時候,Tor服務必須執行在9150埠(預設值)上:

圖片12

網站http://icanhazip.com/會顯示客戶端連線的網站伺服器的IP地址,可以用來測試Tor是否正常執行。當程式執行之後,顯示的IP地址就不是你原來的IP了。

如果你想在Tor裡面用Selenium和PhantomJS,不需要PySocks,只要保證Tor在執行,然後增加service_args引數設定代理埠,讓Selenium通過埠9150連線網站就可以了:

圖片13

和之前一樣,這個程式列印的IP地址也不是你原來的,而是你通過Tor客戶端獲得的IP地址。

從網站主機執行

如果你擁有個人網站或公司網站,那麼你可能已經知道如何使用外部伺服器執行你的網路爬蟲了。即使是一些相對封閉的網路伺服器,沒有可用的命令列接入方式,你也可以通過網頁介面對程式進行控制。

如果你的網站部署在Linux伺服器上,應該已經運行了Python。如果你用的是Windows伺服器,可能就沒那麼幸運了;你需要仔細檢查一下Python有沒有安裝,或者問問網管可不可以安裝。

大多數小型網路主機都會提供一個軟體叫cPanel,提供網站管理和後臺服務的基本管理功能和資訊。如果你接入了cPanel,就可以設定Python在伺服器上執行——進入“Apache Handlers”然後增加一個handler(如還沒有的話):

圖片14

這會告訴伺服器所有的Python指令碼都將作為一個CGI指令碼執行。CGI就是通用閘道器介面(Common Gateway Interface),是可以在伺服器上執行的任何程式,會動態地生成內容並顯示在網站上。把Python指令碼顯式地定義成CGI指令碼,就是給伺服器許可權去執行Python指令碼,而不只是在瀏覽器上顯示它們或者讓使用者下載它們。

寫完Python指令碼後上傳到伺服器,然後把檔案許可權設定成755,讓它可執行。通過瀏覽器找到程式上傳的位置(也可以寫一個爬蟲來自動做這件事情)就可以執行程式。如果你擔心在公共領域執行指令碼不安全,可以採取以下兩種方法。

  • 把指令碼儲存在一個隱晦或深層的URL裡,確保其他URL連結都不能接入這個指令碼,這樣可以避免搜尋引擎發現它。
  • 用密碼保護指令碼,或者在執行指令碼之前用密碼或加密令牌進行確認。

確實,通過這些原本主要是用來顯示網站的服務執行Python指令碼有點兒複雜。比如,你可能會發現網路爬蟲執行時網站的載入速度變慢了。其實,在整個採集任務完成之前頁面都是不會載入的(得等到所有“print”語句的輸出內容都顯示完)。這可能會消耗幾分鐘,幾小時,甚至永遠也完成不了,要看程式的具體情況了。雖然它最終一定能完成任務,但是可能你還想看到實時的結果,這樣就需要一臺真正的伺服器了。

從雲主機執行

雖然雲端計算的花費可能是無底洞,但是寫這篇文章時,啟動一個計算例項最便宜只要每小時1.3美分(亞馬遜EC2的micro例項,其他例項會更貴),Google最便宜的計算例項是每小時4.5美分,最少需要用10分鐘。考慮計算能力的規模效應,從大公司買一個小型的雲端計算例項的費用,和自己買一臺專業實體機的費用應該差不多——不過用雲端計算不需要僱人去維護裝置。

設定好計算例項之後,你就有了新IP地址、使用者名稱,以及可以通過SSH進行例項連線的公私金鑰了。後面要做的每件事情,都應該和你在實體伺服器上乾的事情一樣了——當然,你不需要再擔心硬體維護,也不用運行復雜多餘的監控工具了。

總結:爬蟲被封禁常見原因列表

如果你一直被網站封殺卻找不到原因,那麼這裡有個檢查列表,可以幫你診斷一下問題出在哪裡。

  • 首先,檢查JavaScript。如果你從網路伺服器收到的頁面是空白的,缺少資訊,或其遇到他不符合你預期的情況(或者不是你在瀏覽器上看到的內容),有可能是因為網站建立頁面的JavaScript執行有問題。 
  • 檢查正常瀏覽器提交的引數。如果你準備向網站提交表單或發出POST請求,記得檢查一下頁面的內容,看看你想提交的每個欄位是不是都已經填好,而且格式也正確。用Chrome瀏覽器的網路面板(快捷鍵F12開啟開發者控制檯,然後點選“Network”即可看到)檢視傳送到網站的POST命令,確認你的每個引數都是正確的。 
  • 是否有合法的Cookie?如果你已經登入網站卻不能保持登入狀態,或者網站上出現了其他的“登入狀態”異常,請檢查你的cookie。確認在載入每個頁面時cookie都被正確呼叫,而且你的cookie在每次發起請求時都發送到了網站上。 
  • IP被封禁?如果你在客戶端遇到了HTTP錯誤,尤其是403禁止訪問錯誤,這可能說明網站已經把你的IP當作機器人了,不再接受你的任何請求。你要麼等待你的IP地址從網站黑名單裡移除,要麼就換個IP地址(可以去星巴克上網)。如果你確定自己並沒有被封殺,那麼再檢查下面的內容。 
  • 確認你的爬蟲在網站上的速度不是特別快。快速採集是一種惡習,會對網管的伺服器造成沉重的負擔,還會讓你陷入違法境地,也是IP被網站列入黑名單的首要原因。給你的爬蟲增加延遲,讓它們在夜深人靜的時候執行。切記:匆匆忙忙寫程式或收集資料都是拙劣專案管理的表現;應該提前做好計劃,避免臨陣慌亂。 
  • 還有一件必須做的事情:修改你的請求頭!有些網站會封殺任何聲稱自己是爬蟲的訪問者。如果你不確定請求頭的值怎樣才算合適,就用你自己瀏覽器的請求頭吧。 
  • 確認你沒有點選或訪問任何人類使用者通常不能點選或接入的資訊。 
  • 如果你用了一大堆複雜的手段才接入網站,考慮聯絡一下網管吧,告訴他們你的目的。試試發郵件到[email protected]<域名>或[email protected]<域名>,請求網管允許你使用爬蟲採集資料。管理員也是人嘛!

【以上內容整理自《Python 網路資料採集》第10、12、14章】

圖片15

作者:Ryan Mitchell 譯者:陶俊傑,陳小莉 定價:59

原書4.6星好評,一本書搞定資料採集 涵蓋資料抓取、資料探勘和資料分析 提供詳細程式碼示例,快速解決實際問題

網路上的資料量越來越大,單靠瀏覽網頁獲取資訊越來越困難,如何有效地提取並利用資訊已成為一個巨大的挑戰。 本書採用簡潔強大的Python語言,介紹了網路資料採集,併為採集新式網路中的各種資料型別提供了全面的指導。第一部分重點介紹網路資料採集的基本原理:如何用Python從網路伺服器請求資訊,如何對伺服器的響應進行基本處理,以及如何以自動化手段與網站進行互動。第二部分介紹如何用網路爬蟲測試網站,自動化處理,以及如何通過更多的方式接入網路。

本文由圖靈教育授權「高可用架構」發表。轉載請註明來自高可用架構「ArchNotes」微信公眾號。

相關推薦

Python爬蟲突破6常見方法

在網際網路上進行自動資料採集(抓取)這件事和網際網路存在的時間差不多一樣長。今天大眾好像更傾向於用“網路資料採集”,有時會把網路資料採集程式稱為網路機器人(bots)。最常用的方法是寫一個自動化程式向網路伺服器請求資料(通常是用HTML表單或其他網頁檔案),然後對資料進行解析

為何大量網站不能抓取?爬蟲突破6常見方法 - 轉載

9.png 禁止 asi 屬於 用戶訪問 文件權限設置 初始化 大型 右移 傳送門:http://www.cnblogs.com/junrong624/p/5533655.html 在互聯網上進行自動數據采集(抓取)這件事和互聯網存在的時間差不多一樣長。今天大眾好像更傾向於

爬蟲突破6常見方法

內容整理自《Python 網路資料採集》第 10、12、14 章 在網際網路上進行自動資料採集(抓取)這件事和網際網路存在的時間差不多一樣長。今天大眾好像更傾向於用“網路資料採集”,有時會把網路資料採集程式稱為網路機器人(bots)。最常用的方法是寫一個自動化程式向網路

為何大量網站不能抓取?爬蟲突破6常見方法

在網際網路上進行自動資料採集(抓取)這件事和網際網路存在的時間差不多一樣長。今天大眾好像更傾向於用“網路資料採集”,有時會把網路資料採集程式稱為網路機器人(bots)。最常用的方法是寫一個自動化程式向網路伺服器請求資料(通常是用 HTML 表單或其他網頁檔案),然後對資料進行

爬蟲突破常用方法

好的 ip) mozilla like 源代碼 查看 驗證 需求 服務器 在互聯網上進行自動數據采集(抓取)這件事和互聯網存在的時間差不多一樣長。今天大眾好像更傾向於用“網絡數據采集”,有時會把網絡數據采集程序稱為網絡機器人(bots)。最常用的方法

6常見項目溝通方式的比較

6種常見項目溝通方式分別是文檔溝通、郵件溝通、及時通訊溝通、電話溝通、面對面溝通和會議溝通。通過了解這6種常見項目溝通方式的優缺點,能夠更便於項目管理者更加靈活應用這些溝通方式,在合適場合用合適溝通方式來進行溝通,溝通效果更棒。 項目中常見的溝通方式: 1 文檔溝通:

C#中的6常見的集合

行動 元素 rem 大小 for 轉換 contain demo 索引 1.動態數組(ArrayList)   動態數組(ArrayList)代表了可被單獨索引的對象的有序集合。它基本上可以替代一個數組。但是,與數組不同的是,您可以使用索引在指定的位置添加和移除項目,動態數

python爬蟲-基礎入門-python爬蟲突破封鎖

python爬蟲-基礎入門-python爬蟲突破封鎖 >> 相關概念     >> request概念:是從客戶端向伺服器發出請求,包括使用者提交的資訊及客戶端的一些資訊。客戶端可通過HTML表單或在網頁地址後面提供引數的方法提交資料。讓後通過request物件的相關方

乾貨|爬蟲的幾個常見原因

爬蟲採集成為很多公司企業個人的需求,但正因為如此,反爬蟲的技術也層出不窮,像時間限制、IP限制、驗證碼限制等等,都可能會導致爬蟲無法進行,所以也出現了很多像代理IP、時間限制調整這樣的方法去接觸反爬蟲限制,當然具體的操作方法需要你針對性的去研究。 爬蟲採集資料過程中經常會出現受限問題,那麼具

Python爬蟲解析網頁的三方法,lxml、BeautifulSoup、re案例!

常用的類庫為lxml,BeautifulSoup,re(正則)  學習Python中有不明白推薦加入交流群                 號:960410445     &nb

這可能是最囉嗦的Python爬蟲入門教程了 6-100

1. 簡介 國慶假日結束了,新的工作又開始了,今天我們繼續爬取一個網站,這個網站為 http://image.fengniao.com/ ,蜂鳥一個攝影大牛聚集的地方,本教程請用來學習,不要用於商業目的,不出意外,蜂鳥是有版權保護的網站。 2. 網站分析

Python中幾常見方法實現斐波那契數列

Python常見斐波那契解決方案 n=35 #1.遞迴求斐波那契 def fibo(n): return 1 if n<3 else fibo(n-1)+fibo(n-2) print(fibo(n)) #2.迴圈求斐波那契 f1,f2=0,1 for i

Python 3.x中的6標準物件型別之——Number(數值)資料型別

整型(int) 通常被稱為整型或整數,包含正負,不含小數點,同時沒有大小限制。 (如1,2,3,-6,5555等) 支援正常的數學運算,但在整數的除法(/)中,計算結果不會為整數 print(153/51) >>> 3.0 若想在整數的除法中

python 解析XML 的幾常見方法的介紹

XML (Extensible markup Language) 指的是可擴充套件標記語言,被設計用來傳輸和儲存資料,已經日趨成為當前許多新技術的核心,在不同的領域都有著不同的應用,它是web 發展到一定階段的必然產物   python 解析XML 常見的有三種方法 一是 xml.

6常見的Git錯誤以及解決的辦法

我們都會犯錯誤,尤其是在使用像Git這樣複雜的東西時。如果你是Git的新手,可以學習如何在命令列上開始使用Git。下面介紹如何解決六個最常見的Git錯誤。 1. 最後一次程式碼提交時有拼寫錯誤 經過幾個小時的編碼後,拼寫錯誤很容易帶到你的提交訊息裡面。 幸運的是,有一個簡單的解決方案。 git commit

Hibernate連線6常見的資料庫配置方式

Oracle連線配置 hibernate.dialect = org.hibernate.dialect.OracleDialectdriverClassName = oracle.jdbc.dri

爬蟲 處理的常用方法

在網際網路上進行自動資料採集(抓取)這件事和網際網路存在的時間差不多一樣長。今天大眾好像更傾向於用“網路資料採集”,有時會把網路資料採集程式稱為網路機器人(bots)。最常用的方法是寫一個自動化程式向網路伺服器請求資料(通常是用HTML表單或其他網頁檔案),然後對資料進行解析,提取需要的資訊。 本文假

python爬蟲使用Cookie的兩方法

場景:當我們以未登入身份使用瀏覽器訪問一個看書的相關網址時,只顯示了亞馬遜的購買連結。隱藏了書籍的下載連結。但是當我們登入以後,下載連結會顯示出來,這樣在爬蟲的時候,可以把下載連結解析出來使用。登入前後網頁Headers-Request Headers顯示的Cookie不同。

python爬蟲之Scrapy框架:兩隨機選擇User-Agent的方法

修改請求時的User-Agent一般有兩種思路:一是修改setting中的User-Agent變數(適用於極少量的agent更換,一般不採用);另一種就是通過Downloader Middleware的process_request()方法來修改,即在middlewares.

Python:標準資料型別6

#!/usr/bin/python3#python的基本語法和資料型別#python3中 一行有多個語句,用分號分割(;)print("aaa") ;print("bbb")#基本資料型別,移除long型別print(type(1))print(type(1.0))print