【Python爬虫】requests与urllib库的区别
我們?cè)谑褂胮ython爬蟲時(shí),需要模擬發(fā)起網(wǎng)絡(luò)請(qǐng)求,主要用到的庫(kù)有requests庫(kù)和python內(nèi)置的urllib庫(kù),一般建議使用requests,它是對(duì)urllib的再次封裝,它們使用的主要區(qū)別:
requests可以直接構(gòu)建常用的get和post請(qǐng)求并發(fā)起,urllib一般要先構(gòu)建get或者post請(qǐng)求,然后再發(fā)起請(qǐng)求。
上面請(qǐng)求后得到的是requests.models.Response對(duì)象,需要處理后才能得到我們需要的信息
Response_get.text 得到的是str類型
Response_get.content 得到的是bytes類型,需要進(jìn)行解碼Response_get.content.decode(),相當(dāng)于Response_get.text
Response_get.json() 得到的是JSON數(shù)據(jù)類型
一般我們最簡(jiǎn)單的get請(qǐng)求是requests.get(url),但是我們可以對(duì)請(qǐng)求進(jìn)行定制,比如requests.get(url,headers=headers)
headers里面可以定制User-Agent和cookie
簡(jiǎn)單的post請(qǐng)求是requests.post(url),我們也可以requests.post(url,data),其中data可以是列表,字典,JSON等類型
urllib.request 模塊提供了最基本的構(gòu)造 HTTP 請(qǐng)求的方法,利用它可以模擬瀏覽器的一個(gè)請(qǐng)求發(fā)起過程。
# 同時(shí)它還帶有處理 authenticaton (授權(quán)驗(yàn)證), redirections (重定向), cookies (瀏覽器Cookies)以及其它內(nèi)容。
# context 參數(shù),它必須是 ssl.SSLContext 類型,用來指定 SSL 設(shè)置。cafile 和 capath 兩個(gè)參數(shù)是指定CA證書和它的路徑,這個(gè)在請(qǐng)求 HTTPS 鏈接時(shí)會(huì)有用。
# cadefault 參數(shù)現(xiàn)在已經(jīng)棄用了,默認(rèn)為 False 。
# 它是一個(gè) HTTPResposne 類型的對(duì)象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函數(shù)
# 和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等屬性。 得到這個(gè)對(duì)象之后,賦值為 response ,
# 然后就可以用 response 調(diào)用這些方法和屬性,得到返回結(jié)果的一系列信息。
# 例如 response.read() 就可以得到返回的網(wǎng)頁(yè)內(nèi)容, response.status 就可以得到返回結(jié)果的狀態(tài)碼,如200代表請(qǐng)求成功,404代表網(wǎng)頁(yè)未找到等。
簡(jiǎn)單的get請(qǐng)求是urllib.request.urlopen(url),其中url可以是一個(gè)鏈接,也可以是一個(gè)請(qǐng)求,
所以我們定制請(qǐng)求頭需要通過urllib.request.Request(url,headers=headers)進(jìn)行定制,然后當(dāng)成url傳入到request.urlopen()
下面是兩個(gè)庫(kù)的簡(jiǎn)單使用方法:
import requests import urllib.requesturl = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' api ='http://open.iciba.com/dsapi/' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} form_data = {"i": "word","from": "AUTO","to": "AUTO","smartresult": "dict","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTIME","typoResult": "false" }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發(fā)送的data必須為bytes或bytes類型的可迭代對(duì)象,不能是字符串 form_data = urllib.parse.urlencode(form_data).encode() # urllib.request.Request()只是一個(gè)請(qǐng)求: req2 = urllib.request.Request(url,data=form_data,headers=headers) print(type(req2))req3 = urllib.request.urlopen(url) # 不可以偽裝你的User Agent,可以通過urllib.request.Request()偽裝 print(type(req3),req3.status) # http.client.HTTPResponse print(req3.getheaders()) # 響應(yīng)的信息集合 print(req3.read().decode("utf-8")) # urllib.request.urlopen().read().decode("utf-8")相當(dāng)于requests.get().textreq4 = urllib.request.urlopen(req2) # 參數(shù)可以直接是一個(gè)請(qǐng)求 print("直接一個(gè)請(qǐng)求:",req4.read().decode("utf-8"))?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【Python爬虫】requests与urllib库的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中map()函数用法
- 下一篇: 零基础学习Java-素数和