Python網路爬蟲(三)- 爬蟲進階
目錄:
- Python網路爬蟲(一)- 入門基礎
- Python網路爬蟲(二)- urllib爬蟲案例
- Python網路爬蟲(三)- 爬蟲進階
- Python網路爬蟲(四)- XPath
- Python網路爬蟲(五)- Requests和Beautiful Soup
- Python網路爬蟲(六)- Scrapy框架
- Python網路爬蟲(七)- 深度爬蟲CrawlSpider
- Python網路爬蟲(八) - 利用有道詞典實現一個簡單翻譯程序
1.爬蟲進階cookielib
- Python入門網路爬蟲之精華版:詳細講解了Python學習網路爬蟲。
- 為了進行高效的抓取有用的數據,並且減少冗餘數據的存儲,後續需要使用正則表達式來進行對爬取數據中特定內容的存儲。
- urllib2 默認會使用環境變數 http_proxy 來設置 HTTP Proxy。假如一個網站它會檢測某一段時間某個IP 的訪問次數,如果訪問次數過多,它會禁止你的訪問。可以設置代理IP來進行爬蟲,具體見代碼操作(四)
- 當你獲取一個URL你使用一個opener。在Python網路爬蟲(二)- urllib爬蟲案例中,我們都是使用的默認的opener,也就是urlopen。它是一個特殊的opener,可以理解成opener的一個特殊實例,傳入的參數僅僅是url,data,timeout。
- Cookie,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)
- cookielib模塊的主要作用是提供可存儲cookie的對象,以便於與urllib2模塊配合使用來訪問Internet資源。Cookielib模塊非常強大,我們可以利用本模塊的CookieJar類的對象來捕獲cookie並在後續連接請求時重新發送,比如可以實現模擬登錄功能。該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
- 如果我們需要用到Cookie,只用這個opener是不能達到目的的,所以我們需要創建更一般的opener來實現對Cookie的設置。
1)獲取Cookie,並保存到CookieJar()對象中
# urllib2_cookielibtest1.pynnimport urllib2nimport cookielibnn# 構建一個CookieJar對象實例來保存cookiencookiejar = cookielib.CookieJar()nn# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象nhandler=urllib2.HTTPCookieProcessor(cookiejar)nn# 通過 build_opener() 來構建openernopener = urllib2.build_opener(handler)nn# 4. 以get方法訪問頁面,訪問之後會自動保存cookie到cookiejar中nopener.open("http://www.baidu.com")nn## 可以按標準格式將保存的Cookie列印出來ncookieStr = ""nfor item in cookiejar:n cookieStr = cookieStr + item.name + "=" + item.value + ";"nn## 捨去最後一位的分號nprint cookieStr[:-1]n
2) 訪問網站獲得cookie,並把獲得的cookie保存在cookie文件中
# urllib2_cookielibtest2.pynnimport cookielibnimport urllib2nn# 保存cookie的本地磁碟文件名nfilename = cookie.txtnn# 聲明一個MozillaCookieJar(有save實現)對象實例來保存cookie,之後寫入文件ncookiejar = cookielib.MozillaCookieJar(filename)nn# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象nhandler = urllib2.HTTPCookieProcessor(cookiejar)nn# 通過 build_opener() 來構建openernopener = urllib2.build_opener(handler)nn# 創建一個請求,原理同urllib2的urlopennresponse = opener.open("http://www.baidu.com")nn# 保存cookie到本地文件ncookiejar.save()n
3)從文件中獲取cookies,做為請求的一部分去訪問
# urllib2_cookielibtest2.pynnimport cookielibnimport urllib2nn# 創建MozillaCookieJar(有load實現)實例對象ncookiejar = cookielib.MozillaCookieJar()nn# 從文件中讀取cookie內容到變數ncookie.load(cookie.txt)nn# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象nhandler = urllib2.HTTPCookieProcessor(cookiejar)nn# 通過 build_opener() 來構建openernopener = urllib2.build_opener(handler)nnresponse = opener.open("http://www.baidu.com")n
- urllib 模塊方法。
- urllib2 的異常錯誤處理
- URLError
import urllib2nnrequset = urllib2.Request(http://www.ajkfhafwjqh.com)nntry:n urllib2.urlopen(request, timeout=5)nexcept urllib2.URLError, err:n print errn
- HTTPError
HTTPError是URLError的子類,我們發出一個請求時,伺服器上都會對應一個response應答對象,其中它包含一個數字"響應狀態碼"。
如果urlopen或opener.open不能處理的,會產生一個HTTPError,對應相應的狀態碼,HTTP狀態碼錶示HTTP協議所返回的響應的狀態。注意,urllib2可以為我們處理重定向的頁面(也就是3開頭的響應碼),100-299範圍的號碼錶示成功,所以我們只能看到400-599的錯誤號碼。
import urllib2nnrequset = urllib2.Request(http://blog.baidu.com/itcast)nntry:n urllib2.urlopen(requset)nexcept urllib2.HTTPError, err:n print err.coden print errn
- 改進版
import urllib2nnrequset = urllib2.Request(http://blog.baidu.com/itcast)nntry:n urllib2.urlopen(requset)nnexcept urllib2.HTTPError, err:n print err.codennexcept urllib2.URLError, err:n print errnnelse:n print "Good Job"n
這樣我們就可以做到,首先捕獲子類的異常,如果子類捕獲不到,那麼可以捕獲父類的異常。
2.具體代碼操作
代碼操作(一) 自定義數據請求方式
# -*- coding:utf-8 -*-nimport urllib2,urllibnn#創建一個HTPP請求對象nhttp_handler = urllib2.HTTPHandler()nn# 構建一個HTTPHandler 處理器對象,支持處理HTTPS請求nhttp_handler = urllib2.HTTPSHandler()nn#創建一個打開方式對象nopener = urllib2.build_opener(http_handler)n#通過自定義的打開方式,nresponse = opener.open(https://www.baidu.com)n#讀取響應對象中的數據nprint response.read()n
爬取結果
註解:這裡使用urllib2.HTTPHandler()訪問https網頁得到的html代碼。
這種方式發送請求得到的結果,和使用urllib2.urlopen()發送HTTP/HTTPS請求得到的結果是一樣的。
如果在 HTTPHandler()增加 debuglevel=1參數,還會將 Debug Log 打開,這樣程序在執行的時候,會把收包和發包的報頭在屏幕上自動列印出來,方便調試,有時可以省去抓包的工作。
# 僅需要修改的代碼部分:nn# 構建一個HTTPHandler 處理器對象,支持處理HTTP請求,同時開啟Debug Log,debuglevel 值默認 0nhttp_handler = urllib2.HTTPHandler(debuglevel=1)nn# 構建一個HTTPHSandler 處理器對象,支持處理HTTPS請求,同時開啟Debug Log,debuglevel 值默認 0nhttps_handler = urllib2.HTTPSHandler(debuglevel=1)n
代碼操作(二) 自定義數據請求方式
# -*- coding:utf-8 -*-nimport urllib,urllib2nn#準備數據nftp_server = 192.168.1.100nusername = rootnpassword = 123nn#創建一個密碼管理器對象npass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()nn#增加一個管理伺服器npass_mgr.add_password(None,ftp_server,username,password)nn#創建一個web驗證伺服器nhttp_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)nn#構建一個請求對象nrequest = urllib2.Request(http://image.baidu.com)nn#創建自定義打開方式對象【開鎖人】nopener = urllib2.build_opener(http_auth_handler)nn#發送請求,獲取伺服器的響應對象nresponse = opener.open(request)nn# 獲取響應中的數據ncontent = response.read()nn#處理相關數據n
代碼操作(三)從ftp伺服器爬取數據
# -*- coding:utf-8 -*-nimport urllib,urllib2nn#準備數據nftp_server = 192.168.1.100nusername = rootnpassword = 123nn#創建一個密碼管理器對象npass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()nn#增加一個管理伺服器npass_mgr.add_password(None,ftp_server,username,password)nn#創建一個web驗證伺服器nhttp_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)nn#構建一個請求對象nrequest = urllib2.Request(http://image.baidu.com)nn#創建自定義打開方式對象【開鎖人】nopener = urllib2.build_opener(http_auth_handler)nn#發送請求,獲取伺服器的響應對象nresponse = opener.open(request)nn# 獲取響應中的數據ncontent = response.read()nn#處理相關數據nprint contentn
代碼操作(四) 自定義數據請求方式——代理請求
# -*- coding:utf-8 -*-nimport urllibnimport urllib2nn#創建一個HTTP處理器對象n#使用免費的代理進行處理器的創建nproxy_handler = urllib2.ProxyHandler({http:110.50.85.68:80})nn#如果是付費的代理,輸入自己的賬號密碼即可n# proxy_handler = urllib2.ProxyHandler({http:username:password@175.172.212.178:80})nn# 創建一個請求發送對象nopener = urllib2.build_opener(proxy_handler)nn#創建請求對象nrequest = urllib2.Request(rhttp://www.baidu.com)nn#發送請求,獲取伺服器返回的響應對象nresponse = opener.open(request)nn#獲取數據nprint response.read()n
代碼操作(五) 爬取人人網個人中心數據,需要驗證登陸
# -*- coding:utf-8 -*-nimport urllibnimport urllib2nimport cookielibnnn#聲明一個CookieJar對象實例來保存cookiencookie = cookielib.CookieJar()nn#利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器ncookielib_handler = urllib2.HTTPCookieProcessor(cookie)nn#創建一個請求打開方式nopener = urllib2.build_opener(cookielib_handler)nn#構建請求對象 http://www.renren.com/PLogin.do 這個介面沒有做反爬蟲處理nurl = http://www.renren.com/PLogin.do #http://www.renren.com/SysHome.do,這個介面做了反爬蟲處理ndata = urllib.urlencode({email:用戶名,password:密碼})nrequest = urllib2.Request(url,data)nn#發送請求nresponse = opener.open(request)nn#獲取數據ncontent = response.read()nnprint contentn
data數據從form表單name中獲取
代碼操作(六) 爬取指定網頁的圖片保存至本地,這裡寫的函數是爬取遊民星空每周壁紙精選
# -*- coding:utf-8 -*-nimport urllibnimport urllib2nimport renn#定義函數,用於爬取對應的數據ndef getHtml(url):n page = urllib.urlopen(url)n html = page.read()n return htmlnn#定義函數,進行爬蟲的核心處理功能ndef getImg(html):n #使用正則表達式匹配想要保存的數據———圖片n reg = src="(.+?.jpg)"n #將正則表達式編譯成Pattern對象,n imgre = re.compile(reg)n imglist = re.findall(imgre, html)n x = 0n for imgurl in imglist:n urllib.urlretrieve(imgurl, %s.jpg % x)n x+=1n return imglistnn#主程序運行入口nif __name__ == __main__:n Html = raw_input(請輸入想要爬取的網頁鏈接:)nn html = getHtml(Html)n getImg(html)n
註解: urllib 模塊提供的 urlretrieve() 函數
urlretrieve(url, filename=None, reporthook=None, data=None)n
- 參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)
- 參數 reporthook 是一個回調函數,當連接上伺服器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度。
- 參數 data 指 post 到伺服器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示伺服器的響應頭。
- urllib2與urllib一些常用方法的比較
爬取的是遊民星空壁紙精選
從本地文件可以看到爬取保存至本地20張圖片
作者:_知幾 Python愛好者社區專欄作者,請勿轉載,謝謝。
簡書主頁:http://www.jianshu.com/u/9dad6621d2a0博客專欄:_知幾的博客專欄配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享
公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。
推薦閱讀: