中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的HTTP客戶端模塊urllib與urllib3怎么使用

發布時間:2022-05-31 09:19:25 來源:億速云 閱讀:194 作者:iii 欄目:開發技術

本篇內容介紹了“Python的HTTP客戶端模塊urllib與urllib3怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、urllib

概述:

urllib是Python中請求url連接的官方標準庫,就是你安裝了python,這個庫就已經可以直接使用了,基本上涵蓋了基礎的網絡請求功能。在Python2中主要為urllib和urllib2,在Python3中整合成了urllib。

Python3.x中將urllib2合并到了urllib,之后此包分成了以下四個模塊:

  • urllib.request: 它是最基本的http請求模塊,用來模擬發送請求

  • urllib.error: 異常處理模塊,如果出現錯誤可以捕獲這些異常

  • urllib.parse: 一個工具模塊,提供了許多URL處理方法,如:拆分、解析、合并等

  • urllib.robotparser:主要用來識別網站的robots.txt文件,然后判斷哪些網站可以爬

二、urllib.parse模塊

它支持如下協議的URL處理:file,ftp,gopher,hdl,http,https,imap,mailto,mms,news,nntp,prospero,rsync,rtsp,rtspu,sftp,sip,sips,snews,svn,snv+ssh,telnet,wais

1、urlparse()、urlunparse():將url字符串解析成元組

語法:urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)

可以傳遞3個參數

  • urlstring:待解析的URL,字符串

  • scheme:它是默認的協議,如http或者https,URL如果不帶http協議,可以通過scheme來指定,如果URL中制定了http協議則URL中生效

  • allow_fragments:是否忽略fragment即錨點,如果設置為False,fragment部分會被忽略,反之不忽略

該方法可以實現URL的識別和分段,分別是scheme(協議),netloc(域名),path(路徑),params(參數),query(查詢條件),fragment(錨點)

import urllib.parse

url = "http://www.baidu.com"
parsed = urllib.parse.urlparse(url)
print(parsed)
# 輸出:ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='') #返回的是一個parseresult類型的元組對象,可以通過屬性或者索引來獲取值

與urlparse()相反,urlunparse通過列表或者元祖的形式接受一個可迭代的對象,實現URL構造

from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data)) #構造一個完整的URL

#output
#http://www.baidu.com/index.html;user?a=6#comment

2、urlsplit()、urlunsplit():URL分割與組合

與urlparse()方法類似,它會返回5個部分,只是把params合并到path中。

from urllib.parse import urlsplit

result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
print(result.query)
# output
# SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
# id=5

與urlunparse()類似,它也是將鏈接的各部分組合完整的鏈接的方法,傳入的參數也是可迭代的對象,如列表元祖等,唯一的區別是長度必須是5個,它省略了params

from urllib.parse import urlsplit,urlunsplit
data=['http','www.baidu.com','index.html','a=5','comment']
result=urlunsplit(data)
print(result)

#output
#http://www.baidu.com/index.html?a=5#comment

3、urlencode()、parse_qs():查詢字符串與字典類型轉換

urlencode() 將dict中的鍵值對以連接符&劃分。

urlencode()在構造GET請求參數時很有用,可以將字典類型的請求數據轉變為url編碼

import urllib.parse
dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

print(data)     #age=18&name=melon

parse_qs()與urlencode()正好相反,它是用來反序列化的,如將GET參數轉換回字典格式

from urllib.parse import urlencode,parse_qs,urlsplit
params = {'username':'zs','password':'123'}
base_url='http://www.baidu.com'
url=base_url+'?'+urlencode(params) #將字典轉化為get參數

query=urlsplit(url).query  #獲去URL的query參數條件
print(parse_qs(query))  #根據獲取的GET參數轉換為字典格式

#output
#{'username': ['zs'], 'password': ['123']}

4、quote()、unquote():URL編碼與解碼

quote:URL編碼處理,該方法可以將內容轉換為URL編碼的格式。

如參數中帶有中文等非ASCII碼時,有時會導致亂碼的問題,此時用這個方法將中文字符轉化為URL編碼

from urllib.parse import quote
key='中文'
url='https://www.baidu.com/s?key='+quote(key)
print(url)

