1. 程式人生 > >用python零基礎寫爬蟲--編寫第一個網絡爬蟲

用python零基礎寫爬蟲--編寫第一個網絡爬蟲

等待 客戶端瀏覽器 身份驗證 1.2 不存在 ssp 地址 執行c ade

首先要說明的是,一下代碼是在python2.7版本下檢測的

一.最簡單的爬蟲程序 --下載網頁

import urllib2
request=urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
怎麽樣,很簡單吧。
urllib2是python中的一個標準庫,以上代碼會抓取一個特定的網頁並將抓取的網頁返回。urllib2這個庫的使用要多加研究,這個是使用的基礎。

1、urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。他以urlopen函數的形式提供了一個非常簡單的接口,這是具有利用不同協議獲取URLs的能力;它同樣提供了一個比較復雜的接口來處理一般情況,例如:基礎驗證,cookies,代理和其他,它們通過handlers和openers的對象提供。

2、urllib2.urlopen(url, data=None, timeout=None)
  參數
    url:打開一個url,可以是字符串(如同urllib.urlopen的url參數),或是一個Request對象(這是special的地方)
    data:向服務器傳送的額外數據,僅http請求會用到這個參數。當data不為None時,說明此Http請求是Post,而不是Get。這個參數與urllib2.Request類的構造函數的data參數相同,詳見urllib2.Request。一般不會設定這個參數,需要時會在urllib2.Request的構造函數處設置
    timeout:設置超時的時間,類型是整型,單位是秒;如果超過指定時間仍未得到所請求服務器的響應(例如由於網絡環境差等原因),則拋出異常,而不會無限制等待。適用於HTTP, HTTPS, FTP, FTPS
  返回值
    返回一個類似於文件描述符號(file-like)的對象,與urllib.urlopen的返回值相同,通過返回值也可以使用geturl()和info()。

3、urllib2.Request類,一般使用方法是使用其構造函數得到一個Request對象:class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
  表示一個URL請求
  參數
    url:一個URL字符串
    data:向服務器傳送的額外數據,僅http請求會用到這個參數。當data不為None時,說明此Http請求是Post,而不是Get。其類型應為字符串,一般使用urllib.urlencode()對一個dict或tuple進行處理,得到該字符串。
    headers:請求頭,類型是dict。除此之外,請求頭可以在創建完Request對象後,通過該對象調用add_header(key, val)添加到對象中。常用方法是添加User-Agent請求頭,冒充瀏覽器請求,用於哄篇服務器,因為一些服務器不允許程序訪問。
    後兩個參數一般用不到,不再介紹
  返回值
    一個Request對象

4、urllib2.OpenerDirector類
  當你獲取一個URL時,你需要使用一個opener(OpenerDirector)。正常情況下我們一直使用默認的opener,被urlopen使用,但你也可以創建自定義的openers。opener使用handler處理任務,所有的重活都交給這些handlers來做。每一個handler知道怎麽以特定的url協議打開url,或者怎麽處理打開url的某些方面,如,HTTP重定向,或者HTTP cookie。

5、def urllib2.build_opener([handler, ...])
  創建一個OpenerDirector對象,可以包含多個handlers
  參數
    handler, ...:urllib2提供很多handler來處理不同的請求,常用的HTTPHandler,FTPHandler都比較好理解。這裏提一下HTTPCookieProcessor,HTTPCookieProcessor是處理cookie的,在很多需要身份驗證的請求中cookie是必不可少的,python中對cookie的操作是由cookielib模塊來完成的,而這個handler只是調用了其方法,在request和response過程中將cookie加到請求中和把cookie從響應中解析出來。
  返回值
    OpenerDirector對象

6、def urllib2.install_opener(opener)
  install_opener能設置一個全局opener對象,這意味著調用urlopen將會都用你剛安裝的opener。
  參數
    opener:OpenerDirector對象

7、urllib2.HTTPCookieProcessor類,通常使用其構造函數得到一個對象,即一個handler:class urllib2.HTTPCookieProcessor([cookiejar])
  參數
    cookiejar:一個cookielib.CookieJar對象,通過構造函數cookielib.CookieJar()得到
  返回值
    HTTPCookieProcessor對象,即一個handler

二.捕獲下載異常

