爬蟲壁紙精選,沒毛病,你絕對需要!

乾貨來襲!不要躲避!

爬蟲壁紙精選,沒毛病,你絕對需要!

1)獲取Cookie,並保存到CookieJar()對象中

# urllib2_cookielibtest1.pyimport urllib2import cookielib# 構建一個CookieJar對象實例來保存cookiecookiejar = cookielib.CookieJar()# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象handler=urllib2.HTTPCookieProcessor(cookiejar)# 通過 build_opener() 來構建openeropener = 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) 訪問網站獲得cookie,並把獲得的cookie保存在cookie文件中

# urllib2_cookielibtest2.pyimport cookielibimport urllib2# 保存cookie的本地磁盤文件名filename = 'cookie.txt'# 聲明一個MozillaCookieJar(有save實現)對象實例來保存cookie,之後寫入文件cookiejar = cookielib.MozillaCookieJar(filename)# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象handler = urllib2.HTTPCookieProcessor(cookiejar)# 通過 build_opener() 來構建openeropener = urllib2.build_opener(handler)# 創建一個請求,原理同urllib2的urlopenresponse = opener.open("http://www.baidu.com")# 保存cookie到本地文件cookiejar.save()

3)從文件中獲取cookies,做為請求的一部分去訪問

# urllib2_cookielibtest2.pyimport cookielibimport urllib2# 創建MozillaCookieJar(有load實現)實例對象cookiejar = cookielib.MozillaCookieJar()# 從文件中讀取cookie內容到變量cookie.load('cookie.txt')# 使用HTTPCookieProcessor()來創建cookie處理器對象,參數為CookieJar()對象handler = urllib2.HTTPCookieProcessor(cookiejar)# 通過 build_opener() 來構建openeropener = urllib2.build_opener(handler)response = opener.open("http://www.baidu.com")
  • urllib 模塊方法。urllib2 的異常錯誤處理URLError
import urllib2requset = urllib2.Request('http://www.ajkfhafwjqh.com')try: urllib2.urlopen(request, timeout=5)except urllib2.URLError, err: print err
  • HTTPError

HTTPError是URLError的子類,我們發出一個請求時,服務器上都會對應一個response應答對象,其中它包含一個數字"響應狀態碼"。

如果urlopen或opener.open不能處理的,會產生一個HTTPError,對應相應的狀態碼,HTTP狀態碼錶示HTTP協議所返回的響應的狀態。

注意,urllib2可以為我們處理重定向的頁面(也就是3開頭的響應碼),100-299範圍的號碼錶示成功,所以我們只能看到400-599的錯誤號碼。

import urllib2requset = urllib2.Request('http://blog.baidu.com/itcast')try: urllib2.urlopen(requset)except urllib2.HTTPError, err: print err.code print err
  • 改進版
import urllib2requset = urllib2.Request('http://blog.baidu.com/itcast')try: urllib2.urlopen(requset)except urllib2.HTTPError, err: print err.codeexcept urllib2.URLError, err: print errelse: print "Good Job"

這樣我們就可以做到,首先捕獲子類的異常,如果子類捕獲不到,那麼可以捕獲父類的異常。

2.具體代碼操作

1、自定義數據請求方式

# -*- coding:utf-8 -*-import urllib2,urllib#創建一個HTPP請求對象http_handler = urllib2.HTTPHandler()# 構建一個HTTPHandler 處理器對象,支持處理HTTPS請求http_handler = urllib2.HTTPSHandler()#創建一個打開方式對象opener = urllib2.build_opener(http_handler)#通過自定義的打開方式,response = opener.open('https://www.baidu.com')#讀取響應對象中的數據print response.read()
爬蟲壁紙精選,沒毛病,你絕對需要!

爬取結果

註解:這裡使用urllib2.HTTPHandler()訪問https網頁得到的html代碼。

爬蟲壁紙精選,沒毛病,你絕對需要!

這種方式發送請求得到的結果,和使用urllib2.urlopen()發送HTTP/HTTPS請求得到的結果是一樣的。

