日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python中的requests模块的使用大全

發(fā)布時(shí)間:2024/4/11 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的requests模块的使用大全 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.requests模塊:

  • 企業(yè)中用的最多的就是requests
  • requests的底層實(shí)現(xiàn)就是urllib
  • requests在python2 和python3中通用,方法完全一樣
  • requests簡(jiǎn)單易用
  • requests能夠自動(dòng)幫助我們解壓(gzip壓縮的等)響應(yīng)內(nèi)容

2.response的常用屬性:

  • response.text 響應(yīng)體 str類型
  • respones.content 響應(yīng)體 bytes類型
  • response.status_code 響應(yīng)狀態(tài)碼
  • response.request.headers 響應(yīng)對(duì)應(yīng)的請(qǐng)求頭
  • response.headers 響應(yīng)頭
  • response.request.cookies 響應(yīng)對(duì)應(yīng)請(qǐng)求的cookie
  • response.cookies 響應(yīng)的cookie(經(jīng)過(guò)了set-cookie動(dòng)作)

3.response.text 和response.content的區(qū)別

3.1 response.text

類型:str
解碼類型: requests模塊自動(dòng)根據(jù)HTTP 頭部對(duì)響應(yīng)的編碼作出有根據(jù)的推測(cè),推測(cè)的文本編碼
如何修改編碼方式:response.encoding=”gbk”

3.2 response.content

類型:bytes
解碼類型: 沒(méi)有指定
如何修改編碼方式:response.content.deocde(“utf8”)

