目錄:
1.爬蟲進階cookielib
- Python入門網(wǎng)絡爬蟲之精華版:詳細講解了Python學習網(wǎng)絡爬蟲。
- 為了進行高效的抓取有用的數(shù)據(jù)金句,并且減少冗余數(shù)據(jù)的存儲肃拜,后續(xù)需要使用正則表達式來進行對爬取數(shù)據(jù)中特定內容的存儲地粪。
- urllib2 默認會使用環(huán)境變量 http_proxy 來設置 HTTP Proxy。假如一個網(wǎng)站它會檢測某一段時間某個IP 的訪問次數(shù)币绩,如果訪問次數(shù)過多,它會禁止你的訪問】Ъ溃可以設置代理IP來進行爬蟲,具體見代碼操作(四)
- 當你獲取一個URL你使用一個opener蔫骂。在
Python網(wǎng)絡爬蟲(二)- urllib爬蟲案例中么翰,我們都是使用的默認的opener,也就是urlopen辽旋。它是一個特殊的opener浩嫌,可以理解成opener的一個特殊實例,傳入的參數(shù)僅僅是url
补胚,data
码耐,timeout
。 - Cookie溶其,指某些網(wǎng)站為了辨別用戶身份骚腥、進行session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)
cookielib
模塊的主要作用是提供可存儲cookie的對象,以便于與urllib2模塊配合使用來訪問Internet資源瓶逃。Cookielib模塊非常強大桦沉,我們可以利用本模塊的CookieJar類的對象來捕獲cookie并在后續(xù)連接請求時重新發(fā)送每瞒,比如可以實現(xiàn)模擬登錄功能。該模塊主要的對象有CookieJar
纯露、FileCookieJar
剿骨、MozillaCookieJar
、LWPCookieJar
埠褪。如果我們需要用到Cookie浓利,只用這個opener是不能達到目的的,所以我們需要創(chuàng)建更一般的opener來實現(xiàn)對Cookie的設置钞速。
1)獲取Cookie贷掖,并保存到CookieJar()對象中
# urllib2_cookielibtest1.py
import urllib2
import cookielib
# 構建一個CookieJar對象實例來保存cookie
cookiejar = cookielib.CookieJar()
# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象,參數(shù)為CookieJar()對象
handler=urllib2.HTTPCookieProcessor(cookiejar)
# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)
# 4. 以get方法訪問頁面渴语,訪問之后會自動保存cookie到cookiejar中
opener.open("http://www.baidu.com")
## 可以按標準格式將保存的Cookie打印出來
cookieStr = ""
for item in cookiejar:
cookieStr = cookieStr + item.name + "=" + item.value + ";"
## 舍去最后一位的分號
print cookieStr[:-1]
2) 訪問網(wǎng)站獲得cookie苹威,并把獲得的cookie保存在cookie文件中
# urllib2_cookielibtest2.py
import cookielib
import urllib2
# 保存cookie的本地磁盤文件名
filename = 'cookie.txt'
# 聲明一個MozillaCookieJar(有save實現(xiàn))對象實例來保存cookie,之后寫入文件
cookiejar = cookielib.MozillaCookieJar(filename)
# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象驾凶,參數(shù)為CookieJar()對象
handler = urllib2.HTTPCookieProcessor(cookiejar)
# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)
# 創(chuàng)建一個請求牙甫,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
# 保存cookie到本地文件
cookiejar.save()
3)從文件中獲取cookies,做為請求的一部分去訪問
# urllib2_cookielibtest2.py
import cookielib
import urllib2
# 創(chuàng)建MozillaCookieJar(有l(wèi)oad實現(xiàn))實例對象
cookiejar = cookielib.MozillaCookieJar()
# 從文件中讀取cookie內容到變量
cookie.load('cookie.txt')
# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象调违,參數(shù)為CookieJar()對象
handler = urllib2.HTTPCookieProcessor(cookiejar)
# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)
response = opener.open("http://www.baidu.com")
urllib 模塊方法窟哺。
-
urllib2 的異常錯誤處理
- URLError
import urllib2
requset = urllib2.Request('http://www.ajkfhafwjqh.com')
try:
urllib2.urlopen(request, timeout=5)
except urllib2.URLError, err:
print err
- HTTPError
HTTPError是URLError的子類,我們發(fā)出一個請求時技肩,服務器上都會對應一個response應答對象且轨,其中它包含一個數(shù)字"響應狀態(tài)碼"。
如果urlopen或opener.open不能處理的虚婿,會產(chǎn)生一個HTTPError旋奢,對應相應的狀態(tài)碼,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應的狀態(tài)然痊。
注意黄绩,urllib2可以為我們處理重定向的頁面(也就是3開頭的響應碼),100-299范圍的號碼表示成功玷过,所以我們只能看到400-599的錯誤號碼。
import urllib2
requset = urllib2.Request('http://blog.baidu.com/itcast')
try:
urllib2.urlopen(requset)
except urllib2.HTTPError, err:
print err.code
print err
- 改進版
import urllib2
requset = urllib2.Request('http://blog.baidu.com/itcast')
try:
urllib2.urlopen(requset)
except urllib2.HTTPError, err:
print err.code
except urllib2.URLError, err:
print err
else:
print "Good Job"
這樣我們就可以做到筑煮,首先捕獲子類的異常辛蚊,如果子類捕獲不到,那么可以捕獲父類的異常真仲。
2.具體代碼操作
代碼操作(一) 自定義數(shù)據(jù)請求方式
# -*- coding:utf-8 -*-
import urllib2,urllib
#創(chuàng)建一個HTPP請求對象
http_handler = urllib2.HTTPHandler()
# 構建一個HTTPHandler 處理器對象袋马,支持處理HTTPS請求
http_handler = urllib2.HTTPSHandler()
#創(chuàng)建一個打開方式對象
opener = urllib2.build_opener(http_handler)
#通過自定義的打開方式,
response = opener.open('https://www.baidu.com')
#讀取響應對象中的數(shù)據(jù)
print response.read()
注解:這里使用urllib2.HTTPHandler()
訪問https網(wǎng)頁得到的html代碼秸应。
這種方式發(fā)送請求得到的結果虑凛,和使用urllib2.urlopen()發(fā)送HTTP/HTTPS請求得到的結果是一樣的碑宴。
如果在 HTTPHandler()增加 debuglevel=1參數(shù),還會將 Debug Log 打開桑谍,這樣程序在執(zhí)行的時候延柠,會把收包和發(fā)包的報頭在屏幕上自動打印出來,方便調試锣披,有時可以省去抓包的工作贞间。
# 僅需要修改的代碼部分:
# 構建一個HTTPHandler 處理器對象,支持處理HTTP請求雹仿,同時開啟Debug Log增热,debuglevel 值默認 0
http_handler = urllib2.HTTPHandler(debuglevel=1)
# 構建一個HTTPHSandler 處理器對象,支持處理HTTPS請求胧辽,同時開啟Debug Log峻仇,debuglevel 值默認 0
https_handler = urllib2.HTTPSHandler(debuglevel=1)
代碼操作(二) 自定義數(shù)據(jù)請求方式
# -*- coding:utf-8 -*-
import urllib,urllib2
#準備數(shù)據(jù)
ftp_server = '192.168.1.100'
username = 'root'
password = '123'
#創(chuàng)建一個密碼管理器對象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
#增加一個管理服務器
pass_mgr.add_password(None,ftp_server,username,password)
#創(chuàng)建一個web驗證服務器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)
#構建一個請求對象
request = urllib2.Request('http://image.baidu.com')
#創(chuàng)建自定義打開方式對象【開鎖人】
opener = urllib2.build_opener(http_auth_handler)
#發(fā)送請求,獲取服務器的響應對象
response = opener.open(request)
# 獲取響應中的數(shù)據(jù)
content = response.read()
#處理相關數(shù)據(jù)
代碼操作(三)從ftp服務器爬取數(shù)據(jù)
# -*- coding:utf-8 -*-
import urllib,urllib2
#準備數(shù)據(jù)
ftp_server = '192.168.1.100'
username = 'root'
password = '123'
#創(chuàng)建一個密碼管理器對象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
#增加一個管理服務器
pass_mgr.add_password(None,ftp_server,username,password)
#創(chuàng)建一個web驗證服務器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)
#構建一個請求對象
request = urllib2.Request('http://image.baidu.com')
#創(chuàng)建自定義打開方式對象【開鎖人】
opener = urllib2.build_opener(http_auth_handler)
#發(fā)送請求邑商,獲取服務器的響應對象
response = opener.open(request)
# 獲取響應中的數(shù)據(jù)
content = response.read()
#處理相關數(shù)據(jù)
print content
代碼操作(四) 自定義數(shù)據(jù)請求方式——代理請求
# -*- coding:utf-8 -*-
import urllib
import urllib2
#創(chuàng)建一個HTTP處理器對象
#使用免費的代理進行處理器的創(chuàng)建
proxy_handler = urllib2.ProxyHandler({'http':'110.50.85.68:80'})
#如果是付費的代理摄咆,輸入自己的賬號密碼即可
# proxy_handler = urllib2.ProxyHandler({'http':'username:password@175.172.212.178:80'})
# 創(chuàng)建一個請求發(fā)送對象
opener = urllib2.build_opener(proxy_handler)
#創(chuàng)建請求對象
request = urllib2.Request(r'http://www.baidu.com')
#發(fā)送請求,獲取服務器返回的響應對象
response = opener.open(request)
#獲取數(shù)據(jù)
print response.read()
代碼操作(五) 爬取人人網(wǎng)個人中心數(shù)據(jù)奠骄,需要驗證登陸
# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib
#聲明一個CookieJar對象實例來保存cookie
cookie = cookielib.CookieJar()
#利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器
cookielib_handler = urllib2.HTTPCookieProcessor(cookie)
#創(chuàng)建一個請求打開方式
opener = urllib2.build_opener(cookielib_handler)
#構建請求對象 'http://www.renren.com/PLogin.do' 這個接口沒有做反爬蟲處理
url = 'http://www.renren.com/PLogin.do' #http://www.renren.com/SysHome.do豆同,這個接口做了反爬蟲處理
data = urllib.urlencode({'email':'用戶名','password':'密碼'})
request = urllib2.Request(url,data)
#發(fā)送請求
response = opener.open(request)
#獲取數(shù)據(jù)
content = response.read()
print content
代碼操作(六) 爬取指定網(wǎng)頁的圖片保存至本地,這里寫的函數(shù)是爬取游民星空每周壁紙精選
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
#定義函數(shù)含鳞,用于爬取對應的數(shù)據(jù)
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
#定義函數(shù)影锈,進行爬蟲的核心處理功能
def getImg(html):
#使用正則表達式匹配想要保存的數(shù)據(jù)———圖片
reg = 'src="(.+?\.jpg)"'
#將正則表達式編譯成Pattern對象,
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl, '%s.jpg' % x)
x+=1
return imglist
#主程序運行入口
if __name__ == '__main__':
Html = raw_input('請輸入想要爬取的網(wǎng)頁鏈接:')
html = getHtml(Html)
getImg(html)
注解: urllib 模塊提供的 urlretrieve() 函數(shù)
urlretrieve(url, filename=None, reporthook=None, data=None)
- 參數(shù) finename 指定了保存本地路徑(如果參數(shù)未指定蝉绷,urllib會生成一個臨時文件保存數(shù)據(jù)鸭廷。)
- 參數(shù) reporthook 是一個回調函數(shù),當連接上服務器熔吗、以及相應的數(shù)據(jù)塊傳輸完畢時會觸發(fā)該回調辆床,我們可以利用這個回調函數(shù)來顯示當前的下載進度。
- 參數(shù) data 指 post 到服務器的數(shù)據(jù)桅狠,該方法返回一個包含兩個元素的(filename, headers)元組讼载,filename 表示保存到本地的路徑,header 表示服務器的響應頭中跌。
- urllib2與urllib一些常用方法的比較