最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python標(biāo)準(zhǔn)庫之urllib和urllib3的使用及說明

 更新時(shí)間:2022年12月01日 10:34:15   作者:愛編程的喵汪人  
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫之urllib和urllib3使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、urllib

urllib是Python中請(qǐng)求url連接的官方標(biāo)準(zhǔn)庫,在Python2中主要為urllib和urllib2,在Python3中整合成了urllib。

urllib中一共有四個(gè)模塊,分別如下:

  • request:主要負(fù)責(zé)構(gòu)造和發(fā)起網(wǎng)絡(luò)請(qǐng)求,定義了適用于在各種復(fù)雜情況下打開 URL (主要為 HTTP) 的函數(shù)和類
  • error:處理異常
  • parse:解析各種數(shù)據(jù)格式
  • robotparser:解析robot.txt文件

1. urllib.request模塊

模塊中最常用的函數(shù)為urllib.request.urlopen(),參數(shù)如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • url:  請(qǐng)求的網(wǎng)址
  • data:要發(fā)送到服務(wù)器的數(shù)據(jù)
  • timeout:設(shè)置網(wǎng)站的訪問超時(shí)時(shí)間

urlopen返回對(duì)象提供方法:

  • read() , readline() ,readlines() , fileno() , close() :對(duì)HTTPResponse類型數(shù)據(jù)進(jìn)行操作
  • info():返回HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息
  • getcode():返回Http狀態(tài)碼。如果是http請(qǐng)求,200請(qǐng)求成功完成 ; 404網(wǎng)址未找到
  • geturl():返回請(qǐng)求的url

(1)發(fā)送簡(jiǎn)單的GET請(qǐng)求:

from urllib import request
?
response = request.urlopen('https://www.baidu.com')
print(response.read().decode())

在urlopen()方法中,直接寫入要訪問的url地址字符串,該方法就會(huì)主動(dòng)的訪問目標(biāo)網(wǎng)址,然后返回訪問結(jié)果,返回的訪問結(jié)果是一個(gè)    http.client.HTTPResponse對(duì)象,使用該對(duì)象的read()方法即可獲取訪問網(wǎng)頁獲取的數(shù)據(jù),這個(gè)數(shù)據(jù)是二進(jìn)制格式的,所以我們還需要使用decode()方法來將獲取的二進(jìn)制數(shù)據(jù)進(jìn)行解碼,轉(zhuǎn)換成我們可以看的懂得字符串。

(2)發(fā)送簡(jiǎn)單的POST請(qǐng)求:

from urllib import reuqest
?
response = request.urlopen('http://httpbin.org/post', data=b'word=hello')
?
print(response.read().decode()) ? #decode()解碼

在urlopen()方法中,urlopen()默認(rèn)的訪問方式是GET,當(dāng)在urlopen()方法中傳入data參數(shù)時(shí),則會(huì)發(fā)起POST請(qǐng)求。注意:傳遞的data數(shù)據(jù)需要為bytes格式

(3)復(fù)雜的請(qǐng)求——請(qǐng)求頭

當(dāng)我們需要模擬一些其他的參數(shù)的時(shí)候,簡(jiǎn)單的urlopen() 方法已經(jīng)無法滿足我們的需求了,這個(gè)時(shí)候我們就需要使用urllib.request中的Request對(duì)象來幫助我們實(shí)現(xiàn)一些其它參數(shù)的模擬,比如請(qǐng)求頭。

Request對(duì)象如下所示:

# Request對(duì)象實(shí)例化
req ?= urllib.request.Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)

舉例如下: 

? from urllib import request
??
? url = 'http://httpbin.org/get'
? headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
??
? # 需要使用url和headers生成一個(gè)Request對(duì)象,然后將其傳入urlopen方法中
? req = request.Request(url, headers=headers)
? resp = request.urlopen(req)
? print(resp.read().decode())

(4)復(fù)雜的請(qǐng)求—代理IP

使用爬蟲來爬取數(shù)據(jù)的時(shí)候,如果過于頻繁的訪問,而且網(wǎng)站還設(shè)有限制的話,很有可能會(huì)禁封我們的ip地址,這個(gè)時(shí)候就需要設(shè)置代理,來隱藏我們的真實(shí)IP。

代理IP的原理:以本機(jī)先訪問代理IP,再通過代理IP地址訪問服務(wù)器,這樣服務(wù)器接受到的訪問IP就是代理IP地址。

urllib提供了urllib.request.ProxyHandler()方法可動(dòng)態(tài)的設(shè)置代理IP池。將代理IP以字典形式傳入該方法,然后通過urllib.reques.build_opener()創(chuàng)建opener對(duì)象,用該對(duì)象的open()方法向服務(wù)器發(fā)送請(qǐng)求。

?from urllib import request
??
? url = 'http://httpbin.org/ip'
? proxy = {'http': '218.18.232.26:80', 'https': '218.18.232.26:80'}
? proxies = request.ProxyHandler(proxy) ?# 創(chuàng)建代理處理器
? opener = request.build_opener(proxies) ?# 創(chuàng)建opener對(duì)象
??
? resp = opener.open(url)
? print(resp.read().decode())

在上述的方法中我們還用到了一個(gè)新的東西,即request.build_opener()方法,其實(shí)urlopen()就是通過構(gòu)造好了的opener對(duì)象發(fā)送請(qǐng)求,在這里我們使用request.build_opener()方法重構(gòu)了一個(gè)opener()對(duì)象,我們可以通過這個(gè)對(duì)象實(shí)現(xiàn)urlopen()實(shí)現(xiàn)的任何東西。

(5)復(fù)雜的請(qǐng)求—cookies

有時(shí)候當(dāng)我們?cè)L問一些網(wǎng)站的時(shí)候需要進(jìn)行翻頁或者跳轉(zhuǎn)等其它操作,為了防止無法訪問我們想要的數(shù)據(jù),需要讓網(wǎng)站識(shí)別我們是同一個(gè)用戶。這個(gè)時(shí)候我們就需要帶上cookie進(jìn)行訪問。

在設(shè)置cookie的時(shí)候由于urllib并沒有很好的處理cookie的對(duì)象,所以在這里我們需要用到一個(gè)別的庫,即http庫,并使用里面的cookiejar來進(jìn)行cookie的管理:

from http import cookiejar
from urllib import request
??
url = 'https://www.baidu.com'
# 創(chuàng)建一個(gè)cookiejar對(duì)象
cookie = cookiejar.CookieJar()
# 使用HTTPCookieProcessor創(chuàng)建cookie處理器
cookies = request.HTTPCookieProcessor(cookie)
# 并以它為參數(shù)創(chuàng)建Opener對(duì)象
opener = request.build_opener(cookies)
# 使用這個(gè)opener來發(fā)起請(qǐng)求
resp = opener.open(url)
??
# 查看之前的cookie對(duì)象,則可以看到訪問百度獲得的cookie
for i in cookie:
? ? print(i)

當(dāng)然,如果把上面這個(gè)生成的opener對(duì)象使用install_opener方法來設(shè)置為全局的,opener對(duì)象之后的每次訪問都會(huì)帶上這個(gè)cookie。

設(shè)置全局后既可以用urlopen()方法, 也可以用opener.open() ,不安裝的話只能用opener.open()方法

# 將這個(gè)opener設(shè)置為全局的opener,之后所有的,不管是opener.open()還是urlopen() 發(fā)送請(qǐng)求,都將使用自定義
request.install_opener(opener)
resp = request.urlopen(url)

(6)復(fù)雜的請(qǐng)求—證書驗(yàn)證

CA(Certificate Authority)是數(shù)字證書認(rèn)證中心的簡(jiǎn)稱,是指發(fā)放、管理、廢除數(shù)字證書的受信任的第三方機(jī)構(gòu)。

CA的作用是檢查證書持有者身份的合法性,并簽發(fā)證書,以防證書被偽造或篡改,以及對(duì)證書和密鑰進(jìn)行管理。

現(xiàn)實(shí)生活中可以用身份證來證明身份, 那么在網(wǎng)絡(luò)世界里,數(shù)字證書就是身份證。

和現(xiàn)實(shí)生活不同的是,并不是每個(gè)上網(wǎng)的用戶都有數(shù)字證書的,往往只有當(dāng)一個(gè)人需要證明自己的身份的時(shí)候才需要用到數(shù)字證書。

普通用戶一般是不需要,因?yàn)榫W(wǎng)站并不關(guān)心是誰訪問了網(wǎng)站,現(xiàn)在的網(wǎng)站只關(guān)心流量。

但是反過來,網(wǎng)站就需要證明自己的身份了。比如說現(xiàn)在釣魚網(wǎng)站很多的,比如你想訪問的是www.baidu.com,但其實(shí)你訪問的是www.daibu.com”,所以在提交自己的隱私信息之前需要驗(yàn)證一下網(wǎng)站的身份,要求網(wǎng)站出示數(shù)字證書。

一般正常的網(wǎng)站都會(huì)主動(dòng)出示自己的數(shù)字證書,來確??蛻舳撕途W(wǎng)站服務(wù)器之間的通信數(shù)據(jù)是加密安全的。

最簡(jiǎn)單的方法就是通過添加忽略ssl證書驗(yàn)證關(guān)閉證書驗(yàn)證,由于urllib并沒有很好的處理ssl的對(duì)象,所以在這里我們需要用到一個(gè)別的庫,即ssl庫,如下:

import ssl
from urllib import request
?
context = ssl._create_unverified_context()
res = urllib.request.urlopen(request, context=context)

2. urllib.error 模塊

在urllib中主要設(shè)置了兩個(gè)異常,一個(gè)是URLError,一個(gè)是HTTPError,HTTPError是URLError的子類。

HTTPError還包含了三個(gè)屬性:

  • code:請(qǐng)求的狀態(tài)碼
  • reason:錯(cuò)誤的原因
  • headers:響應(yīng)的報(bào)頭
from urllib.error import HTTPError
?
try:
? ? request.urlopen('https://www.jianshu.com')
except HTTPError as e:
? ? print(e.code)

3.urllib.parse 模塊

data參數(shù)需要用urllib.parse模塊對(duì)其進(jìn)行數(shù)據(jù)格式處理。

  • urllib.parse.quote(url):(URL編碼處理)主要對(duì)URL中的非ASCII碼編碼處理
  • urllib.parse.unquote(url):(URL解碼處理)URL上的特殊字符還原
  • urllib.parse.urlencode:對(duì)請(qǐng)求數(shù)據(jù)data進(jìn)行格式轉(zhuǎn)換

二、urllib3

來自官方網(wǎng)站的解釋

urllib3是一個(gè)功能強(qiáng)大,對(duì)SAP 健全的 HTTP客戶端。許多Python生態(tài)系統(tǒng)已經(jīng)使用了urllib3,你也應(yīng)該這樣做。                    

通過urllib3訪問一個(gè)網(wǎng)頁,那么必須首先構(gòu)造一個(gè)PoolManager對(duì)象,然后通過PoolMagent中的request方法或者 urlopen()方法來訪問一個(gè)網(wǎng)頁,兩者幾乎沒有任何區(qū)別。

class urllib3.poolmanager.PoolManager(num_pools = 10,headers = None,** connection_pool_kw )

生成一個(gè)PoolManager所需要的參數(shù):

  • num_pools 代表了緩存的池的個(gè)數(shù),如果訪問的個(gè)數(shù)大于num_pools,將按順序丟棄最初始的緩存,將緩存的個(gè)數(shù)維持在池的大小。
  • headers 代表了請(qǐng)求頭的信息,如果在初始化PoolManager的時(shí)候制定了headers,那么之后每次使用PoolManager來進(jìn)行訪問的時(shí)候,都將使用該headers來進(jìn)行訪問。
  • ** connection_pool_kw 是基于connection_pool 來生成的其它設(shè)置

當(dāng)訪問網(wǎng)頁完成之后,將會(huì)返回一個(gè)HTTPResponse對(duì)象,可以通過如下的方法來讀取獲取GET請(qǐng)求的響應(yīng)內(nèi)容:

import urllib3
?
http = urllib3.PoolManager(num_pools=5, headers={'User-Agent': 'ABCDE'})
?
resp1 = http.request('GET', 'http://www.baidu.com', body=data)
# resp2 = http.urlopen('GET', 'http://www.baidu.com', body=data)
?
print(resp2.data.decode())

除了普通的 GET 請(qǐng)求之外,你還可以使用request()或者urlopen()進(jìn)行 POST 請(qǐng)求:

import urllib3
import json
?
data = json.dumps({'abc': '123'})
http = urllib3.PoolManager(num_pools=5, headers={'User-Agent': 'ABCDE'})
?
resp1 = http.request('POST', 'http://www.httpbin.org/post', body=data,timeout=5,retries=5)
#resp2 = http.urlopen('POST', 'http://www.httpbin.org/post', body=data,timeout=5,retries=5)
?
print(resp1.data.decode())

注意事項(xiàng)

urllib3 并沒有辦法單獨(dú)設(shè)置cookie,所以如果你想使用cookie的話,可以將cookie放入到headers中

request()和urlopen()方法

request(self, method, url, fields=None, headers=None, **urlopen_kw)?
urlopen(self, method, url, redirect=True, **kw):

差距還是很明顯的,urlopen()比request()有三個(gè)參數(shù)是不一樣的,你會(huì)發(fā)現(xiàn)request()具有fields,headers兩個(gè)參數(shù)。而且相比之下 reuqest() 方法還是比較符合人們的使用方式的,所以更多的也就使用 request() 方法了。

推薦使用request()來進(jìn)行訪問的,因?yàn)槭褂胷equest()來進(jìn)行訪問有兩點(diǎn)好處,

  • 可以直接進(jìn)行post請(qǐng)求,不需要將 data參數(shù)轉(zhuǎn)換成JSON格式
  • 直接進(jìn)行GET請(qǐng)求,不需要自己拼接url參數(shù)
import urllib3
import json
?
data = {'abc': '123'}
http = urllib3.PoolManager(num_pools=5, headers={'User-Agent': 'ABCDE'})
?
resp1 = http.request('POST', 'http://www.httpbin.org/post', fields=data)
# resp1 = http.request('GET', 'http://www.httpbin.org/post', fields=data) ?
?
print(resp1.data.decode())

雖然urlopen()沒有fields,但這并不代表它不能進(jìn)行POST訪問,相反,兩個(gè)方法都有一個(gè)body屬性,這個(gè)屬性就是我們平時(shí)POST請(qǐng)求時(shí)所熟知的data參數(shù),只不過你需要將data字典先轉(zhuǎn)換成JSON格式再進(jìn)行傳輸。

不過特別要聲明的一點(diǎn)是 fielder 和 body 中只能存在一個(gè)。

urllib3 ProxyManager

如果你需要使用代理來訪問某個(gè)網(wǎng)站的話, 那么你可以使用 ProxyManager 對(duì)象來進(jìn)行設(shè)置

def __init__(self, proxy_url, num_pools=10, headers=None,proxy_headers=None, **connection_pool_kw):

ProxyManager和PoolManager的方法基本完全相同,這里舉個(gè)簡(jiǎn)單的小例子,就不再贅述了:

import urllib3
import json
?
data = {'abc': '123'}
proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})
resp1 = proxy.request('POST', 'http://www.httpbin.org/post', fields=data)
print(resp1.data.decode())

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python制作一個(gè)PPT文本提取工具

    Python制作一個(gè)PPT文本提取工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python開發(fā)一個(gè)帶圖形界面的PPT文本提取工具,可以從PPTX文件中提取所有文本內(nèi)容,有需要的小伙伴可以了解下
    2025-01-01
  • python實(shí)現(xiàn)一個(gè)搖骰子小游戲

    python實(shí)現(xiàn)一個(gè)搖骰子小游戲

    大家好,本篇文章主要講的是python實(shí)現(xiàn)一個(gè)搖骰子小游戲,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(PysimpleGUI)

    一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(PysimpleGUI)

    這篇文章主要介紹了一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python繪制餅圖、圓環(huán)圖的實(shí)例

    Python繪制餅圖、圓環(huán)圖的實(shí)例

    這篇文章主要介紹了Python繪制餅圖、圓環(huán)圖的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Django中prefetch_related()函數(shù)優(yōu)化實(shí)戰(zhàn)指南

    Django中prefetch_related()函數(shù)優(yōu)化實(shí)戰(zhàn)指南

    我們可以利用Django框架中select_related和prefetch_related函數(shù)對(duì)數(shù)據(jù)庫查詢優(yōu)化,這篇文章主要給大家介紹了關(guān)于Django中prefetch_related()函數(shù)優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 使用Python實(shí)現(xiàn)圖像有效壓縮的方法

    使用Python實(shí)現(xiàn)圖像有效壓縮的方法

    在數(shù)字時(shí)代,圖像作為信息傳遞的重要媒介,在網(wǎng)頁設(shè)計(jì)、移動(dòng)應(yīng)用和多媒體制作中扮演著不可或缺的角色,本文將詳細(xì)介紹如何使用Python,一個(gè)功能強(qiáng)大且易于學(xué)習(xí)的編程語言,來實(shí)現(xiàn)圖像的有效壓縮,感興趣的朋友可以參考下
    2024-03-03
  • Python辦公自動(dòng)化SFTP詳解

    Python辦公自動(dòng)化SFTP詳解

    這篇文章主要介紹了Python辦公自動(dòng)化SFTP詳解,sftp和ftp的區(qū)別在安全通道,使用的協(xié)議,鏈接方式,安全性等方面都有不同,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-08-08
  • Python生態(tài)圈圖像格式轉(zhuǎn)換問題(推薦)

    Python生態(tài)圈圖像格式轉(zhuǎn)換問題(推薦)

    在Python生態(tài)圈里,最常用的圖像庫是PIL——盡管已經(jīng)被后來的pillow取代,但因?yàn)閜illow的API幾乎完全繼承了PIL,所以大家還是約定俗成地稱其為PIL。這篇文章主要介紹了Python生態(tài)圈圖像格式轉(zhuǎn)換問題,需要的朋友可以參考下
    2019-12-12
  • 教你用python實(shí)現(xiàn)一個(gè)加密的文字處理器

    教你用python實(shí)現(xiàn)一個(gè)加密的文字處理器

    生活中有時(shí)候我們需要對(duì)一些重要的文件進(jìn)行加密,下面這篇文章主要給大家介紹了關(guān)于如何用python實(shí)現(xiàn)一個(gè)加密文字處理器的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 如何使用python的xml庫實(shí)現(xiàn)自閉合標(biāo)簽

    如何使用python的xml庫實(shí)現(xiàn)自閉合標(biāo)簽

    文章介紹了作者編寫一個(gè)URDF格式化插件的初衷,目的是解決sw2urdf導(dǎo)出的URDF文件格式混亂的問題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-01-01

最新評(píng)論

阳东县| 游戏| 祁阳县| 鹰潭市| 汝阳县| 大邑县| 万山特区| 阿拉善右旗| 石渠县| 阳西县| 思茅市| 徐汇区| 辛集市| 怀仁县| 通城县| 汤原县| 汤阴县| 宁波市| 泸西县| 广饶县| 泰和县| 玉山县| 闻喜县| 柘荣县| 涿鹿县| 溧阳市| 澄迈县| 唐河县| 富平县| 成武县| 扎囊县| 通江县| 珠海市| 安吉县| 扎兰屯市| 常山县| 福安市| 红桥区| 丰顺县| 岚皋县| 莱阳市|