如果在 HTTPHandler()增加 debuglevel=1參數,還會將 Debug Log 打開,這樣程序在執行的時候,會把收包和發包的報頭在屏幕上自動打印出來,方便調試,有時可以省去抓包的工作。

# 僅需要修改的代碼部分:# 構建一個HTTPHandler 處理器對象,支持處理HTTP請求,同時開啟Debug Log,debuglevel 值默認 0http_handler = urllib2.HTTPHandler(debuglevel=1)# 構建一個HTTPHSandler 處理器對象,支持處理HTTPS請求,同時開啟Debug Log,debuglevel 值默認 0https_handler = urllib2.HTTPSHandler(debuglevel=1)

2、自定義數據請求方式

# -*- coding:utf-8 -*-import urllib,urllib2#準備數據ftp_server = '192.168.1.100'username = 'root'password = '123'#創建一個密碼管理器對象pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()#增加一個管理服務器pass_mgr.add_password(None,ftp_server,username,password)#創建一個web驗證服務器http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)#構建一個請求對象request = urllib2.Request('http://image.baidu.com')#創建自定義打開方式對象【開鎖人】opener = urllib2.build_opener(http_auth_handler)#發送請求,獲取服務器的響應對象response = opener.open(request)# 獲取響應中的數據content = response.read()#處理相關數據

3、從ftp服務器爬取數據

# -*- coding:utf-8 -*-import urllib,urllib2#準備數據ftp_server = '192.168.1.100'username = 'root'password = '123'#創建一個密碼管理器對象pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()#增加一個管理服務器pass_mgr.add_password(None,ftp_server,username,password)#創建一個web驗證服務器http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)#構建一個請求對象request = urllib2.Request('http://image.baidu.com')#創建自定義打開方式對象【開鎖人】opener = urllib2.build_opener(http_auth_handler)#發送請求,獲取服務器的響應對象response = opener.open(request)# 獲取響應中的數據content = response.read()#處理相關數據print content

4、自定義數據請求方式——代理請求

# -*- coding:utf-8 -*-import urllibimport urllib2#創建一個HTTP處理器對象#使用免費的代理進行處理器的創建proxy_handler = urllib2.ProxyHandler({'http':'110.50.85.68:80'})#如果是付費的代理,輸入自己的賬號密碼即可# proxy_handler = urllib2.ProxyHandler({'http':'username:[email protected]:80'})# 創建一個請求發送對象opener = urllib2.build_opener(proxy_handler)#創建請求對象request = urllib2.Request(r'http://www.baidu.com')#發送請求,獲取服務器返回的響應對象response = opener.open(request)#獲取數據print response.read()

5、 爬取人人網個人中心數據,需要驗證登陸

# -*- coding:utf-8 -*-import urllibimport urllib2import cookielib#聲明一個CookieJar對象實例來保存cookiecookie = cookielib.CookieJar()#利用urllib2庫的HTTPCookieProcessor對象來創建cookie處理器cookielib_handler = urllib2.HTTPCookieProcessor(cookie)#創建一個請求打開方式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)#發送請求response = opener.open(request)#獲取數據content = response.read()print content
爬蟲壁紙精選,沒毛病,你絕對需要!

6、data數據從form表單name中獲取

爬取指定網頁的圖片保存至本地,這裡寫的函數是爬取遊民星空每週壁紙精選

# -*- coding:utf-8 -*-import urllibimport urllib2import re#定義函數,用於爬取對應的數據def getHtml(url): page = urllib.urlopen(url) html = page.read() return html#定義函數,進行爬蟲的核心處理功能def getImg(html): #使用正則表達式匹配想要保存的數據———圖片 reg = 'class="lazy" data-original="(.+?\.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('請輸入想要爬取的網頁鏈接:') html = getHtml(Html) getImg(html) 

註解: urllib 模塊提供的 urlretrieve() 函數

urlretrieve(url, filename=None, reporthook=None, data=None)

參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)參數 reporthook 是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度。參數 data 指 post 到服務器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務器的響應頭。

乾貨是否已享用完畢?求關注!求點評!求收藏!更多精彩內容請關注尚學堂!

爬蟲壁紙精選,沒毛病,你絕對需要!


分享到:


相關文章: