初步認識網絡爬蟲

不管你是因爲什麼緣由想作一個網絡爬蟲,首先作的第一件事情就是要了解它。php

 

在瞭解網絡爬蟲以前必定要牢記如下4個要點,這是作網絡爬蟲的基礎:html

 

1.抓取正則表達式

 

py的urllib不必定去用,可是要學,若是你還沒用過的話。比較好的替代品有requests等第三方更人性化、成熟的庫,若是pyer不瞭解各類庫,那就白學了。抓取最基本就是拉網頁回來。數據庫

 

若是深刻作下去,你會發現要面對不一樣的網頁要求,好比有認證的,不一樣文件格式、編碼處理,各類奇怪的url合規化處理、重複抓取問題、cookies跟隨問題、多線程多進程抓取、多節點抓取、抓取調度、資源壓縮等一系列問題。數組

 

因此第一步就是拉網頁回來,慢慢你會發現各類問題待你優化。瀏覽器

 

2.存儲服務器

 

抓回來通常會用必定策略存下來,而不是直接分析,我的以爲更好的架構應該是把分析和抓取分離,更加鬆散,每一個環節出了問題可以隔離另一個環節可能出現的問題,好排查也好更新發布。cookie

 

那麼存文件系統、SQLorNOSQL數據庫、內存數據庫,如何去存就是這個環節的重點。你能夠選擇存文件系統開始,而後以必定規則命名。網絡

 

3.分析多線程

 

對網頁進行文本分析,提取連接也好,提取正文也好,總之看你的需求,可是必定要作的就是分析連接了。能夠用你認爲最快最優的辦法,好比正則表達式。而後將分析後的結果應用與其餘環節:)

 

4.展現

 

要是你作了一堆事情,一點展現輸出都沒有,如何展示價值?因此找到好的展現組件,去show出肌肉也是關鍵。
若是你爲了作個站去寫爬蟲,抑或你要分析某個東西的數據,都不要忘了這個環節,更好地把結果展現出來給別人感覺。

 

網絡爬蟲的定義

 

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

 

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

 

網絡蜘蛛是經過網頁的連接地址來尋找網頁的。

 

從網站某一個頁面(一般是首頁)開始,讀取網頁的內容,找到在網頁中的其它連接地址,而後經過這些連接地址尋找下一個網頁,這樣一直循環下去,直到把這個網站全部的網頁都抓取完爲止。若是把整個互聯網當成一個網站,那麼網絡蜘蛛就能夠用這個原理把互聯網上全部的網頁都抓取下來。

 

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

 

網絡爬蟲的基本操做是抓取網頁。那麼如何才能爲所欲爲地得到本身想要的頁面?

 

咱們先從URL開始。

 

首先獲取網頁真正的url,簡單的代碼以下:

 

?
1
2
3
4
5
6
7
8
9
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:服務器端已經實現了請求,可是沒有返回新的信 息。若是客戶是用戶代理,則無須爲此更新自身的文檔視圖。    處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程序直接使用, 只是做爲3XX類型迴應的默認解釋。存在多個可用的被請求資源。    處理方式:若程序中可以處理,則進行進一步處理,若是程序中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就能夠在未來經過該URL來訪問此資源    處理方式:重定向到分配的URL
302:請求到的資源在一個不一樣的URL處臨時保存     處理方式:重定向到臨時的URL 
304 請求的資源未更新     處理方式:丟棄 
400 非法請求     處理方式:丟棄 
401 未受權     處理方式:丟棄 
403 禁止     處理方式:丟棄 
404 沒有找到     處理方式:丟棄 
5XX 迴應代碼以「5」開頭的狀態碼錶示服務器端發現本身出現錯誤,不能繼續執行請求    處理方式:丟棄

 

這時候咱們該怎麼辦呢?其實很簡單,讓爬蟲假裝成正常IP訪問網站就能夠解決了。代碼以下:



?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
---------------------------------------
    程序:twxs爬蟲 
    版本:0.1 
    做者:貪玩小神 
    日期:2015-07-29 
    語言:Python 2.7  
    功能:輸出站點真實的url 
---------------------------------------
import urllib
import urllib2
#導入urllib,urllib2模塊,不推薦使用from ... import ...
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 : 有些服務器或 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)
#客戶端向服務器發送請求
response = urllib2.urlopen(req)
#服務器相應客戶端的請求
print 'Old url :' + old_url 
print 'Real url :' + response.geturl()
相關文章
相關標籤/搜索