系統學習下python網絡爬蟲 筆記一

系統學習下python網絡爬蟲的知識


1、爬蟲的定義


Web Spider,把互聯網定義爲一個蜘蛛網,網絡蜘蛛通過網頁的鏈接地址來尋找網頁。


具體過程:從網站的某一個網頁(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其他鏈接地址,然後通過這些鏈接地址尋找下一個頁面,這樣一直循環下去,直到所有的網頁都抓取完成爲止。


其實,網絡爬蟲就是一個爬行程序,一個抓取網頁的程序。我們如何才能找到自己想要的網頁和去掉網頁中其他不相關的部分?我們首先得找到自己想要的網頁的URL.


2、瀏覽網頁的過程


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


HTML語言是一種標記語言,用標籤標記內容並加以解析和區分。瀏覽器的功能是將獲取到的HTML代碼進行解析,然後將原始的代碼轉變成我們直接看到的網站頁面。


3、URL


uniform resource locator的縮寫,統一資源定位符。

URL的格式由三部分組成: 

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

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

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

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

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

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


4、python中的urllib2模塊抓取制定URL網頁內容


我們所說的網頁抓取工作,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。


urllib2是python的一個模塊,使用函數urlopen獲取網頁源代碼。

eg,最簡單的應用代碼:

import urllib2
response = urllib2.urlopen('https://gendertrender.wordpress.com/')
content = response.read()
print(content)

urllib2用一個Request對象來映射設置好的HTTP請求,並且用這個地址創建一個Request對象,通過調用urlopen並傳入Request對象,將返回一個相關請求request對象,然後可以在Request中調用read()。

import urllib2
res = urllib2.Reaquest('https://gendertrender.wordpress.com/')
response = urllib2.urlopen(req)
content = response.read()
print(content)

5、HTTP請求的操作


在HTTP請求時,可以額外做的兩件事情。


a、發送data表單數據


發送一些數據到URL,比如用戶登錄信息,我們在抓取網頁的過程中,有時候會涉及到登陸以後顯示內容的網站,這個時候就會用到發送賬號數據到URL。一般的HTML表單,data需要編碼成標準形式。然後做爲data參數傳到Request對象。編碼工作使用urllib的函數而非urllib2。

import urllib
import urllib2
url = 'http://www.baidu.com/register.cgi'
values = {'user':'qester'
  'pwd':'******'}
data = urllib.urlencode(values)#對values進行編碼encode
req = urllib2.Request(url,data)
response = urllib2.urlopen(req)
content = response.read()
print content


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


b、設置Headers和http請求


有一些站點不喜歡被程序訪問,或者發送不同的版本到不同的瀏覽器。默認的urllib2是以"python-urllib/x.y"的身份進行訪問的。對於這個身份站點會有不同的操作。對於這個情況,我們可以請求對象一個包含頭數據的字典。把自己僞裝起來。

import urllib    
import urllib2    
  
url = 'http://www.baidu.com/register.cgi'  
  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
values = {'name' : 'qester',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
headers = { 'User-Agent' : user_agent } #把自身僞裝成一個IE瀏覽器
data = urllib.urlencode(values)    
req = urllib2.Request(url, data, headers)    
response = urllib2.urlopen(req)    
the_page = response.read()


6、異常的處理和HTTP狀態碼的分類


當urlopen不能夠處理一個response時,產生urlError。HTTPError是urlError的子類,通常在特定的HTTP URLs中產生。


a、URLError

URLError在沒有網絡連接或者服務器不存在的情況下產生。異常會帶有"reason"屬性,它是一個tuple,包含了一個錯誤號和一個錯誤信息。


b、HTTPError

假如response是一個"重定向",需要客戶端從別的地址獲取文檔,urllib2將爲你處理。其他不能處理的,urlopen會產生一個HTTPError。典型的錯誤包含"404"(頁面無法找到),"403"(請求禁止),和"401"(帶驗證請求)。HTTP狀態碼錶示HTTP協議所返回的響應的狀態。比如客戶端向服務器發送請求,如果成功地獲得請求的資源,則返回的狀態碼爲200,表示響應成功。如果請求的資源不存在, 則通常返回404錯誤。


一般處理這兩個異常最常用的方法如下:

from urllib2 import Request, urlopen, URLError, HTTPError  
req = Request('http://bbs.csdn.net/callmewhy')  
try:    
    response = urlopen(req)    
except URLError, e:    
    if hasattr(e, 'code'):    
        print 'The server couldn\'t fulfill the request.'    
        print 'Error code: ', e.code    
    elif hasattr(e, 'reason'):    
        print 'We failed to reach a server.'    
        print 'Reason: ', e.reason       
else:    
    print 'No exception was raised.'


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