#output
#https://www.baidu.com/s?key=%E4%B8%AD%E6%96%87

unquote(url):URL解碼處理,與quote()相反,URL上的特殊字符還原

from urllib.parse import quote, urlsplit, unquote

key = '中文'
url = 'https://www.baidu.com/s?key=' + quote(key)
print(url)
unq = urlsplit(url).query.split('=')[1]  # 獲取參數值

print(unquote(unq))  # 解碼參數

5、urljoin():將url的根域名和新url拼合成一個完整的url

格式:urljoin(baseurl,newurl,allowFrag=None)

通過將基本URL(base)與另一個URL(url)組合起來構建完整URL,它會使用基本URL組件,協議(schemm)、域名(netloc)、路徑(path)、來提供給URL中缺失的部分進行補充,最后返回結果。

base_url提供了三項內容scheme,netloc,path,如果這3項在新的鏈接中不存在就給予補充,如果新的鏈接存在就使用新的鏈接部分,而base_url中的params,query和fragment是不起作用的。

通過urljoin()方法可以實現鏈接的解析、拼接和生成。

import urllib.parse

url = "http://www.baidu.com"
new_path = urllib.parse.urljoin(url, "index.html")
print(new_path)
# 輸出:<a href="http://www.baidu.com/index.html" rel="external nofollow"   target="_blank">http://www.baidu.com/index.html</a>

三、urllib.request模塊

1、urlretrieve():下載url到html文件。

urlretrieve(url,filename,reporthook,data)

不寫路徑filename則會被存為臨時文件,可以用 urllib.urlcleanup() 來清理緩存

file_name = urllib.request.urlretrieve('http://www.baidu.com','%s/baidu.html'%BASE_DIR)

2、urlopen():打開一個url的方法,返回一個文件對象,然后可以進行類似文件對象的操作

模塊中最常用的函數為urlopen():

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

參數如下:

  • url: 請求的網址,str類型,也可以是一個request對象

  • data:要發送到服務器的數據,data參數是可選的,內容為字節流編碼格式的即bytes類型,如果傳遞data參數,urlopen將使用Post方式請求。

  • timeout:設置網站的訪問超時時間,單位為秒,如果請求超出了設置時間還未得到響應則拋出異常,支持HTTP,HTTPS,FTP請求。

  • 其他參數:context參數,她必須是ssl.SSLContext類型,用來指定SSL設置,此外,cafile和capath這兩個參數分別指定CA證書和它的路徑,會在https鏈接時用到。

1、urlopen的方法:

urlopen返回http.client.HTTPResponse對象,提供方法:

  • read():獲取響應返回的數據,只能使用一次。

  • readline():返回得是二進制格式得頁面中得第一行

  • readlines() :以二進制格式 返回所有得數據 以列表格式保存

  • fileno():

  • close() :

  • info():返回一個httplib.HTTPMessage 對象,表示遠程服務器返回的頭信息。

  • getcode():返回Http狀態碼,如果是http請求,200表示請求成功完成;404表示網址未找到。

  • getheaders():獲取返回響應的響應報頭。

  • geturl():返回請求的url。

在urlopen()方法中,直接寫入要訪問的url地址字符串,該方法就會主動的訪問目標網址,然后返回訪問結果。

返回的訪問結果是一個http.client.HTTPResponse對象,使用該對象的read()方法即可獲取訪問網頁獲取的數據,這個數據是二進制格式的,所以我們還需要使用decode()方法來將獲取的二進制數據進行解碼,轉換成我們可以看的懂得字符串。

import urllib.request

req = urllib.request.urlopen('http://www.baidu.com')
print(req.read().decode())
print(req.getheaders())  # 以列表元祖對的形式返回響應頭信息
print(req.getheader('Content-Type'))  # 返回響應頭中的Content-Type值
print(req.info())  # 返回網頁的頭信息
print(req.info()['Content-Type'])  # 返回響應頭中的Content-Type值
2、for循環讀取

不需要使用read()方法 。

