requests與urllib庫的區別

2021-10-05 22:16:44 字數 3313 閱讀 3541

個人學習收藏,侵刪

我們在使用python爬蟲時,需要模擬發起網路請求,主要用到的庫有requests庫和python內建的urllib庫,一般建議使用requests,它是對urllib的再次封裝,它們使用的主要區別:

requests可以直接構建常用的get和post請求並發起,urllib一般要先構建get或者post請求,然後再發起請求。

import requests

response_get = requests.get(url, params=none, **kwargs)

response_post = requests.post(url, data=none, json=none, **kwargs)

上面請求後得到的是requests.models.response物件,需要處理後才能得到我們需要的資訊

response_get.text 得到的是str型別

response_get.content 得到的是bytes型別,需要進行解碼response_get.content.decode(),相當於response_get.text

response_get.json() 得到的是json資料型別

一般我們最簡單的get請求是requests.get(url),但是我們可以對請求進行定製,比如requests.get(url,headers=headers)

headers裡面可以定製user-agent和cookie

簡單的post請求是requests.post(url),我們也可以requests.post(url,data),其中data可以是列表,字典,json等型別

import urllib.request

req = urllib.request.request(self, url, data=none, headers={},origin_req_host=none,unverifiable=false,method=none)

response_request = urllib.request.urlopen(req)

response = urllib.request.urlopen(url, data=none, timeout=1, cafile=none, capath=none, cadefault=false, context=none)

urllib.request 模組提供了最基本的構造 http 請求的方法,利用它可以模擬瀏覽器的乙個請求發起過程。

# 同時它還帶有處理 authenticaton (授權驗證), redirections (重定向), cookies (瀏覽器cookies)以及其它內容。

# context 引數,它必須是 ssl.sslcontext 型別,用來指定 ssl 設定。cafile 和 capath 兩個引數是指定ca證書和它的路徑,這個在請求 https 鏈結時會有用。

# cadefault 引數現在已經棄用了,預設為 false 。

# 它是乙個 httpresposne 型別的物件,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函式

# 和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等屬性。 得到這個物件之後,賦值為 response ,

# 然後就可以用 response 呼叫這些方法和屬性,得到返回結果的一系列資訊。

# 例如 response.read() 就可以得到返回的網頁內容, response.status 就可以得到返回結果的狀態碼,如200代表請求成功,404代表網頁未找到等。

簡單的get請求是urllib.request.urlopen(url),其中url可以是乙個鏈結,也可以是乙個請求,

所以我們定製請求頭需要通過urllib.request.request(url,headers=headers)進行定製,然後當成url傳入到request.urlopen()

下面是兩個庫的簡單使用方法:

import requests

import urllib.request  

url = ''

api =''

headers =

form_data =   

req1 = requests.get(url,headers=headers)

req_api = requests.get(api,headers=headers)

print(type(req1),type(req1.text),req1.text)              # requests.get().text是str型別

print("字串",type(req1.content),req1.content)           # requests.get().content是bytes型別

print("與直接req1.text一致",req1.content.decode())

print("介面返回json格式",req_api.json())                  # 介面返回格式需要用requests.get().json()  

# post傳送的data必須為bytes或bytes型別的可迭代物件,不能是字串

form_data = urllib.parse.urlencode(form_data).encode()

# urllib.request.request()只是乙個請求:

req2 = urllib.request.request(url,data=form_data,headers=headers)

print(type(req2))  

req3 = urllib.request.urlopen(url)      # 不可以偽裝你的user agent,可以通過urllib.request.request()偽裝

print(req3.getheaders())                # 響應的資訊集合

print(req3.read().decode("utf-8"))      # urllib.request.urlopen().read().decode("utf-8")相當於requests.get().text

req4 = urllib.request.urlopen(req2)     # 引數可以直接是乙個請求

print("直接乙個請求:",req4.read().decode("utf-8"))

urllib與requests的對比

在http相關處理中使用python是不必要的麻煩,這包括urllib2模組以巨大的複雜性代價獲取綜合性的功能。相比於urllib2,kenneth reitz的requests模組更能簡約的支援完整的簡單用例。簡單的例子 想象下我們試圖使用get方法從獲取資源並且檢視返回 content type...

requests和urllib的區別

基本的區別是獲得的response 1.傳送get請求,例如 r requests.get 2.傳送post請求,例如 r requests.post 3.得到的響應內容 就是指get傳送以後的請求 響應的內容包含響應行 響應報頭 響應正文。響應正文 r.content 通用版 可以自動轉出成取文字...

requests庫和urllib包對比

python中有多種庫可以用來處理http請求,比如python的原生庫 urllib包 requests類庫。urllib和urllib2是相互獨立的模組,python3.0以上把urllib和urllib2合併成乙個庫了,requests庫使用了urllib3。requests庫的口號是 htt...