1. 程式人生 > 實用技巧 >Python介面(一)---requests

Python介面(一)---requests

一、介紹

requests庫是用python編寫的,基於urllib,採用Apache2 License開源協議封裝的HTTP庫。

二、requests安裝

pip install requests

pip show requests來檢視requests的資訊

三、傳送請求

HTTP的請求方法GET(查),POST(增),PUT(改),DELETE(刪),HEAD,OPTIONS等

1.傳送一個get請求

1.1以請求我的部落格地址為例

import requests

r = requests.get("https://www.cnblogs.com/he-202007")
print(r.status_code)  #
獲取返回的狀態碼 print(r.text) #獲取返回的文字

1.2.傳送有引數的請求,以部落格園搜尋我的部落格名為例

import requests

param = {"w":"小測試00"} r = requests.get("https://zzk.cnblogs.com/s/blogpost",params = param) print(r.status_code) print(r.text)

2.傳送一個POST請求

POST請求根據傳送的實體內容的格式不同(content-type),使用不同的引數

2.1.以部落格園中關注他人部落格為例,content-type:application/x-www-form-urlencoded; charset=UTF-8,使用data

import requests url="https://home.cnblogs.com/follow_group/Follow" header={"cookie":"****"} payload={ "targetUserId":"bfd58f0a-1e58-4ac0-e56e-08d77884eb28", "groupIds[]":"c01ba27a-e9ca-4e68-c231-08d6b9965a3c", "enableSetRemark":True }
r=requests.post(url,data =payload,headers=header) print(r.status_code) print(r.text) #可通過type()檢視型別,返回一個string物件 print(r.json()) #雖然看起來和r.text一樣,但是json()返回一個字典物件,可以通過鍵名來獲取響應資訊

2.2.Content-Type:application/json使用json

在python中,dict和json字串雖然長得一樣,但是資料格式序列化還是有一定區別;

如果需要傳遞的主體資訊是json格式,就是用json,如果使用data可以匯入json,將dict轉換成json data = json.dumps(dict)

2.3.傳送一個檔案

部落格園上傳頭像為例,content-type:multipart/form-data,使用files

import requests

url = "https://upload.cnblogs.com/avatar/upload"
header = {"cookie": "***" }
image = {"file": ("pic.png",open(r"E:\pic.png","rb"),"image/png")} #檔名,open開啟的檔案的二進位制流,Content-Type對應的檔案型別;可以傳遞多個檔案
#image=[("file",("pic.png",open(r"E:\pic.png","rb"),"image/png"))] #列表元組型別;可以傳遞多個檔案
r = requests.post(url, headers = header, files = image) #files引數是可以接受很多種形式的資料,最基本的2種形式為字典型別和元祖列表型別
print(r.status_code)
print(r.text)

3.傳送一個PUT請求

以修改部落格園收藏的文章的摘要為例

import requests


url = "https://wz.cnblogs.com/api/wz"
header = {
    "cookie":"***"
}
payload = {
    "wzLinkId":6332142,
    "url":"https://www.cnblogs.com/edisonchou/p/my_experiences_on_digital_transformation_part2.html",
    "title":"我在傳統行業做數字化轉型(2)技術篇 - EdisonZhou - 部落格園",
    "tags":"測試",
    "summary":"22222"
}

r = requests.put(url,headers= header, json = payload)
print(r.status_code)
print(r.json())

4.傳送一個DELETE請求

以部落格園取消收藏的文章為例

import requests

url = "https://wz.cnblogs.com/api/wz/6332142" header = {"cookie" : "***"} r = requests.delete(url, headers = header) print(r.status_code) print(r.text)

5.傳送一個HEAD請求

以獲取下載百度圖片的資訊為例

import requests

url = "https://imgstat.baidu.com/9.gif?_dev=pc&samplekey=&interval=4.57&page=detail&sid=863cbd748f1bc733121967646c913f96a04ed04a&word=%E5%A3%81%E7%BA%B8&cs=1588620919,359805583&_=1605595039967"

r= requests.head(url)
print(r.status_code)
print(r.headers)

6.傳送一個options請求

以部落格園上傳圖片前的option請求為例

import requests

url = "https://upload.cnblogs.com/avatar/upload"
header = {
    "Access-Control-Request-Headers": "x-requested-with,x-xsrf-token",
    "Access-Control-Request-Method": "POST",
    "Host": "upload.cnblogs.com",
    "Origin": "https://account.cnblogs.com",
    "Referer": "https://account.cnblogs.com/settings/account/avatar",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-site"
}

r = requests.options(url, headers = header)
print(r.status_code)   #列印204
print(r.raise_for_status()) #列印None
print(r.headers)

四、session

requests中的session物件能夠跨http請求保持某些引數,即讓同一個session物件傳送的請求頭攜帶某個指定的引數。當然,最常見的應用是它可以讓cookie保持在後續的一串請求中

1.以登陸樂變後臺後獲取首頁資訊為例

import requests

url = "http://www.loveota.com/login.php"
payload = {
    "email": "aaa",
    "password": "bbb"
}

session = requests.session()
r = session.post(url, data = payload)
print(r.status_code)
print(r.text)

url1 = "http://www.loveota.com/sdkwelcome.php"
r1 = session.get(url1)  #獲取首頁資訊,不用再手動加入cookies
print(r1.status_code)
print(r1.text)

session.quit()  #結束會話

2.session手動設定cookies

以樂變後臺請求首頁,再請求熱更管理頁面為例