for line in urlopen('https://。。.html'):
    line = line.decode('utf-8')  # Decoding the binary data to text.
    if 'EST' in line or 'EDT' in line:  # look for Eastern Time
        print(line)
3、GET請求

GET請求和我們平常get訪問方式一樣,直接把參數寫到網址上面就好了。

import urllib.request
import urllib.parse

dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

req = urllib.request.urlopen('http://127.0.0.1:8000/index?%s'%data) #通過urlopen方法訪問拼接好的url

content = req.read()
4、POST請求

urlopen()方法中,urlopen()默認的訪問方式是GET,當在urlopen()方法中傳入data參數時,則會發起POST請求。

注意:傳遞的data數據需要為bytes格式,如data=b'word=hello'。

import urllib.request
import urllib.parse
import json

dic = {'name':'melon','age':18}
data = urllib.parse.urlencode(dic)

req = urllib.request.Request('http://127.0.0.1:8000/index', data.encode()) #encode:將url編碼類型的請求數據轉變為bytes類型

opener = urllib.request.urlopen(req)
content = json.loads(opener.read().decode()) #read()方法是讀取返回bytes數據內容,decode轉換后為str
5、請求頭參數模擬

當我們需要模擬一些其他的參數的時候,簡單的urlopen() 方法已經無法滿足我們的需求了,這個時候我們就需要使用下面的urllib.request中的Request對象來幫助我們實現一些其它參數的模擬,比如請求頭。

Request對象如下所示:

# Request對象實例化
req   = urllib.request.Request(url, data=None, headers={},origin_req_host=None,unverifiable=False, method=None)
  • url:請求的URL,必須傳遞的參數,其他都是可選參數

  • data:上傳的數據,必須傳bytes字節流類型的數據,如果它是字典,可以先用urllib.parse模塊里的urlencode()編碼

  • headers:它是一個字典,傳遞的是請求頭數據,可以通過它構造請求頭,也可以通過調用請求實例的方法add_header()來添加 
    例如:修改User_Agent頭的值來偽裝瀏覽器,比如火狐瀏覽器可以這樣設置: 
    {'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)'}

  • origin_req_host:指請求方的host名稱或者IP地址

  • unverifiable:表示這個請求是否是無法驗證的,默認為False,如我們請求一張圖片如果沒有權限獲取圖片那它的值就是true

  • method:是一個字符串,用來指示請求使用的方法,如:GET,POST,PUT等

from urllib import request

url='http://httpbin.org/post'
headers={
     'User-Agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)',
     'Host':'httpbin.org'
 }  #定義頭信息

dict={'name':'germey'}

data = bytes(parse.urlencode(dict),encoding='utf-8')
req = request.Request(url=url,data=data,headers=headers,method='POST')
#req.add_header('User-Agent','Mozilla/5.0 (compatible; MSIE 8.4; Windows NT') #也可以request的方法來添加
resp = request.urlopen(req) 
print(resp.read().decode())

3、urllib.request的高級類

BaseHandler類:

在urllib.request模塊里的BaseHandler類,他是所有其他Handler的父類,他是一個處理器,比如用它來處理登錄驗證,處理cookies,代理設置,重定向等

BaseHandler的子類包括:

  • HTTPDefaultErrorHandler:用來處理http響應錯誤,錯誤會拋出HTTPError類的異常

  • HTTPRedirectHandler:用于處理重定向

  • HTTPCookieProcessor:用于處理cookies

  • ProxyHandler:用于設置代理,默認代理為空

  • HTTPPasswordMgr:永遠管理密碼,它維護用戶名和密碼表

  • HTTPBasicAuthHandler:用戶管理認證,如果一個鏈接打開時需要認證,可以使用它來實現驗證功能

build_opener(*handlers)方法用于構建一個自定義的OpenerDirector對象。

build.opener(handler1,handler2…)

之前的urlopen()方法就是urllib提供的一個Opener,通過Handler處理器來構建Opener實現Cookies處理,代理設置,密碼設置等

Opener的方法包括:

  • add_handler(handler):添加處理程序到鏈接中

  • open(url,data=None[,timeout]):打開給定的URL與urlopen()方法相同

  • error(proto,*args):處理給定協議的錯誤

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

