天天看點

Python網絡爬蟲(一):初步認識網絡爬蟲

不管你是因為什麼原因想做一個網絡爬蟲,首先做的第一件事情就是要了解它。

在了解網絡爬蟲之前一定要牢記下面4個要點,這是做網絡爬蟲的基礎:

1.抓取

py的urllib不一定去用。可是要學。假設你還沒用過的話。

比較好的替代品有requests等第三方更人性化、成熟的庫,假設pyer不了解各種庫。那就白學了。

抓取最基本就是拉網頁回來。

假設深入做下去。你會發現要面對不同的網頁要求。比方有認證的,不同檔案格式、編碼處理,各種奇怪的url合規化處理、反複抓取問題、cookies尾随問題、多線程多程序抓取、多節點抓取、抓取排程、資源壓縮等一系列問題。

是以第一步就是拉網頁回來,慢慢你會發現各種問題待你優化。

2.存儲

抓回來通常會用一定政策存下來。而不是直接分析。個人認為更好的架構應該是把分析和抓取分離,更加松散,每一個環節出了問題可以隔離另外一個環節可能出現的問題,好排查也好更新公布。

那麼存檔案系統、SQLorNOSQL資料庫、記憶體資料庫。怎樣去存就是這個環節的重點。你能夠選擇存檔案系統開始,然後以一定規則命名。

3.分析

對網頁進行文本分析。提取連結也好。提取正文也好,總之看你的需求。可是一定要做的就是分析連結了。能夠用你覺得最快最優的辦法。比方正則表達式。

然後将分析後的結果應用與其它環節:)

4.展示

要是你做了一堆事情。一點展示輸出都沒有,怎樣展現價值?是以找到好的展示元件,去show出肌肉也是關鍵。

假設你為了做個站去寫爬蟲,抑或你要分析某個東西的資料。都不要忘了這個環節,更好地把結果展示出來給别人感受。

網絡爬蟲的定義

網絡爬蟲,即Web Spider,是一個非常形象的名字。

把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。

網絡蜘蛛是通過網頁的連結位址來尋找網頁的。

從站點某一個頁面(一般是首頁)開始,讀取網頁的内容,找到在網頁中的其他連結位址,然後通過這些連結位址尋找下一個網頁。這樣一直循環下去,直到把這個站點全部的網頁都抓取完為止。假設把整個網際網路當成一個站點,那麼網絡蜘蛛就能夠用這個原理把網際網路上全部的網頁都抓取下來。

這樣看來,網絡爬蟲就是一個爬行程式,一個抓取網頁的程式。

網絡爬蟲的基本操作是抓取網頁。那麼怎樣才幹随心所欲地獲得自己想要的頁面?

我們先從URL開始。

首先擷取網頁真正的url。簡單的代碼例如以下:

from urllib2 import Request, urlopen, URLError, HTTPError 

#導入urllib2子產品。且直接使用Request。不須要urllib2.Request(from... import...)   

old_url = 'http://rrurl.cn/b1UZuP' #寫入網頁顯示的位址 

req = Request(old_url)  

response = urlopen(req)    

print 'Old url :' + old_url  

print 'Real url :' + response.geturl()

執行這串代碼,會報HTTPError:403錯誤。表示網站拒絕網絡爬蟲訪問。以下列出HTTP狀态碼:

HTTP狀态碼通常分為5種類型,分别以1~5五個數字開頭。由3位整數組成:

------------------------------------------------------------------------------------------------

200:請求成功      處理方式:獲得響應的内容,進行處理 

201:請求完畢。結果是建立了新資源。新建立資源的URI可在響應的實體中得到    處理方式:爬蟲中不會遇到 

202:請求被接受,但處理尚未完畢    處理方式:堵塞等待 

204:server端已經實作了請求,可是沒有傳回新的信 息。假設客戶是使用者代理,則無須為此更新自身的文檔視圖。    處理方式:丢棄

300:該狀态碼不被HTTP/1.0的應用程式直接使用, 僅僅是作為3XX類型回應的預設解釋。存在多個可用的被請求資源。    處理方式:若程式中可以處理。則進行進一步處理。假設程式中不能處理。則丢棄

301:請求到的資源都會配置設定一個永久的URL,這樣就能夠在将來通過該URL來訪問此資源    處理方式:重定向到配置設定的URL

302:請求到的資源在一個不同的URL處暫時儲存     處理方式:重定向到暫時的URL 

304 請求的資源未更新     處理方式:丢棄 

400 非法請求     處理方式:丢棄 

401 未授權     處理方式:丢棄 

403 禁止     處理方式:丢棄 

404 沒有找到     處理方式:丢棄 

5XX 回應代碼以“5”開頭的狀态碼表示server端發現自己出現錯誤,不能繼續運作請求    處理方式:丢棄

這時候我們該怎麼辦呢?事實上非常easy,讓爬蟲僞裝成正常IP訪問站點就能夠攻克了。代碼例如以下:

---------------------------------------  

   程式:twxs爬蟲  

   版本号:0.1  

   作者:貪玩小神  

   日期:2015-07-29  

   語言:Python 2.7   

   功能:輸出網站真實的url  

--------------------------------------- 

import urllib

import urllib2

#導入urllib。urllib2子產品,不推薦使用from ... import ...

old_url = 'http://www.zhubajie.com/wzkf/th1.html'

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'

#設定初始值old_url,user_agent

#User-Agent : 有些server或 Proxy 會通過該值來推斷是否是浏覽器發出的請求,這裡設定User-Agent來僞裝成浏覽器

values = {'name' : 'Michael Foord',

          'location' : 'Northampton',

          'language' : 'Python' }

headers = { 'User-Agent' : user_agent }

#初始化操作

data = urllib.urlencode(values)

req = urllib2.Request(old_url, data, headers=headers) 

#client向server發送請求

response = urllib2.urlopen(req)

#server對應client的請求