import urllib2
def download(url):
print ‘downloading:‘,url
try:
html=urllib2.urlopen(url).read()
except urllib2.URLError as e:
print ‘download error:‘, e.reason
html=None
return html
download(‘http://httpstat,us/500‘)

我們引入了urllib2標準庫,並且定義了一個download函數 ,其中用到了 try/except 處理異常的語法。

三.網頁出錯與重試下載

import urllib2

def download(url,num_retries=2):
print ‘downloading:‘,url
try:
html=urllib2.urlopen(url).read()
except urllib2.URLError as e:
print ‘download error:‘, e.reason
html=None
if num_retries>0:
if hasattr(e, ‘code‘) and 500<=e.code<600:
#recursively retry 5XX http errors
return download(url, num_retries-1)
return html

下載時遇到的錯誤經常是臨時性的,比如服務器過載時返回的503 Service Unavilable 錯誤等。

一般來說4xx錯誤發生在請求存在問題時候,5xx錯誤發生在服務器存在問題時。所以我們只需要確保在發生5xx錯誤時候重新下載。

1xx-信息提示
這些狀態代碼表示臨時的響應。客戶端在收到常規響應之前,應準備接收一個或多個1xx響應。
100-繼續。
101-切換協議。
2xx-成功
這類狀態代碼表明服務器成功地接受了客戶端請求。
200-確定。客戶端請求已成功。
201-已創建。
202-已接受。
203-非權威性信息。
204-無內容。
205-重置內容。
206-部分內容。
3xx-重定向
客戶端瀏覽器必須采取更多操作來實現請求。例如,瀏覽器可能不得不請求服務器上的不同的頁面,或通過代理服務器重復該請求。
301-對象已永久移走,即永久重定向。
302-對象已臨時移動。
304-未修改。
307-臨時重定向。
4xx-客戶端錯誤
發生錯誤,客戶端似乎有問題。例如,客戶端請求不存在的頁面,客戶端未提供有效的身份驗證信息。400-錯誤的請求。
401-訪問被拒絕。IIS定義了許多不同的401錯誤,它們指明更為具體的錯誤原因。這些具體的錯誤代碼在瀏覽器中顯示,但不在IIS日誌中顯示:
401.1-登錄失敗。
401.2-服務器配置導致登錄失敗。
401.3-由於ACL對資源的限制而未獲得授權。
401.4-篩選器授權失敗。
401.5-ISAPI/CGI應用程序授權失敗。
401.7–訪問被Web服務器上的URL授權策略拒絕。這個錯誤代碼為IIS6.0所專用。
403-禁止訪問:IIS定義了許多不同的403錯誤,它們指明更為具體的錯誤原因:
403.1-執行訪問被禁止。
403.2-讀訪問被禁止。
403.3-寫訪問被禁止。
403.4-要求SSL。
403.5-要求SSL128。
403.6-IP地址被拒絕。
403.7-要求客戶端證書。
403.8-站點訪問被拒絕。
403.9-用戶數過多。
403.10-配置無效。
403.11-密碼更改。
403.12-拒絕訪問映射表。
403.13-客戶端證書被吊銷。
403.14-拒絕目錄列表。
403.15-超出客戶端訪問許可。
403.16-客戶端證書不受信任或無效。
403.17-客戶端證書已過期或尚未生效。
403.18-在當前的應用程序池中不能執行所請求的URL。這個錯誤代碼為IIS6.0所專用。
403.19-不能為這個應用程序池中的客戶端執行CGI。這個錯誤代碼為IIS6.0所專用。
403.20-Passport登錄失敗。這個錯誤代碼為IIS6.0所專用。
404-未找到。
404.0-(無)–沒有找到文件或目錄。
404.1-無法在所請求的端口上訪問Web站點。
404.2-Web服務擴展鎖定策略阻止本請求。
404.3-MIME映射策略阻止本請求。
405-用來訪問本頁面的HTTP謂詞不被允許(方法不被允許)
406-客戶端瀏覽器不接受所請求頁面的MIME類型。
407-要求進行代理身份驗證。
412-前提條件失敗。
413–請求實體太大。
414-請求URI太長。
415–不支持的媒體類型。
416–所請求的範圍無法滿足。
417–執行失敗。
423–鎖定的錯誤。
5xx-服務器錯誤
服務器由於遇到錯誤而不能完成該請求。
500-內部服務器錯誤。
500.12-應用程序正忙於在Web服務器上重新啟動。
500.13-Web服務器太忙。
500.15-不允許直接請求Global.asa。
500.16–UNC授權憑據不正確。這個錯誤代碼為IIS6.0所專用。
500.18–URL授權存儲不能打開。這個錯誤代碼為IIS6.0所專用。
500.100-內部ASP錯誤。
501-頁眉值指定了未實現的配置。
502-Web服務器用作網關或代理服務器時收到了無效響應。
502.1-CGI應用程序超時。
502.2-CGI應用程序出錯。application.
503-服務不可用。這個錯誤代碼為IIS6.0所專用。
504-網關超時。
505-HTTP版本不受支持。

用python零基礎寫爬蟲--編寫第一個網絡爬蟲