import requests

url = "http://www.loveota.com/sdkwelcome.php"

session = requests.session()
#session中2種方法設定cookies
#第一種
# cookie = {
#     "PHPSESSID": "***",
#     "Hm_lvt_584f2dd935563d257a0c3a34b25a4afc": "1603352944",
#     "Hm_lvt_0c13eb8745c1855d05fba71ab214e4f8": "1603271638,1605598017",
#     "Hm_lpvt_0c13eb8745c1855d05fba71ab214e4f8": "1605690548",
#     "Hm_lpvt_584f2dd935563d257a0c3a34b25a4afc": "1605690550"
# }
# session.cookies.update(cookie)
#第二種
session.cookies.set("PHPSESSID", "***")
session.cookies.set("Hm_lvt_584f2dd935563d257a0c3a34b25a4afc", "1603352944")
session.cookies.set("Hm_lvt_0c13eb8745c1855d05fba71ab214e4f8", "1603271638,1605598017")
session.cookies.set("Hm_lpvt_0c13eb8745c1855d05fba71ab214e4f8", "1605690548")
session.cookies.set("Hm_lpvt_584f2dd935563d257a0c3a34b25a4afc", "1605690550")

r = session.get(url)
print(r.status_code)
print(r.text)
print(r.request.headers)
#請求另一個需要登陸的介面
url1 = "http://www.loveota.com/sdkchannelinfo.php"
r1 = session.get(url1)
print(r1.status_code)
print(r1.text)

3.session設定headers

import requests

url = "http://httpbin.org"

session = requests.session()
#跨請求引數
session.headers.update({"test1":"111"})
#非跨請求引數
r = session.get(url, headers = {"test2":"222"})
print(r.request.headers)

r1 = r = session.get(url)
print(r.request.headers)

五、獲取reaponse結果資訊

1.獲取狀態碼

  • r.status_code 返回狀態碼
  • r.raise_for_status() #如果狀態碼不是2XX,會返回一個錯誤,否則什麼都不顯示
import requests

url = "https://www.cnblogs.com"

r = requests.get(url)
print(r.status_code)    #列印200
print(r.raise_for_status())   #列印None

返回405

import requests

url = "https://upload.cnblogs.com/avatar/upload"
r = requests.options(url)
print(r.status_code)
print(r.raise_for_status())

列印的結果

2.獲取內容

  • r.text #以文字形式解析響應內容,自動根據encoding解碼
  • r.raw #返回響應原始資訊
  • r.content #以位元組碼形式解析響應內容
  • r.json() #以json字串形式解析響應內容,可通過鍵名獲取對應值

以下載百度logo圖片為例,使用r.content

import requests

url = "https://www.baidu.com/img/bd_logo1.png"
r = requests.get(url)
with open (r"E:\baidulogo.png","wb") as f :   #寫入圖片
    f.write(r.content)

3.獲取編碼格式

  • r.encoding #根據header獲取編碼資訊,如果響應中沒有根據請求資訊中獲取,預設為ISO-8859-1;可以用來設定響應編碼
  • r.apparent_encoding #根據響應實體資訊的內容推斷

以請求百度首頁為例,r.text直接解析中文會亂碼,需要設定編碼格式

設定編碼格式

import requests

url = "https://www.baidu.com"

r = requests.get(url)
print(r.status_code)
r.encoding = "utf-8"   #設定響應編碼
print(r.text)

print(r.encoding)
print(r.apparent_encoding)

列印結果

4.獲取其他內容

  • r.url #獲取請求url
  • r.headers #獲取響應首部資訊
  • r.cookies #獲取響應的cookie資訊,返回的是一個字典物件,可以通過鍵名獲取對應值

以請求百度首頁為例,列印Cookie資訊

import requests

url = "https://www.baidu.com"

r = requests.get(url)
print(r.status_code)
r.encoding = "utf-8"   #設定響應編碼
print(r.text)

print(r.headers)
print(r.cookies)     #列印<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
print(r.cookies["BDORZ"])    #列印27315

設定cookies,字典格式

import requests

url = "http://www.loveota.com/sdkwelcome.php"
cookie = {
    "PHPSESSID": "***",
    "Hm_lvt_584f2dd935563d257a0c3a34b25a4afc": "1603352944",
    "Hm_lvt_0c13eb8745c1855d05fba71ab214e4f8": "1603271638,1605598017",
    "Hm_lpvt_0c13eb8745c1855d05fba71ab214e4f8": "1605690548",
    "Hm_lpvt_584f2dd935563d257a0c3a34b25a4afc": "1605690550"
}
r = requests.get(url,cookies = cookie)
print(r.status_code)
print(r.text)
print(r.request.headers)  #獲取請求頭資訊

5.獲取請求的內容

  • r.request.headers #獲取請求首部資訊

六、其他引數

1.verify = False

開啟Fiddler之後再使用requests傳送HTTPS請求,會報錯,提示Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)'),),設定verify = False

以請求百度首頁為例

import requests

url = "https://www.baidu.com"
r = requests.get(url, verify = False)
print(r.status_code)

會提示warning,但是請求成功

2.allow_redirects=False #禁止重定向

以請求百度首頁為例

import requests

url = "http://www.baidu.com"
#必須加上headers,不然直接返回200
header = {
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
}
r = requests.get(url, headers = header, allow_redirects=False) 

print(r.status_code)    #列印302(臨時重定向)
print(r.headers["location"])   #列印https://www.baidu.com/;重定向的地址