python之網絡爬蟲

  網絡爬蟲,英譯爲 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來訪問此資源    處理方式:重定向到分配的URL

302:請求到的資源在一個不一樣的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
相關文章
相關標籤/搜索