# 將這個opener設置為全局的opener,之后所有的,不管是opener.open()還是urlopen() 發送請求,都將使用自定義
request.install_opener(opener)
resp = request.urlopen(url)
1、密碼驗證:HTTPBasicAuthHandler和ProxyBasicAuthHandler

HTTPPasswordMgrWithDefaultRealm()類創建一個密碼管理對象,用來保存HTTP請求相關的用戶名和密碼,主要應用兩個場景:

  • 驗證代理授權的用戶名和密碼(ProxyBasicAuthHandler())

  • 驗證web客戶端的用戶名和密碼(HTTPBasicAuthHandler())

在下面的方法中我們還用到了一個新的東西,即request.build_opener()方法,其實urlopen()就是通過構造好了的opener對象發送請求,在這里我們使用request.build_opener()方法重構了一個opener()對象,我們可以通過這個對象實現urlopen()實現的任何東西。

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username='username'
passowrd='password'
url='http://localhost'
p=HTTPPasswordMgrWithDefaultRealm() #構造密碼管理實例
p.add_password(None,url,username,passowrd) #添加用戶名和密碼到實例中
auth_handler=HTTPBasicAuthHandler(p) #傳遞密碼管理實例構建一個驗證實例
opener=build_opener(auth_handler)  #構建一個Opener
try:
    result=opener.open(url)  #打開鏈接,完成驗證,返回的結果是驗證后的頁面內容
    html=result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)
2、設置Proxy代理:ProxyHandler

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

urllib提供了urllib.request.ProxyHandler()方法可動態的設置代理IP池。將代理IP以字典形式傳入該方法,然后通過urllib.reques.build_opener()創建opener對象,用該對象的open()方法向服務器發送請求。

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)  # 創建代理處理器
opener = request.build_opener(proxies)  # 創建opener對象
  
resp = opener.open(url)
print(resp.read().decode())
3、添加Cookie:HTTPCookieProcessor

有時候當我們訪問一些網站的時候需要進行翻頁或者跳轉等其它操作,為了防止無法訪問我們想要的數據,需要讓網站識別我們是同一個用戶。這個時候我們就需要帶上cookie進行訪問。

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

CookieJar類關系:CookieJar &mdash;-派生&mdash;->FileCookieJar &mdash;-派生&mdash;&ndash;>MozillaCookieJar和LWPCookieJar

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

cookies保存到文件:

1、以Mozilla型瀏覽器的cookies格式:

cookie=http.cookiejar.MozillaCookieJar(filename=fielname)

import http.cookiejar,urllib.request
fielname='cookies.txt'
cookie=http.cookiejar.MozillaCookieJar(filename=fielname) #創建保存cookie的實例,保存瀏覽器類型的Mozilla的cookie格式
handler=urllib.request.HTTPCookieProcessor(cookie) #構建一個handler
opener=urllib.request.build_opener(handler) #構建Opener
response=opener.open('http://www.baidu.com') #請求
cookie.save(ignore_discard=True,ignore_expires=True)

從文件中讀取cookies:

2、也可以保存為libwww-perl(LWP)格式的Cookies文件

cookie=http.cookiejar.LWPCookieJar(filename=fielname)

import http.cookiejar,urllib.request
#fielname='cookiesLWP.txt'
#cookie=http.cookiejar.LWPCookieJar(filename=fielname) #LWP格式的cookies
cookie=http.cookiejar.LWPCookieJar()
cookie.load('cookiesLWP.txt',ignore_discard=True,ignore_expires=True)

handler=urllib.request.HTTPCookieProcessor(cookie) #構建一個handler
opener=urllib.request.build_opener(handler) #構建Opener
response=opener.open('http://www.baidu.com') #請求
print(response.read().decode('utf-8'))

當然,如果把上面這個生成的opener對象使用install_opener方法來設置為全局的,opener對象之后的每次訪問都會帶上這個cookie。

4、證書驗證

通過添加忽略ssl證書驗證關閉證書驗證,由于urllib并沒有很好的處理ssl的對象,所以在這里我們需要用到一個別的庫,即ssl庫,如下:

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

