[Python]網絡爬蟲(一):抓取網頁的含義和URL基本構成

轉載自http://blog.csdn.net/wxg694175346/article/list/3

  

[Python]網絡爬蟲(一):抓取網頁的含義和URL基本構成

分類: 爬蟲 Python 1597人閱讀 評論(0) 收藏 舉報

一、網絡爬蟲的定義

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

把互聯網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。
網絡蜘蛛是通過網頁的鏈接地址來尋找網頁的。

從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,

然後通過這些鏈接地址尋找下一個網頁,這樣一直循環下去,直到把這個網站所有的網頁都抓取完爲止。

如果把整個互聯網當成一個網站,那麼網絡蜘蛛就可以用這個原理把互聯網上所有的網頁都抓取下來。

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

網絡爬蟲的基本操作是抓取網頁。

那麼如何才能隨心所欲地獲得自己想要的頁面?

我們先從URL開始。


二、瀏覽網頁的過程

抓取網頁的過程其實和讀者平時使用IE瀏覽器瀏覽網頁的道理是一樣的。

比如說你在瀏覽器的地址欄中輸入    www.baidu.com    這個地址。

打開網頁的過程其實就是瀏覽器作爲一個瀏覽的“客戶端”,向服務器端發送了 一次請求,把服務器端的文件“抓”到本地,再進行解釋、展現。

HTML是一種標記語言,用標籤標記內容並加以解析和區分。

瀏覽器的功能是將獲取到的HTML代碼進行解析,然後將原始的代碼轉變成我們直接看到的網站頁面。


三、URI的概念和舉例

簡單的來講,URL就是在瀏覽器端輸入的    www.baidu.com    這個字符串。

在理解URL之前,首先要理解URI的概念。

什麼是URI?

Web上每種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都由一個通用資源標誌符(Universal Resource Identifier, URI)進行定位。 

URI通常由三部分組成:

①訪問資源的命名機制;

②存放資源的主機名;

③資源自身 的名稱,由路徑表示。

如下面的URI:
http://www.why.com.cn/myhtml/html1223/

我們可以這樣解釋它:

①這是一個可以通過HTTP協議訪問的資源,

②位於主機 www.webmonkey.com.cn上,

③通過路徑“/html/html40”訪問。 


四、URL的理解和舉例

URL是URI的一個子集。它是Uniform Resource Locator的縮寫,譯爲“統一資源定位 符”。

通俗地說,URL是Internet上描述信息資源的字符串,主要用在各種WWW客戶程序和服務器程序上。

採用URL可以用一種統一的格式來描述各種信息資源,包括文件、服務器的地址和目錄等。

URL的格式由三部分組成: 

①第一部分是協議(或稱爲服務方式)。

②第二部分是存有該資源的主機IP地址(有時也包括端口號)。

③第三部分是主機資源的具體地址,如目錄和文件名等。

第一部分和第二部分用“://”符號隔開,

第二部分和第三部分用“/”符號隔開。

第一部分和第二部分是不可缺少的,第三部分有時可以省略。 


下面來看看兩個URL的小例子。


1.HTTP協議的URL示例:
使用超級文本傳輸協議HTTP,提供超級文本信息服務的資源。 

例:http://www.peopledaily.com.cn/channel/welcome.htm 

其計算機域名爲www.peopledaily.com.cn。

超級文本文件(文件類型爲.html)是在目錄 /channel下的welcome.htm。

這是中國人民日報的一臺計算機。 

例:http://www.rol.cn.net/talk/talk1.htm 

其計算機域名爲www.rol.cn.net。

超級文本文件(文件類型爲.html)是在目錄/talk下的talk1.htm。

這是瑞得聊天室的地址,可由此進入瑞得聊天室的第1室。


2.文件的URL
用URL表示文件時,服務器方式用file表示,後面要有主機IP地址、文件的存取路 徑(即目錄)和文件名等信息。

有時可以省略目錄和文件名,但“/”符號不能省略。 

例:file://ftp.yoyodyne.com/pub/files/foobar.txt 

上面這個URL代表存放在主機ftp.yoyodyne.com上的pub/files/目錄下的一個文件,文件名是foobar.txt。

例:file://ftp.yoyodyne.com/pub 

