網絡爬蟲,英譯爲 web crawler ,是一種自動化程序,如今咱們很幸運,生處互聯網時代,有大量的信息在網絡上均可以查獲得,可是有時咱們須要網絡上的數據,活着文章,圖片等等,可是,一個個地複製,粘貼是否是太傻了,循着 「DRY」 的設計原則,咱們但願用一個自動化的程序,自動幫咱們匹配到網絡上面的數據,而後下載下來,爲咱們所用。其中,搜索引擎就是個很好的例子,搜索引擎技術裏面大量使用爬蟲,他爬取下整個互聯網的內容,存儲在數據庫裏面,作索引。html
python作網絡爬蟲主要用到了兩個庫,urllib,urllib2,官方英文文檔看不懂,弱菜只好去看看別人的。python
1.獲取html文本web
1 # -*- coding:utf-8 -*- 2 import urllib2 3 response = urllib2.urlopen("http://www.baidu.com"); 4 print response.read(); #返回一個對象,使用對象read()方法,獲取html文本
除了"http:",URL一樣可使用"ftp:","file:"等等來替代。HTTP是基於請求和應答機制的:客戶端提出請求,服務端提供應答。還能夠用urllib2用一個Request對象來映射你提出的HTTP請求:req = urllib2.Request('http://www.baidu.com');最後輸出內容與上面的同樣數據庫
1 # -*- coding:utf-8 -*- 2 import urllib2 3 req = urllib2.Request("http://www.baidu.com"); 4 response = urllib2.urlopen(req); #傳入一個request對象 5 print response.read();
2.URLError異常處理: 瀏覽器
1.首先解釋下URLError可能產生的緣由:服務器
咱們經過try-except來捕捉異常。cookie
1 # -*- coding:utf-8 -*- 2 import urllib2 3 4 url = "http://www.gsdsff.com" 5 req = urllib2.Request(url) 6 try: 7 response = urllib2.urlopen(req) 8 except urllib2.URLError,e: 9 print e.reason 10 else: 11 print "ok"
輸出:網絡
[Errno 11001] getaddrinfo failed [Finished in 0.5s]
這是用urllib2來訪問一個不存在的網站,錯誤代號,錯誤緣由。工具
2.HTTPError爲URLError的一個子類,在你利用urlopen方法發出一個請求時,服務器上都會對應一個應答對象response,其中它包含一個數字」狀態碼」。HTTP狀態碼錶示HTTP協議所返回的響應的狀態。post
1 # -*- coding:utf-8 -*- 2 import urllib2 3 4 url = 'http://blog.csdn.net/cqcre' 5 req = urllib2.Request(url) 6 try: 7 response = urllib2.urlopen(req) 8 except urllib2.HTTPError,e: 9 print e.code,e.reason 10 else: 11 print "ok"
輸出:
1 403 Forbidden 2 [Finished in 0.2s]
常見狀態碼:
100:繼續 客戶端應當繼續發送請求。客戶端應當繼續發送請求的剩餘部分,或者若是請求已經完成,忽略這個響應。
101: 轉換協議 在發送完這個響應最後的空行後,服務器將會切換到在Upgrade 消息頭中定義的那些協議。只有在切換新的協議更有好處的時候才應該採起相似措施。
102:繼續處理 由WebDAV(RFC 2518)擴展的狀態碼,表明處理將被繼續執行。
200:請求成功 處理方式:得到響應的內容,進行處理
201:請求完成,結果是建立了新資源。新建立資源的URI可在響應的實體中獲得 處理方式:爬蟲中不會遇到
202:請求被接受,但處理還沒有完成 處理方式:阻塞等待
204:服務器端已經實現了請求,可是沒有返回新的信 息。若是客戶是用戶代理,則無須爲此更新自身的文檔視圖。 處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程序直接使用, 只是做爲3XX類型迴應的默認解釋。存在多個可用的被請求資源。 處理方式:若程序中可以處理,則進行進一步處理,若是程序中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就能夠在未來經過該URL來訪問此資源 處理方式:重定向到分配的URL302:請求到的資源在一個不一樣的URL處臨時保存 處理方式:重定向到臨時的URL
304:請求的資源未更新 處理方式:丟棄
400:非法請求 處理方式:丟棄
401:未受權 處理方式:丟棄
403:禁止 處理方式:丟棄
404:沒有找到 處理方式:丟棄
500:服務器內部錯誤 服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理。通常來講,這個問題都會在服務器端的源代碼出現錯誤時出現。
501:服務器沒法識別 服務器不支持當前請求所須要的某個功能。當服務器沒法識別請求的方法,而且沒法支持其對任何資源的請求。
502:錯誤網關 做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
503:服務出錯 因爲臨時的服務器維護或者過載,服務器當前沒法處理請求。這個情況是臨時的,而且將在一段時間之後恢復。
http://cuiqingcai.com/968.html
實例:
# -*- coding:utf-8 -*- import urllib2 import urllib import cookielib def renrenBrower(url,user,password): #登錄頁面,能夠經過抓包工具分析得到,如fiddler,wireshark login_page = "http://www.renren.com/PLogin.do" try: #得到一個cookieJar實例 cj = cookielib.CookieJar() #cookieJar做爲參數,得到一個opener的實例 opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #假裝成一個正常的瀏覽器,避免有些web服務器拒絕訪問。 opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')] #生成Post數據,含有登錄用戶名密碼。 data = urllib.urlencode({"email":user,"password":password}) #以post的方法訪問登錄頁面,訪問以後cookieJar會自定保存cookie opener.open(login_page,data) #以帶cookie的方式訪問頁面 op=opener.open(url) #讀取頁面源碼 data= op.read() return data except Exception,e: print str(e) #訪問某用戶的我的主頁,其實這已經實現了人人網的簽到功能。 k = renrenBrower("http://www.renren.com/home","xxxxx","xxxxx") f = open('a.txt','w') f.write(k) f.close