個人學習收藏,侵刪
我們在使用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...