4.獲取網(wǎng)頁(yè)源碼的通用方式:

  • response.content.decode()
  • response.content.decode(“GBK”)
  • response.text
  • 以上三種方法從前往后嘗試,能夠100%的解決所有網(wǎng)頁(yè)解碼的問(wèn)題
    所以:更推薦使用response.content.deocde()的方式獲取響應(yīng)的html頁(yè)面

    舉例來(lái)說(shuō):

    import requestsurl = 'https://www.baidu.com' response = requests.get(url)print(type(response.text)) print(type(response.content)) print(response.status_code) print(response.headers)

    輸出結(jié)果:

    <class 'str'> <class 'bytes'> 200 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate,......后面的省略

    舉例

    把圖片保存到本地

    分析

    • 圖片的url: https://www.baidu.com/img/bd_logo1.png
    • 利用requests模塊發(fā)送請(qǐng)求獲取響應(yīng)
    • 以二進(jìn)制寫入的方式打開(kāi)文件,并將response響應(yīng)的二進(jìn)制內(nèi)容寫入
    import requests # 圖片的url url = 'https://www.baidu.com/img/bd_logo1.png' # 響應(yīng)本身就是一個(gè)圖片,并且是二進(jìn)制類型 response = requests.get(url) # print(response.content)# 以二進(jìn)制+寫入的方式打開(kāi)文件 with open('baidu.png', 'wb') as f: # 寫入response.content bytes二進(jìn)制類型f.write(response.content)

    5.攜帶請(qǐng)求頭header

    格式如下:字典

    headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36”}

    舉例

    import requestsurl = 'https://www.baidu.com' headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 在請(qǐng)求頭中帶上User-Agent,模擬瀏覽器發(fā)送請(qǐng)求 response = requests.get(url, headers=headers) # print(response.content) # 打印請(qǐng)求頭信息 print(response.request.headers)

    6.發(fā)送帶參數(shù)的請(qǐng)求

    請(qǐng)求參數(shù)的形式:字典

    kw = {'wd':'長(zhǎng)城'}

    用法

    requests.get(url,params=kw)

    舉例:兩種發(fā)送帶參數(shù)的請(qǐng)求

    6.1 對(duì)https://www.baidu.com/s?wd=python發(fā)起請(qǐng)求可以使用requests.get(url, params=kw)的方式

    # 方式一:利用params參數(shù)發(fā)送帶參數(shù)的請(qǐng)求 import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}# 這是目標(biāo)url # url = 'https://www.baidu.com/s?wd=python' # 最后有沒(méi)有問(wèn)號(hào)結(jié)果都一樣 url = 'https://www.baidu.com/s?' # 請(qǐng)求參數(shù)是一個(gè)字典 即wd=python kw = {'wd': 'python'} # 帶上請(qǐng)求參數(shù)發(fā)起請(qǐng)求,獲取響應(yīng) response = requests.get(url, headers=headers, params=kw) # 當(dāng)有多個(gè)請(qǐng)求參數(shù)時(shí),requests接收的params參數(shù)為多個(gè)鍵值對(duì)的字典,比如 '?wd=python&a=c'-->{'wd': 'python', 'a': 'c'} print(response.content)

    6.2 也可以直接對(duì)https://www.baidu.com/s?wd=python完整的url直接發(fā)送請(qǐng)求,不使用params參數(shù)

    # 方式二:直接發(fā)送帶參數(shù)的url的請(qǐng)求 import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} url = 'https://www.baidu.com/s?wd=python'# kw = {'wd': 'python'}# url中包含了請(qǐng)求參數(shù),所以此時(shí)無(wú)需params response = requests.get(url, headers=headers)

    7.使用代理

    7.1 代理的作用:

  • 讓服務(wù)器以為不是同一個(gè)客戶端在請(qǐng)求
  • 防止我們的真實(shí)地址被泄露,防止被追究
  • 7.2 代理過(guò)程:


    7.3 正向代理和反向代理的區(qū)別:

    • 正向代理:對(duì)于瀏覽器知道服務(wù)器的真實(shí)地址,例如VPN
    • 反向代理:瀏覽器不知道服務(wù)器的真實(shí)地址,例如nginx

    7.4 代理的使用:

    proxies = { "http": "http://12.34.56.79:9527", "https": "https://12.34.56.79:9527", } requests.get(url, proxies = proxies)

    7.5 代理IP的分類
    根據(jù)代理ip的匿名程度,代理IP可以分為下面三類:

  • 透明代理(Transparent Proxy):透明代理雖然可以直接“隱藏”你的IP地址,但是還是可以查到你是誰(shuí)。

  • 匿名代理(Anonymous Proxy):使用匿名代理,別人只能知道你用了代理,無(wú)法知道你是誰(shuí)。

  • 高匿代理(Elite proxy或High Anonymity Proxy):高匿代理讓別人根本無(wú)法發(fā)現(xiàn)你是在用代理,所以是最好的選擇。

  • 在使用的使用,毫無(wú)疑問(wèn)使用高匿代理效果最好

    從請(qǐng)求使用的協(xié)議可以分為:

    • http代理
    • https代理
    • socket代理等

    不同分類的代理,在使用的時(shí)候需要根據(jù)抓取網(wǎng)站的協(xié)議來(lái)選擇

    7.6 代理IP使用的注意點(diǎn)

    • 代理ip池的更新
      購(gòu)買的代理ip很多時(shí)候大部分(超過(guò)60%)可能都沒(méi)辦法使用,這個(gè)時(shí)候就需要通過(guò)程序去檢測(cè)哪些可用,使用代理ip是非常必要的一種反反爬的方式

    • 反反爬
      但是即使使用了代理ip,對(duì)方服務(wù)器任然會(huì)有很多的方式來(lái)檢測(cè)我們是否是一個(gè)爬蟲(chóng),比如:
      1.一段時(shí)間內(nèi),檢測(cè)IP訪問(wèn)的頻率,訪問(wèn)太多頻繁會(huì)屏蔽
      2.檢查Cookie,User-Agent,Referer等header參數(shù),若沒(méi)有則屏蔽
      3.服務(wù)方購(gòu)買所有代理提供商,加入到反爬蟲(chóng)數(shù)據(jù)庫(kù)里,若檢測(cè)是代理則屏蔽

    所以更好的方式在使用代理ip的時(shí)候使用隨機(jī)的方式進(jìn)行選擇使用,不要每次都用一個(gè)代理ip不能用的刪除掉。

    8.處理cookie相關(guān)的請(qǐng)求

    爬蟲(chóng)中使用cookie,為了能夠通過(guò)爬蟲(chóng)獲取到登錄后的頁(yè)面,或者是解決通過(guò)cookie的反扒,需要使用request來(lái)處理cookie相關(guān)的請(qǐng)求

    8.1 爬蟲(chóng)中使用cookie的利弊

    • 帶上cookie的好處,能夠訪問(wèn)登錄后的頁(yè)面,能夠?qū)崿F(xiàn)部分反反爬
    • 帶上cookie的壞處,一套cookie往往對(duì)應(yīng)的是一個(gè)用戶的信息,請(qǐng)求太頻繁有更大的可能性被對(duì)方識(shí)別為爬蟲(chóng)

    8.2 使用requests處理cookie有三種方法:

    • cookie字符串放在headers中
    • 把cookie字典放傳給請(qǐng)求方法的cookies參數(shù)接收
    • 使用requests提供的session模塊

    下面就這三種方法簡(jiǎn)單的講解下:

    8.2.1 cookie添加在heades中
    headers中cookie的位置


    headers中的cookie:

    • 使用分號(hào)(;)隔開(kāi)
    • 分號(hào)兩邊的類似a=b形式的表示一條cookie
    • a=b中,a表示鍵(name),b表示值(value)
    • 在headers中僅僅使用了cookie的name和value

    8.2.2 cookie的具體組成的字段

    由于headers中對(duì)cookie僅僅使用它的name和value,所以在代碼中我們僅僅需要cookie的name和value即可

    8.2.3 在headers中使用cookie
    復(fù)制瀏覽器中的cookie到代碼中使用

    headers = { "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", "Cookie":" Pycharm-26c2d973=dbb9b300-2483-478f-9f5a-16ca4580177e; Hm_lvt_98b9d8c2fd6608d564bf2ac2ae642948=1512607763; Pycharm-26c2d974=f645329f-338e-486c-82c2-29e2a0205c74; _xsrf=2|d1a3d8ea|c5b07851cbce048bd5453846445de19d|1522379036"}requests.get(url,headers=headers)

    注意:

    cookie有過(guò)期時(shí)間 ,所以直接復(fù)制瀏覽器中的cookie可能意味著下一程序繼續(xù)運(yùn)行的時(shí)候需要替換代碼中的cookie,對(duì)應(yīng)的我們也可以通過(guò)一個(gè)程序?qū)iT來(lái)獲取cookie供其他程序使用;當(dāng)然也有很多網(wǎng)站的cookie過(guò)期時(shí)間很長(zhǎng),這種情況下,直接復(fù)制cookie來(lái)使用更加簡(jiǎn)單

    8.3 使用cookies參數(shù)接收字典形式的cookie

    cookies的形式:字典

    cookies = {"cookie的name":"cookie的value"}

    使用方法:

    requests.get(url,headers=headers,cookies=cookie_dict}

    8.4 使用requests.session處理cookie

    requests 提供了一個(gè)叫做session類,來(lái)實(shí)現(xiàn)客戶端和服務(wù)端的會(huì)話保持

    會(huì)話保持有兩個(gè)作用:

    • 保存cookie,下一次請(qǐng)求會(huì)帶上前一次的cookie
    • 實(shí)現(xiàn)和服務(wù)端的長(zhǎng)連接,加快請(qǐng)求速度

    使用方法

    session = requests.session() response = session.get(url,headers)

    session實(shí)例在請(qǐng)求了一個(gè)網(wǎng)站后,對(duì)方服務(wù)器設(shè)置在本地的cookie會(huì)保存在session中,下一次再使用session請(qǐng)求對(duì)方服務(wù)器的時(shí)候,會(huì)帶上前一次的cookie

    9.requests中cookirJar的處理方法

    使用request獲取的resposne對(duì)象,具有cookies屬性,能夠獲取對(duì)方服務(wù)器設(shè)置在本地的cookie,但是如何使用這些cookie呢?

    9.1 方法介紹

    response.cookies是CookieJar類型
    使用requests.utils.dict_from_cookiejar,能夠?qū)崿F(xiàn)把cookiejar對(duì)象轉(zhuǎn)化為字典

    9.2 方法展示

    import requestsurl = "http://www.baidu.com" #發(fā)送請(qǐng)求,獲取resposne response = requests.get(url) print(type(response.cookies))#使用方法從cookiejar中提取數(shù)據(jù) cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies)

    輸出為:

    <class 'requests.cookies.RequestsCookieJar'> {'BDORZ': '27315'}

    注意:

    在前面的requests的session類中,我們不需要處理cookie的任何細(xì)節(jié),如果有需要,我們可以使用上述方法來(lái)解決

    10.timeout超時(shí)參數(shù)的使用

    在平時(shí)網(wǎng)上沖浪的過(guò)程中,我們經(jīng)常會(huì)遇到網(wǎng)絡(luò)波動(dòng),這個(gè)時(shí)候,一個(gè)請(qǐng)求等了很久可能任然沒(méi)有結(jié)果。在爬蟲(chóng)中,一個(gè)請(qǐng)求很久沒(méi)有結(jié)果,就會(huì)讓整個(gè)項(xiàng)目的效率變得非常低,這個(gè)時(shí)候我們就需要對(duì)請(qǐng)求進(jìn)行強(qiáng)制要求,讓他必須在特定的時(shí)間內(nèi)返回結(jié)果,否則就報(bào)錯(cuò)

    9.1 超時(shí)參數(shù)使用方法如下:

    response = requests.get(url,timeout=3)

    通過(guò)添加timeout參數(shù),能夠保證在3秒鐘內(nèi)返回響應(yīng),否則會(huì)報(bào)錯(cuò)

    注意:

    這個(gè)方法還能夠拿來(lái)檢測(cè)代理ip的質(zhì)量,如果一個(gè)代理ip在很長(zhǎng)時(shí)間沒(méi)有響應(yīng),那么添加超時(shí)之后也會(huì)報(bào)錯(cuò),對(duì)應(yīng)的這個(gè)ip就可以從代理ip池中刪除

    10.retrying模塊的使用

    使用超時(shí)參數(shù)能夠加快我們整體的請(qǐng)求速度,但是在正常的網(wǎng)頁(yè)瀏覽過(guò)成功,如果發(fā)生速度很慢的情況,我們會(huì)做的選擇是刷新頁(yè)面,那么在代碼中,我們是否也可以刷新請(qǐng)求呢?對(duì)應(yīng)的,retrying模塊就可以幫助我們解決

    10.1 retrying模塊的使用

    retrying模塊的地址:https://pypi.org/project/retrying/

    retrying 模塊的使用

    • 使用retrying模塊提供的retry模塊
    • 通過(guò)裝飾器的方式使用,讓被裝飾的函數(shù)反復(fù)執(zhí)行
    • retry中可以傳入?yún)?shù)stop_max_attempt_number,讓函數(shù)報(bào)錯(cuò)后繼續(xù)重新執(zhí)行,達(dá)到最大執(zhí)行次數(shù)的上限,如果每次都報(bào)錯(cuò),整個(gè)函數(shù)報(bào)錯(cuò),如果中間有一個(gè)成功,程序繼續(xù)往后執(zhí)行

    10.2 retrying和requests的簡(jiǎn)單封裝

    實(shí)現(xiàn)一個(gè)發(fā)送請(qǐng)求的函數(shù),每次爬蟲(chóng)中直接調(diào)用該函數(shù)即可實(shí)現(xiàn)發(fā)送請(qǐng)求,在其中

    • 使用timeout實(shí)現(xiàn)超時(shí)報(bào)錯(cuò)
    • 使用retrying模塊實(shí)現(xiàn)重試

    代碼參考:

    # parse.py import requests from retrying import retryheaders = {}#最大重試3次,3次全部報(bào)錯(cuò),才會(huì)報(bào)錯(cuò) @retry(stop_max_attempt_number=3) def _parse_url(url)#超時(shí)的時(shí)候回報(bào)錯(cuò)并重試response = requests.get(url, headers=headers, timeout=3) #狀態(tài)碼不是200,也會(huì)報(bào)錯(cuò)并重試assert response.status_code == 200return responsedef parse_url(url)try: #進(jìn)行異常捕獲response = _parse_url(url)except Exception as e:print(e)#報(bào)錯(cuò)返回Noneresponse = Nonereturn response

    retrying模塊能夠?qū)崿F(xiàn)捕獲函數(shù)的異常,反復(fù)執(zhí)行函數(shù)的效果,和timeout配合使用,能夠解決網(wǎng)絡(luò)波動(dòng)帶來(lái)的請(qǐng)求不成功的問(wèn)題

    總結(jié)

    以上是生活随笔為你收集整理的python中的requests模块的使用大全的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。