python爬蟲基礎之urllib的使用
一、urllib 和 urllib2的關係
在python2中,主要使用urllib和urllib2,而python3對urllib和urllib2進行了重構,拆分成了urllib.request,urllib.parse,urllib.error,urllib.robotparser等幾個子模組,這樣的架構從邏輯和結構上說更加合理。urllib庫無需安裝,python3自帶。python 3.x中將urllib庫和urilib2庫合併成了urllib庫。
urllib2.urlopen() 變成了 urllib.request.urlopen()
urllib2.Request() 變成了 urllib.request.Request()
import http.cookiejar 代替 import cookielib
urljoin 現在對應的函式是 urllib.parse.urljoin
二、python3下的urllib庫
- request,它是最基本的 HTTP 請求模組,我們可以用它來模擬傳送一請求,只需要給庫方法傳入 URL 還有額外的引數,就可以模擬實現這個過程了。
- error ,即異常處理模組,如果出現請求錯誤,我們可以捕獲這些異常,然後進行重試或其他操作保證程式不會意外終止。
- parse ,是一個工具模組,提供了許多 URL 處理方法,比如拆分、解析、合併等等的方法。
- robotparser,主要是用來識別網站的 robots.txt 檔案,然後判斷哪些網站可以爬,哪些網站不可以爬的,其實用的比較少。
三、request的基礎類
(一)request.urlopen
urlopen方法最主要的引數就是目標網站的url地址,可以使str型別,也可以是一個request物件。
get方法請求如下:
from urllib import request,parse respones = request.urlopen(http://www.baidu.com/)
post方法請求,需要新增data引數(字典格式),它要是位元組流編碼格式的內容,即 bytes 型別,通過 bytes() 方法可以進行轉化,另外如果傳遞了這個 data 引數,不新增data引數就預設為 GET 方式請求。
from urllib import request,parse url = "http://www.baidu.com/" wd = {'wd':'哇哈哈哈'} data = bytes(parse.urlencode(wd),'utf-8') respones = request.urlopen(url,data=data)
(二)request.Request
由於單獨使用urlopen() 方法的不能新增User-Agent、Cookie等headers資訊,需要構建一個 Request 型別的物件,通過構造這個這個資料結構,一方面我們可以將請求獨立成一個物件,另一方面可配置引數更加豐富和靈活。主要引數有:
- url 引數是請求 URL,這個是必傳引數,其他的都是可選引數。
- data 引數如果要傳必須傳 bytes(位元組流)型別的,如果是一個字典,可以先用 urllib.parse 模組裡的 urlencode() 編碼。
- headers 引數是一個字典,這個就是 Request Headers 了,你可以在構造 Request 時通過 headers 引數直接構造,也可以通過呼叫 Request 例項的 add_header() 方法來新增,Request Headers 最常用的用法就是通過修改 User-Agent 來偽裝瀏覽器,預設的 User-Agent 是 Python-urllib,我們可以通過修改它來偽裝瀏覽器。
- origin_req_host 引數指的是請求方的 host 名稱或者 IP 地址。
- unverifiable 引數指的是這個請求是否是無法驗證的,預設是False。意思就是說使用者沒有足夠許可權來選擇接收這個請求的結果。例如我們請求一個 HTML 文件中的圖片,但是我們沒有自動抓取影象的許可權,這時 unverifiable 的值就是 True。
- method 引數是一個字串,它用來指示請求使用的方法,比如GET,POST,PUT等等。
通過隨機的方法,選擇user-agent:
import randomUA_LIST = [ 'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML,like Gecko)','Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; Acoo Browser; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Avant Browser)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)','Mozilla/4.0 (compatible; Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729); Windows NT 5.1; Trident/4.0)','Mozilla/4.0 (compatible; Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; Acoo Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727); Windows NT 5.1; Trident/4.0; Maxthon; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.2)','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)' ] #隨機獲取一個user-agent user_agent = random.choice(UA_LIST)
新增headers頭部資訊的方法1:
url='http://www.baidu.com/'user_agent = random.choice(UA_LIST) headers = { 'User-Agent': user_agent } req = request.Request(url=url,headers=headers) respones = request.urlopen(req)
新增headers頭部資訊的方法2:
url='http://www.baidu.com' headers = { 'User-Agent': user_agent } #新增user-agent的方法2 req = request.Request(url) #請求新增user-agent req.add_header("User-Agent",user_agent) #獲取請求的user-agent agent的a要小寫 print(req.get_header("User-agent")) response = request.urlopen(req)print(respones.read().decode('utf-8'))
三、request的高階類
在urllib.request模組裡的BaseHandler類,他是所有其他Handler的父類,他是一個處理器,比如用它來處理登入驗證,處理cookies,代理設定,重定向等。它提供了直接使用和派生類使用的方法:
- add_parent(director):新增director作為父類
- close():關閉它的父類
- parent():開啟使用不同的協議或處理錯誤
- defautl_open(req):捕獲所有的URL及子類,在協議開啟之前呼叫
Handler的子類包括:
HTTPDefaultErrorHandler:用來處理http響應錯誤,錯誤會丟擲HTTPError類的異常
HTTPRedirectHandler:用於處理重定向
HTTPCookieProcessor:用於處理cookies
ProxyHandler:用於設定代理,預設代理為空
HTTPPasswordMgr:永遠管理密碼,它維護使用者名稱和密碼錶
HTTPBasicAuthHandler:使用者管理認證,如果一個連結開啟時需要認證,可以使用它來實現驗證功能
(一)ProxyHandler
如果爬蟲需要大量爬取網站資料,為了避免被封號,需要使用代理,通過request.build_opener()方法生成一個opener物件,新增代理的方法如下:
from urllib import request #代理開關,表示是否開啟代理 proxyswitch =True #構建一個handler處理器物件,引數是一個字典型別,包括代理型別和代理伺服器IP+PORT proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"}) #如果是帶使用者名稱和密碼的代理,格式為{"http":"username:[email protected]:3128"} #不加代理的handler處理器物件 nullproxyhandler = request.ProxyHandler() if proxyswitch: opener = request.build_opener(proxyhandler) else: opener = request.build_opener(nullproxyhandler) req = request.Request("http://www.baidu.com/") response = opener.open(req) print(response.read().decode("utf-8"))
(二)ProxyBasicAuthHandler
通過密碼管理器的方法實現代理伺服器功能
from urllib import request #代理密碼管理,也可以管理伺服器賬戶密碼 #賬戶密碼 user = "username" passwd = "passwd" #代理伺服器 proxyserver = "1.1.1.1:9999" #構建密碼管理物件,儲存需要處理的使用者名稱和密碼 passmgr = request.HTTPPasswordMgrWithDefaultRealm() #新增賬戶資訊,第一個引數realm是與遠端伺服器相關的域資訊 passmgr.add_password(None,proxyserver,user,passwd) #構建基礎ProxyBasicAuthHandler處理器物件 proxyauth_handler = request.ProxyBasicAuthHandler(passmgr) opener = request.build_opener(proxyauth_handler) req = request.Request("http://www.baidu.com/") response = opener.open(req)
(三)ProxyBasicAuthHandler
通過密碼管理器的方法實現web認證登陸功能
#web驗證 from urllib import request test = "test" passwd = "123456" webserver = "1.1.1.1" #構建密碼管理器handler passwdmgr = request.HTTPPasswordMgrWithDefaultRealm() #新增密碼資訊 passwdmgr.add_password(None,webserver,test,passwd) #HTTP基礎驗證處理器類 http_authhandler = request.HTTPBasicAuthHandler(passwdmgr) opener = request.build_opener(http_authhandler) req = request.Request("http://"+webserver) response = opener.open(req)
四、Cookie處理
通過http.cookiejar中的HTTPCookieProcessor構建cookie處理器物件,處理cookie資訊
import http.cookiejar from urllib import request,parse #模擬登陸先post賬戶密碼 #然後儲存生成的cookie #通過CookieJar類構件一個coociejar物件,從來儲存cookie值 cookie = http.cookiejar.CookieJar() #構件cookie處理器物件,用來處理cookie cookie_handler = request.HTTPCookieProcessor(cookie) #構件一個自定義的opener opener = request.build_opener(cookie_handler) #通過自定義的opener的addheaders引數,可以新增HTTP報頭引數 opener.addheaders = [("User-Agent","Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML,like Gecko)"),] #需要登陸的介面 url = 'http://www.renren.com/PLogin.do' #需要登陸的賬戶密碼 data = { "email":"renren賬號","password":"密碼" } #資料處理 data = bytes(parse.urlencode(data),'utf-8') #第一次是POST請求,通過登陸賬戶密碼,得到cookie req = request.Request(url,data=data) #傳送第一次POST請求,生成登陸後的cookie response = opener.open(req) print(response.read().decode("utf-8")) #此時的opener已經包含了該連結下的cookie,此時使用該opener就可以直接訪問該站點下其他的網頁而不需要再登陸了 opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)
以上就是python爬蟲基礎之urllib的使用的詳細內容,更多關於python 爬蟲urllib的資料請關注我們其它相關文章!