urllib 是一個(gè)用來(lái)處理網(wǎng)絡(luò)請(qǐng)求的python標(biāo)準(zhǔn)庫(kù),它包含4個(gè)模塊。
request模塊主要負(fù)責(zé)構(gòu)造和發(fā)起網(wǎng)絡(luò)請(qǐng)求,并在其中添加Headers,Proxy等。 利用它可以模擬瀏覽器的請(qǐng)求發(fā)起過(guò)程。
關(guān)于urllib.request.urlopen參數(shù)的介紹
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen是一個(gè)簡(jiǎn)單發(fā)送網(wǎng)絡(luò)請(qǐng)求的方法。它接收一個(gè)字符串格式的url,它會(huì)向傳入的url發(fā)送網(wǎng)絡(luò)請(qǐng)求,然后返回結(jié)果。
先寫(xiě)一個(gè)簡(jiǎn)單的例子:
from urllib import request response = request.urlopen(url='http://www.httpbin.org/get') print(response.read().decode())
urlopen默認(rèn)會(huì)發(fā)送get請(qǐng)求,當(dāng)傳入data參數(shù)時(shí),則會(huì)發(fā)起POST請(qǐng)求。data參數(shù)是字節(jié)類型、者類文件對(duì)象或可迭代對(duì)象。
from urllib import request response = request.urlopen(url='http://www.httpbin.org/post', data=b'username=q123password=123') print(response.read().decode())
還才可以設(shè)置超時(shí),如果請(qǐng)求超過(guò)設(shè)置時(shí)間,則拋出異常。timeout沒(méi)有指定則用系統(tǒng)默認(rèn)設(shè)置,timeout只對(duì),http,https以及ftp連接起作用。它以秒為單位,比如可以設(shè)置timeout=0.1 超時(shí)時(shí)間為0.1秒。
from urllib import request response = request.urlopen(url='https://www.baidu.com/',timeout=0.1)
利用openurl可以發(fā)起最基本的請(qǐng)求,但這幾個(gè)簡(jiǎn)單的參數(shù)不足以構(gòu)建一個(gè)完整的請(qǐng)求,可以利用更強(qiáng)大的Request對(duì)象來(lái)構(gòu)建更加完整的請(qǐng)求。
通過(guò)urllib發(fā)送的請(qǐng)求會(huì)有一個(gè)默認(rèn)的Headers: “User-Agent”:“Python-urllib/3.6”,指明請(qǐng)求是由urllib發(fā)送的。所以遇到一些驗(yàn)證User-Agent的網(wǎng)站時(shí),需要我們自定義Headers把自己偽裝起來(lái)。
from urllib import request headers ={ 'Referer': 'https://www.baidu.com/s?ie=utf-8f=3rsv_bp=1tn=baiduwd=python%20urllib%E5%BA%93oq=python%2520urllib%25E5%25BA%2593rsv_pq=947af0af001c94d0rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpworqlang=cnrsv_enter=0prefixsug=python%2520urllib%25E5%25BA%2593rsp=0', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' } response = request.Request(url='https://www.baidu.com/',headers=headers) response = request.urlopen(response) print(response.read().decode())
在開(kāi)發(fā)爬蟲(chóng)過(guò)程中,對(duì)cookie的處理非常重要,urllib的cookie的處理如下案例
from urllib import request from http import cookiejar # 創(chuàng)建一個(gè)cookie對(duì)象 cookie = cookiejar.CookieJar() # 創(chuàng)一個(gè)cookie處理器 cookies = request.HTTPCookieProcessor(cookie) # 以它為參數(shù),創(chuàng)建opener對(duì)象 opener = request.build_opener(cookies) # 使用這個(gè)opener 來(lái)發(fā)請(qǐng)求 res =opener.open('https://www.baidu.com/') print(cookies.cookiejar)
運(yùn)行爬蟲(chóng)的時(shí)候,經(jīng)常會(huì)出現(xiàn)被封IP的情況,這時(shí)我們就需要使用ip代理來(lái)處理,urllib的IP代理的設(shè)置如下:
from urllib import request url ='http://httpbin.org/ip' #代理地址 proxy ={'http':'172.0.0.1:3128'} # 代理處理器 proxies =request.ProxyBasicAuthHandler(proxy) # 創(chuàng)建opener對(duì)象 opener = request.build_opener(proxies) res =opener.open(url) print(res.read().decode())
urlib庫(kù)中的類或或者方法,在發(fā)送網(wǎng)絡(luò)請(qǐng)求后,都會(huì)返回一個(gè)urllib.response的對(duì)象。它包含了請(qǐng)求回來(lái)的數(shù)據(jù)結(jié)果。它包含了一些屬性和方法,供我們處理返回的結(jié)果
parse.urlencode() 在發(fā)送請(qǐng)求的時(shí)候,往往會(huì)需要傳遞很多的參數(shù),如果用字符串方法去拼接會(huì)比較麻煩,parse.urlencode()方法就是用來(lái)拼接url參數(shù)的。
from urllib import parse params = {'wd':'測(cè)試', 'code':1, 'height':188} res = parse.urlencode(params) print(res)
打印結(jié)果為wd=%E6%B5%8B%E8%AF%95code=1height=188
也可以通過(guò)parse.parse_qs()方法將它轉(zhuǎn)回字典
print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95code=1height=188'))
error模塊主要負(fù)責(zé)處理異常,如果請(qǐng)求出現(xiàn)錯(cuò)誤,我們可以用error模塊進(jìn)行處理 主要包含URLError和HTTPError
URLError:是error異常模塊的基類,由request模塊產(chǎn)生的異常都可以用這個(gè)類來(lái)處理
HTTPError:是URLError的子類,主要包含三個(gè)屬性
from urllib import request,error try: response = request.urlopen("http://pythonsite.com/1111.html") except error.HTTPError as e: print(e.reason) print(e.code) print(e.headers) except error.URLError as e: print(e.reason) else: print("reqeust successfully")
robotparse模塊主要負(fù)責(zé)處理爬蟲(chóng)協(xié)議文件,robots.txt.的解析。
Robots協(xié)議(也稱為爬蟲(chóng)協(xié)議、機(jī)器人協(xié)議等)的全稱是“網(wǎng)絡(luò)爬蟲(chóng)排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),網(wǎng)站通過(guò)Robots協(xié)議告訴搜索引擎哪些頁(yè)面可以抓取,哪些頁(yè)面不能抓取
urllib3是比urllib庫(kù)更強(qiáng)大的存在,目前已經(jīng)有許多的原生系統(tǒng)已經(jīng)開(kāi)始使用urllib3。
urllib3具有如下優(yōu)點(diǎn):
因?yàn)閡rllib3并不是Python的標(biāo)準(zhǔn)庫(kù),所以我們使用之前,需要進(jìn)行下載安裝,具體命令如下所示:
pip install urllib3 #或 conda install urllib3
下面,我們來(lái)講解urllib3庫(kù)的使用方式。
首先,在我們使用urllib3庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),需創(chuàng)建PoolManager類的實(shí)例,該類用于管理線程池。
下面,我們來(lái)通過(guò)urllib訪問(wèn)百度,并返回查詢的結(jié)果,示例如下:
import urllib3 http = urllib3.PoolManager() url = 'http://www.baidu.com/s' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = http.request('GET', url, fields={'wd': '機(jī)器學(xué)習(xí)'}, headers=headers) result = response.data.decode('UTF-8') print(result)
運(yùn)行之后,效果如下:
這里,我們通過(guò)fields參數(shù)指定GET的請(qǐng)求字段。不過(guò),這里先一步講解了請(qǐng)求頭,其實(shí)是百度有安全機(jī)制,讀者可以去掉headers參數(shù)試試。會(huì)返回百度的安全驗(yàn)證頁(yè)面。
如果需要向服務(wù)器提交表單或者比較復(fù)雜的數(shù)據(jù),就需要使用到POST請(qǐng)求。POST請(qǐng)求比較簡(jiǎn)單,僅僅只是將請(qǐng)求的第一個(gè)參數(shù)改為“POST”即可。
示例如下:
import urllib3 http = urllib3.PoolManager() url = 'http://httpbin.org/post' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = http.request('POST', url, fields={'username': 'name', 'age': '123456'}, headers=headers) result = response.data.decode('UTF-8') print(result)
運(yùn)行之后,返回如下數(shù)據(jù):
使用urllib3庫(kù)進(jìn)行網(wǎng)絡(luò)訪問(wèn)時(shí),其返回的HTTPResponse。默認(rèn)有一些攜帶的參數(shù),其中就包括info方法。它能返回響應(yīng)頭數(shù)據(jù),示例如下:
import urllib3 http = urllib3.PoolManager() url = 'http://www.baidu.com/s' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = http.request('POST', url, fields={'wd': '機(jī)器學(xué)習(xí)'}, headers=headers) for key in response.info().keys(): print('key:',response.info()[key])
運(yùn)行之后,返回的響應(yīng)數(shù)據(jù)如下:
首先,我們需要簡(jiǎn)單的實(shí)現(xiàn)一個(gè)文件上傳的服務(wù)器代碼,這里我們使用Flask搭建一個(gè)簡(jiǎn)單的服務(wù)器Python程序,代碼如下:
import flask import os UPLOAD_FILE = 'uploads' app = flask.Flask(__name__) @app.route('/', methods=['POST']) def upload_file(): file = flask.request.files['file'] if file: file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename))) return '文件上傳成功' else: return '文件上傳失敗' if __name__ == '__main__': app.run()
運(yùn)行之后,它會(huì)一直等待客戶端上傳文件。
這個(gè)時(shí)候,我們?cè)賮?lái)實(shí)現(xiàn)urllib3是如何上傳文件的,示例如下:
import urllib3 http = urllib3.PoolManager() with open('1.jpg', 'rb') as f: fileData = f.read() url = 'http://127.0.0.1:5000' response = http.request('POST', url, fields={'file': ('1.jpg', fileData, 'image/jpeg')}) print(response.data.decode('UTF-8'))
默認(rèn)flask搭建的服務(wù)器,其接口為5000,也就是通過(guò)127.0.0.1:5000進(jìn)行訪問(wèn)。運(yùn)行之后,就會(huì)在uploads文件夾下創(chuàng)建一個(gè)1.jpg的圖片。
同時(shí),控制臺(tái)會(huì)輸出文件上傳成功,而服務(wù)器會(huì)返回狀態(tài)碼200。
這里,上傳文件就1一個(gè)鍵值對(duì),其中file代表服務(wù)器上傳文件的字段。值的元組里,fileData為文件的二進(jìn)制形式,'image/jpeg'代表上傳文件的格式(可以省略)。
urllib3庫(kù)其HTTP的底層都是基于Socket實(shí)現(xiàn)的,而Socket超時(shí)又分為連接超時(shí)與讀超時(shí)。
其中,連接超時(shí)表示在連接的過(guò)程中,由于服務(wù)器的問(wèn)題或域名弄錯(cuò)了,而導(dǎo)致的無(wú)法連接的情況拋出的異常。
讀超時(shí)表示從服務(wù)器讀取數(shù)據(jù)時(shí)由于服務(wù)器的問(wèn)題,導(dǎo)致長(zhǎng)時(shí)間無(wú)法正常讀取數(shù)據(jù)而導(dǎo)致的異常。
通常,我們超時(shí)的設(shè)置有2種,一種是通過(guò)http.request(timeout)進(jìn)行設(shè)置,一種是通過(guò)PoolManager()連接池進(jìn)行設(shè)置。示例如下:
from urllib3 import * http = PoolManager(timeout=Timeout(connect=2.0, read=2.0)) with open('1.jpg', 'rb') as f: fileData = f.read() url = 'http://127.0.0.1:5000' try: response = http.request('POST', url, timeout=Timeout(connect=2.0, read=4.0)) print(response.data.decode('UTF-8')) except Exception as e: print(e)
需要注意的是,通過(guò)連接池PoolManager進(jìn)行設(shè)置的超時(shí),是全局超時(shí)時(shí)間,哪怕你后邊的請(qǐng)求不設(shè)置,也是默認(rèn)使用的這個(gè)超時(shí)。如果同時(shí)設(shè)置了request的超時(shí),那么以request為準(zhǔn)。
到此這篇關(guān)于Python爬蟲(chóng)中urllib3與urllib的區(qū)別是什么的文章就介紹到這了,更多相關(guān)Python urllib3 urllib內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:濰坊 西安 贛州 雅安 七臺(tái)河 許昌 渭南 辛集
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python爬蟲(chóng)中urllib3與urllib的區(qū)別是什么》,本文關(guān)鍵詞 Python,爬蟲(chóng),中,urllib3,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。