python爬蟲(chóng)基礎(chǔ)之urllib的使用
一、urllib 和 urllib2的關(guān)系
在python2中,主要使用urllib和urllib2,而python3對(duì)urllib和urllib2進(jìn)行了重構(gòu),拆分成了urllib.request, urllib.parse, urllib.error,urllib.robotparser等幾個(gè)子模塊,這樣的架構(gòu)從邏輯和結(jié)構(gòu)上說(shuō)更加合理。urllib庫(kù)無(wú)需安裝,python3自帶。python 3.x中將urllib庫(kù)和urilib2庫(kù)合并成了urllib庫(kù)。
urllib2.urlopen() 變成了 urllib.request.urlopen()
urllib2.Request() 變成了 urllib.request.Request()
python2中的 cookielib 改為 http.cookiejar.
import http.cookiejar 代替 import cookielib
urljoin 現(xiàn)在對(duì)應(yīng)的函數(shù)是 urllib.parse.urljoin
二、python3下的urllib庫(kù)
- request,它是最基本的 HTTP 請(qǐng)求模塊,我們可以用它來(lái)模擬發(fā)送一請(qǐng)求,只需要給庫(kù)方法傳入 URL 還有額外的參數(shù),就可以模擬實(shí)現(xiàn)這個(gè)過(guò)程了。
- error ,即異常處理模塊,如果出現(xiàn)請(qǐng)求錯(cuò)誤,我們可以捕獲這些異常,然后進(jìn)行重試或其他操作保證程序不會(huì)意外終止。
- parse ,是一個(gè)工具模塊,提供了許多 URL 處理方法,比如拆分、解析、合并等等的方法。
- robotparser,主要是用來(lái)識(shí)別網(wǎng)站的 robots.txt 文件,然后判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬的,其實(shí)用的比較少。
三、request的基礎(chǔ)類(lèi)
(一)request.urlopen
urlopen方法最主要的參數(shù)就是目標(biāo)網(wǎng)站的url地址,可以使str類(lèi)型,也可以是一個(gè)request對(duì)象。
get方法請(qǐng)求如下:
from urllib import request,parse respones = request.urlopen(http://www.baidu.com/)
post方法請(qǐng)求,需要添加data參數(shù)(字典格式),它要是字節(jié)流編碼格式的內(nèi)容,即 bytes 類(lèi)型,通過(guò) bytes() 方法可以進(jìn)行轉(zhuǎn)化,另外如果傳遞了這個(gè) data 參數(shù),不添加data參數(shù)就默認(rèn)為 GET 方式請(qǐng)求。
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
由于單獨(dú)使用urlopen() 方法的不能添加User-Agent、Cookie等headers信息,需要構(gòu)建一個(gè) Request 類(lèi)型的對(duì)象,通過(guò)構(gòu)造這個(gè)這個(gè)數(shù)據(jù)結(jié)構(gòu),一方面我們可以將請(qǐng)求獨(dú)立成一個(gè)對(duì)象,另一方面可配置參數(shù)更加豐富和靈活。主要參數(shù)有:
- url 參數(shù)是請(qǐng)求 URL,這個(gè)是必傳參數(shù),其他的都是可選參數(shù)。
- data 參數(shù)如果要傳必須傳 bytes(字節(jié)流)類(lèi)型的,如果是一個(gè)字典,可以先用 urllib.parse 模塊里的 urlencode() 編碼。
- headers 參數(shù)是一個(gè)字典,這個(gè)就是 Request Headers 了,你可以在構(gòu)造 Request 時(shí)通過(guò) headers 參數(shù)直接構(gòu)造,也可以通過(guò)調(diào)用 Request 實(shí)例的 add_header() 方法來(lái)添加, Request Headers 最常用的用法就是通過(guò)修改 User-Agent 來(lái)偽裝瀏覽器,默認(rèn)的 User-Agent 是 Python-urllib,我們可以通過(guò)修改它來(lái)偽裝瀏覽器。
- origin_req_host 參數(shù)指的是請(qǐng)求方的 host 名稱或者 IP 地址。
- unverifiable 參數(shù)指的是這個(gè)請(qǐng)求是否是無(wú)法驗(yàn)證的,默認(rèn)是False。意思就是說(shuō)用戶沒(méi)有足夠權(quán)限來(lái)選擇接收這個(gè)請(qǐng)求的結(jié)果。例如我們請(qǐng)求一個(gè) HTML 文檔中的圖片,但是我們沒(méi)有自動(dòng)抓取圖像的權(quán)限,這時(shí) unverifiable 的值就是 True。
- method 參數(shù)是一個(gè)字符串,它用來(lái)指示請(qǐng)求使用的方法,比如GET,POST,PUT等等。
通過(guò)隨機(jī)的方法,選擇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/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)' ] #隨機(jī)獲取一個(gè)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) #請(qǐng)求添加user-agent req.add_header("User-Agent",user_agent) #獲取請(qǐng)求的user-agent agent的a要小寫(xiě) print(req.get_header("User-agent")) response = request.urlopen(req)print(respones.read().decode('utf-8'))
三、request的高級(jí)類(lèi)
在urllib.request模塊里的BaseHandler類(lèi),他是所有其他Handler的父類(lèi),他是一個(gè)處理器,比如用它來(lái)處理登錄驗(yàn)證,處理cookies,代理設(shè)置,重定向等。它提供了直接使用和派生類(lèi)使用的方法:
- add_parent(director):添加director作為父類(lèi)
- close():關(guān)閉它的父類(lèi)
- parent():打開(kāi)使用不同的協(xié)議或處理錯(cuò)誤
- defautl_open(req):捕獲所有的URL及子類(lèi),在協(xié)議打開(kāi)之前調(diào)用
Handler的子類(lèi)包括:
HTTPDefaultErrorHandler:用來(lái)處理http響應(yīng)錯(cuò)誤,錯(cuò)誤會(huì)拋出HTTPError類(lèi)的異常
HTTPRedirectHandler:用于處理重定向
HTTPCookieProcessor:用于處理cookies
ProxyHandler:用于設(shè)置代理,默認(rèn)代理為空
HTTPPasswordMgr:永遠(yuǎn)管理密碼,它維護(hù)用戶名和密碼表
HTTPBasicAuthHandler:用戶管理認(rèn)證,如果一個(gè)鏈接打開(kāi)時(shí)需要認(rèn)證,可以使用它來(lái)實(shí)現(xiàn)驗(yàn)證功能
(一)ProxyHandler
如果爬蟲(chóng)需要大量爬取網(wǎng)站數(shù)據(jù),為了避免被封號(hào),需要使用代理,通過(guò)request.build_opener()方法生成一個(gè)opener對(duì)象,添加代理的方法如下:
from urllib import request #代理開(kāi)關(guān),表示是否開(kāi)啟代理 proxyswitch =True #構(gòu)建一個(gè)handler處理器對(duì)象,參數(shù)是一個(gè)字典類(lèi)型,包括代理類(lèi)型和代理服務(wù)器IP+PORT proxyhandler = request.ProxyHandler({"http":"191.96.42.80:3128"}) #如果是帶用戶名和密碼的代理,格式為{"http":"username:passwd@191.96.42.80:3128"} #不加代理的handler處理器對(duì)象 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
通過(guò)密碼管理器的方法實(shí)現(xiàn)代理服務(wù)器功能
from urllib import request #代理密碼管理,也可以管理服務(wù)器賬戶密碼 #賬戶密碼 user = "username" passwd = "passwd" #代理服務(wù)器 proxyserver = "1.1.1.1:9999" #構(gòu)建密碼管理對(duì)象,保存需要處理的用戶名和密碼 passmgr = request.HTTPPasswordMgrWithDefaultRealm() #添加賬戶信息,第一個(gè)參數(shù)realm是與遠(yuǎn)程服務(wù)器相關(guān)的域信息 passmgr.add_password(None,proxyserver,user,passwd) #構(gòu)建基礎(chǔ)ProxyBasicAuthHandler處理器對(duì)象 proxyauth_handler = request.ProxyBasicAuthHandler(passmgr) opener = request.build_opener(proxyauth_handler) req = request.Request("http://www.baidu.com/") response = opener.open(req)
(三)ProxyBasicAuthHandler
通過(guò)密碼管理器的方法實(shí)現(xiàn)web認(rèn)證登陸功能
#web驗(yàn)證 from urllib import request test = "test" passwd = "123456" webserver = "1.1.1.1" #構(gòu)建密碼管理器handler passwdmgr = request.HTTPPasswordMgrWithDefaultRealm() #添加密碼信息 passwdmgr.add_password(None,webserver,test,passwd) #HTTP基礎(chǔ)驗(yàn)證處理器類(lèi) http_authhandler = request.HTTPBasicAuthHandler(passwdmgr) opener = request.build_opener(http_authhandler) req = request.Request("http://"+webserver) response = opener.open(req)
四、Cookie處理
通過(guò)http.cookiejar中的HTTPCookieProcessor構(gòu)建cookie處理器對(duì)象,處理cookie信息
import http.cookiejar from urllib import request,parse #模擬登陸先post賬戶密碼 #然后保存生成的cookie #通過(guò)CookieJar類(lèi)構(gòu)件一個(gè)coociejar對(duì)象,從來(lái)保存cookie值 cookie = http.cookiejar.CookieJar() #構(gòu)件cookie處理器對(duì)象,用來(lái)處理cookie cookie_handler = request.HTTPCookieProcessor(cookie) #構(gòu)件一個(gè)自定義的opener opener = request.build_opener(cookie_handler) #通過(guò)自定義的opener的addheaders參數(shù),可以添加HTTP報(bào)頭參數(shù) 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賬號(hào)", "password":"密碼" } #數(shù)據(jù)處理 data = bytes(parse.urlencode(data),'utf-8') #第一次是POST請(qǐng)求,通過(guò)登陸賬戶密碼,得到cookie req = request.Request(url,data=data) #發(fā)送第一次POST請(qǐng)求,生成登陸后的cookie response = opener.open(req) print(response.read().decode("utf-8")) #此時(shí)的opener已經(jīng)包含了該鏈接下的cookie,此時(shí)使用該opener就可以直接訪問(wèn)該站點(diǎn)下其他的網(wǎng)頁(yè)而不需要再登陸了 opener.open(http://www.renren.com/PLogin.doxxxxxxxxxxxxx)
以上就是python爬蟲(chóng)基礎(chǔ)之urllib的使用的詳細(xì)內(nèi)容,更多關(guān)于python 爬蟲(chóng)urllib的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python urllib.request模塊的使用詳解
- python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))
- python urllib和urllib3知識(shí)點(diǎn)總結(jié)
- Python urllib request模塊發(fā)送請(qǐng)求實(shí)現(xiàn)過(guò)程解析
- Python urllib3軟件包的使用說(shuō)明
- Python urllib庫(kù)如何添加headers過(guò)程解析
- 詳解python內(nèi)置模塊urllib
- python3 中使用urllib問(wèn)題以及urllib詳解
- Python urllib2運(yùn)行過(guò)程原理解析
- Python urllib.request對(duì)象案例解析
- python中urllib.request和requests的使用及區(qū)別詳解
- python urllib庫(kù)的使用詳解
相關(guān)文章
Python sorted對(duì)list和dict排序
這篇文章主要介紹了Python sorted對(duì)list和dict排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Python二進(jìn)制文件轉(zhuǎn)換為文本文件的代碼實(shí)現(xiàn)
在日常編程中,我們經(jīng)常會(huì)遇到需要將二進(jìn)制文件轉(zhuǎn)換為文本文件的情況,在Python中,我們可以利用各種庫(kù)和技術(shù)來(lái)完成這項(xiàng)任務(wù),本文將介紹如何使用Python將二進(jìn)制文件轉(zhuǎn)換為文本文件,并提供實(shí)用的代碼示例,需要的朋友可以參考下2024-04-04Python實(shí)現(xiàn)拼音轉(zhuǎn)換
拼音轉(zhuǎn)換指的是將漢字轉(zhuǎn)為拼音的過(guò)程。本文介紹了Python實(shí)現(xiàn)拼音轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06解決python打不開(kāi)文件(文件不存在)的問(wèn)題
今天小編就為大家分享一篇解決python打不開(kāi)文件(文件不存在)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡(jiǎn)單實(shí)現(xiàn)數(shù)獨(dú)游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)數(shù)獨(dú)游戲和java實(shí)現(xiàn)數(shù)獨(dú)游戲的相關(guān)代碼,比較兩種語(yǔ)言實(shí)現(xiàn)數(shù)獨(dú)游戲的區(qū)別2018-03-03