當你 urllib.urlopen一個 https 的時候會驗證一次 SSL 證書,當目標使用的是自簽名的證書時就會出現一個URLError,如果是這樣可以在開頭加上

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

四、urllib.error模塊

urllib的error模塊定義了由request模塊產生的異常,如果出現問題,request模塊便會拋出error模塊中定義的異常。

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

1、URLError基類

URLError類來自urllib庫的error模塊,它繼承自OSError類,是error異常模塊的基類,由request模塊產生的異常都可以通過捕獲這個類來處理

它只有一個屬性reason,即返回錯誤的原因

from urllib import request,error

try:
    response=request.urlopen('https://hehe,com/index')
except error.URLError as e:
    print(e.reason)  #如果網頁不存在不會拋出異常,而是返回捕獲的異常錯誤的原因(Not Found)

reason如超時則返回一個對象

import socket
import urllib.request
import urllib.error
try:
    response=urllib.request.urlopen('https://www.baidu.com',timeout=0.001)
except urllib.error.URLError as e:
    print(e.reason)
    if isinstance(e.reason,socket.timeout):
        print('time out')

2、HTTPError

它是URLError的子類,專門用來處理HTTP請求錯誤,比如認證請求失敗,它有3個屬性:

  • code:返回HTTP的狀態碼,如404頁面不存在,500服務器錯誤等

  • reason:同父類,返回錯誤的原因

  • headers:返回請求頭

舉例:

from urllib import request,error

try:
    response=request.urlopen('http://cuiqingcai.com/index.htm')
except error.HTTPError as e:  #先捕獲子類異常
    print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:  #再捕獲父類異常

    print(e.reason)
else:
    print('request successfully')

五、urllib.robotparser模塊

利用urllib的robotparser模塊,我們可以實現網站Robots協議的分析

1、Robots協議

也稱為爬蟲協議、機器人協議,它的全名叫做網絡爬蟲排除標準(Robots Exclusion Protocol),用來告訴爬蟲和搜索引擎哪些網頁可以抓取,哪些不可以抓取,它通常是一個robots.txt的文本文件,一般放在網站的根目錄下。

當搜索爬蟲訪問一個站點時,它首先會檢查這個站點根目錄下是否存在robots.txt文件,如果存在,搜索爬蟲會根據其中定義的爬去范圍來爬取,如果沒有找到,搜索爬蟲會訪問所有可直接訪問的頁面

我們來看下robots.txt的樣例:

User-agent: *
Disallow: /
Allow: /public/

它實現了對所有搜索爬蟲只允許爬取public目錄的功能,將上述內容保存為robots.txt文件放在網站根目錄下,和網站的入口文件(index.html)放在一起

1、User-agent描述了搜索爬蟲的名稱,將其設置為*則代表協議對任何爬蟲有效,如設置為Baiduspider則代表規則對百度爬蟲有效,如果有多條則對多個爬蟲受到限制,但至少需要指定一條

一些常見的搜索爬蟲名稱:

  • BaiduSpider 百度爬蟲 www.baidu.com

  • Googlebot Google爬蟲 www.google.com

  • 360Spider 360爬蟲 www.so.com

  • YodaoBot 有道爬蟲 www.youdao.com

  • ia_archiver Alexa爬蟲 www.alexa.cn

  • Scooter altavista爬蟲 www.altavista.com

2、Disallow指定了不允許抓取的目錄,如上例中設置的/則代表不允許抓取所有的頁面

3、Allow一般和Disallow一起使用,用來排除單獨的某些限制,如上例中設置為/public/則表示所有頁面不允許抓取,但可以抓取public目錄

設置示例:

#禁止所有爬蟲
User-agent: *
Disallow: /

#允許所有爬蟲訪問任何目錄,另外把文件留空也可以
User-agent: *
Disallow:

#禁止所有爬蟲訪問某那些目錄
User-agent: *
Disallow: /home/
Disallow: /tmp/

#只允許某一個爬蟲訪問
User-agent: BaiduSpider
Disallow:
User-agent: *
Disallow: /

2、rebotparser模塊

用來解析robots.txt,該模塊提供了一個類RobotFileParser,它可以根據某網站的robots.txt文件來判斷一個抓取爬蟲時都有權限來抓取這個網頁