代表主機ftp.yoyodyne.com上的目錄/pub。 

例:file://ftp.yoyodyne.com/ 

代表主機ftp.yoyodyne.com的根目錄。 


爬蟲最主要的處理對象就是URL,它根據URL地址取得所需要的文件內容,然後對它 進行進一步的處理。

因此,準確地理解URL對理解網絡爬蟲至關重要



  1. import urllib2    
  2. req = urllib2.Request('http://www.baidu.com')    
  3. response = urllib2.urlopen(req)    
  4. the_page = response.read()    
  5. print the_page  

可以看到輸出的內容和test01是一樣的。

urllib2使用相同的接口處理所有的URL頭。例如你可以像下面那樣創建一個ftp請求。

[python] view plaincopy
  1. req = urllib2.Request('ftp://example.com/')  
在HTTP請求時,允許你做額外的兩件事。

1.發送data表單數據

這個內容相信做過Web端的都不會陌生,

有時候你希望發送一些數據到URL(通常URL與CGI[通用網關接口]腳本,或其他WEB應用程序掛接)。

在HTTP中,這個經常使用熟知的POST請求發送。

這個通常在你提交一個HTML表單時由你的瀏覽器來做。

並不是所有的POSTs都來源於表單,你能夠使用POST提交任意的數據到你自己的程序。

一般的HTML表單,data需要編碼成標準形式。然後做爲data參數傳到Request對象。

編碼工作使用urllib的函數而非urllib2。

我們新建一個文件urllib2_test03.py來感受一下:

[python] view plaincopy
  1. import urllib    
  2. import urllib2    
  3.   
  4. url = 'http://www.someserver.com/register.cgi'    
  5.     
  6. values = {'name' : 'WHY',    
  7.           'location' : 'SDU',    
  8.           'language' : 'Python' }    
  9.   
  10. data = urllib.urlencode(values) # 編碼工作  
  11. req = urllib2.Request(url, data)  # 發送請求同時傳data表單  
  12. response = urllib2.urlopen(req)  #接受反饋的信息  
  13. the_page = response.read()  #讀取反饋的內容  

如果沒有傳送data參數,urllib2使用GET方式的請求。

GET和POST請求的不同之處是POST請求通常有"副作用",

它們會由於某種途徑改變系統狀態(例如提交成堆垃圾到你的門口)。

Data同樣可以通過在Get請求的URL本身上面編碼來傳送。

[python] view plaincopy
  1. import urllib2    
  2. import urllib  
  3.   
  4. data = {}  
  5.   
  6. data['name'] = 'WHY'    
  7. data['location'] = 'SDU'    
  8. data['language'] = 'Python'  
  9.   
  10. url_values = urllib.urlencode(data)    
  11. print url_values  
  12.   
  13. name=Somebody+Here&language=Python&location=Northampton    
  14. url = 'http://www.example.com/example.cgi'    
  15. full_url = url + '?' + url_values  
  16.   
  17. data = urllib2.open(full_url)    

這樣就實現了Data數據的Get傳送。


2.設置Headers到http請求

有一些站點不喜歡被程序(非人爲訪問)訪問,或者發送不同版本的內容到不同的瀏覽器。

默認的urllib2把自己作爲“Python-urllib/x.y”(x和y是Python主版本和次版本號,例如Python-urllib/2.7),

這個身份可能會讓站點迷惑,或者乾脆不工作。

瀏覽器確認自己身份是通過User-Agent頭,當你創建了一個請求對象,你可以給他一個包含頭數據的字典。

下面的例子發送跟上面一樣的內容,但把自身模擬成Internet Explorer。

[python] view plaincopy
  1. import urllib    
  2. import urllib2    
  3.   
  4. url = 'http://www.someserver.com/cgi-bin/register.cgi'  
  5.   
  6. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
  7. values = {'name' : 'WHY',    
  8.           'location' : 'SDU',    
  9.           'language' : 'Python' }    
  10.   
  11. headers = { 'User-Agent' : user_agent }    
  12. data = urllib.urlencode(values)    
  13. req = urllib2.Request(url, data, headers)    
  14. response = urllib2.urlopen(req)    
  15. the_page = response.read()   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章