urllib.robotparser.RobotFileParser(url='')

robotparser類常用的方法:

  • set_url():用來設置robots.txt文件的連接,如果在創建RobotFileParser對象是傳入了連接,就不需要在使用這個方法設置了

  • read():讀取reobts.txt文件并進行分析,它不會返回任何內容,但執行那個了讀取和分析操作

  • parse():用來解析robots.txt文件,傳入的參數是robots.txt某些行的內容,并安裝語法規則來分析內容

  • can_fetch():該方法傳入兩個參數,第一個是User-agent,第二個是要抓取的URL,返回的內容是該搜索引擎是否可以抓取這個url,結果為True或False

  • mtime():返回上次抓取和分析robots.txt的時間

  • modified():將當前時間設置為上次抓取和分析robots.txt的時間

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()  #創建對象
rp.set_url('https://www.cnblogs.com/robots.txt') #設置robots.txt連接,也可以在創建對象時指定
rp.read()  #讀取和解析文件
print(rp.can_fetch('*','https://i.cnblogs.com/EditPosts.aspx?postid=9170312&update=1')) #判斷鏈接是否可以被抓取

六、urllib3庫

urllib3增加了連接池等功能,兩者互相都有補充的部分。許多Python的原生系統已經開始使用urllib3。

urllib3提供了很多python標準庫urllib里所沒有的重要特性:

  • 線程安全

  • 連接池

  • 客戶端SSL/TLS驗證

  • 文件分部編碼上傳

  • 協助處理重復請求和HTTP重定位

  • 支持gzip和deflate壓縮編碼

  • 支持HTTP和SOCKS代理

  • 100%測試覆蓋率

urllib3是一個第三方庫,pip安裝:

pip install urllib3

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

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

生成一個PoolManager所需要的參數:

  • num_pools 代表了緩存的池的個數,如果訪問的個數大于num_pools,將按順序丟棄最初始的緩存,將緩存的個數維持在池的大小。

  • headers 代表了請求頭的信息,如果在初始化PoolManager的時候指定了headers,那么之后每次使用PoolManager來進行訪問的時候,都將使用該headers來進行訪問。

  • ** connection_pool_kw 是基于connection_pool 來生成的其它設置

當訪問網頁完成之后,將會返回一個HTTPResponse對象。

使用request()或者urlopen(),獲取GET請求的響應內容:

import urllib3

data = json.dumps({'abc': '123'})
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())

使用request()或者urlopen(),進行 POST 請求:

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())

注意事項:urllib3 并沒有辦法單獨設置cookie,所以如果你想使用cookie的話,可以將cookie放入到headers中

1、request()和urlopen()方法的區別:

urlopen()比request()有三個參數是不一樣的,你會發現request()具有fields,headers兩個參數。所以更多的也就使用 request() 方法了。

推薦使用request()來進行訪問的,因為使用request()來進行訪問有兩點好處,

  • 可以直接進行post請求,不需要將 data參數轉換成JSON格式

  • 直接進行GET請求,不需要自己拼接url參數

語法:

  • request(self, method, url, fields=None, headers=None, **urlopen_kw)

  • urlopen(self, method, url, redirect=True, **kw):

2、設置代理:ProxyManager

如果你需要使用代理來訪問某個網站的話, 那么你可以使用 ProxyManager 對象來進行設置

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

ProxyManager和PoolManager的方法基本完全相同。

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())

“Python的HTTP客戶端模塊urllib與urllib3怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 毕节市| 游戏| 祁连县| 东辽县| 泰安市| 蒙山县| 织金县| 阳江市| 浙江省| 泗洪县| 景泰县| 南开区| 金沙县| 资溪县| 伽师县| 延津县| 庄浪县| 德州市| 江川县| 永清县| 青阳县| 长阳| 晋江市| 涟源市| 崇信县| 蛟河市| 南靖县| 来宾市| 全州县| 香格里拉县| 霍州市| 绍兴市| 阳曲县| 府谷县| 师宗县| 仁寿县| 定陶县| 松江区| 河东区| 招远市|