1 背景
http請求是常見的一種網頁協議,我們看到的各種網頁,其實都是發送了http請求得到了服務器的回應,從而將資料庫中復雜的資料以簡單、直觀的方式呈現出來,方便大眾閱讀、使用,而如何發送http請求呢?今天來探討一下使用requests模塊,達到高效、簡單的http請求操作,
2 什么是requests
requests是用python語言基于urllib撰寫的,采用的是Apache2 Licensed開源協議的HTTP庫,雖然標準庫中的urllib2模塊已經包含了平時我們使用的大多數功能,但是urllib2的API使用起來并不太友好,而requests自稱“HTTP for Humans”,經過高度封裝以后,可以直接呼叫此庫的相關函式,非常方便幫助我們實作爬取HTML網頁頁面、模擬自動提交網路請求等操作,
requests模塊一直在迭代更新,以完全適應當前的所有網路請求,
支持的 HTTP 特性:
- 保持活動和連接池
- 國際域名和 URL
- Cookie 持久性會話
- 瀏覽器式 SSL 驗證
- 自動內容解碼
- 基本 / 摘要身份驗證
- 優雅的鍵 / 值 Cookie
- 自動減壓
- Unicode 回應機構
- HTTP(S)代理支持
- 分段檔案上傳
- 流下載
- 連接超時
- 分塊請求
- .netrc 支持
- 執行緒安全
3 如何安裝
安裝requests模塊與安裝其他python模塊一樣,使用pip命令安裝即可,
pip install requests
# 如需指定版本
pip install requests==2.27.1
4 如何使用
4.1 七個主要方法
4.2 HTTP協議對資源的操作
4.3 回應公共方法
4.4 常用方式舉例
4.4.1 requests.request()
method:提交方式(get|post);
url:提交地址;
kwargs:14個控制訪問的引數;
常用的引數有:params、data、json、headers、cookies,其他引數講解與示例將在(二)中進行介紹,
示例:
- params:在url上傳遞的引數,GET形式傳遞到后臺,
import requests
requests.request(
method = 'GET',
url = 'http://127.0.0.1:8080/example/request',
# 字典
data= https://www.cnblogs.com/Jcloud/p/{'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
# 字串
data="https://www.cnblogs.com/Jcloud/p/k1=v1&k2=v2&x=[1,2,3]"
# 位元組
data = https://www.cnblogs.com/Jcloud/p/bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
)
# http://www.oldboyyede.com?k1=v1&k2=v2
- data:在請求體里面傳遞的資料,后面可以是字典,位元組等資料型別,
import requests
requests.request(
method = 'POST',
url = 'http://127.0.0.1:8080/example/request',
# 字典
data= https://www.cnblogs.com/Jcloud/p/{'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
# 字串
data="https://www.cnblogs.com/Jcloud/p/k1=v1&k2=v2&x=[1,2,3]"
# 位元組
data = https://www.cnblogs.com/Jcloud/p/bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
# 檔案物件
data = https://www.cnblogs.com/Jcloud/p/open('data_file.py', mode='r', encoding='utf-8')
)
- json:在請求體里面傳遞資料,把整體序列化成一個大字串,字典中嵌套字典的話用JSON序列化,
import requests
requests.request(
method = 'POST',
url = 'http://127.0.0.1:8080/example/request',
json = {'k1' : 'v1', 'k2' : 'v2'}
# "{ 'k1' : 'v1' , 'k2' : 'v2' }"
# 字典嵌套字典
json = json.dumps({'k1' : 'v1' , 'k2' : { 'kk1' : vv1 }})
)
- headers:在請求體中添加請求頭
import requests
requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
json={'k1': 'v1', 'k2': 'v2'},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
- cookies:在請求體中添加cookie
import requests
requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
data=https://www.cnblogs.com/Jcloud/p/{'k1': 'v1', 'k2': 'v2'},
cookies={'cookie_example': 'cookie_value1'},
)
# 也可以使用CookieJar(字典形式就是在此基礎上封裝)
from http.cookiejar import CookieJar
from http.cookiejar import Cookie
obj = CookieJar()
# 構建cookie
obj.set_cookie(
Cookie(
version=0,
name='c1',
value='https://www.cnblogs.com/Jcloud/p/v1',
port=None,
domain='',
path='/',
secure=False,
expires=None,
discard=True,
comment=None,
comment_url=None,
rest={'HttpOnly': None},
rfc2109=False,
port_specified=False,
domain_specified=False,
domain_initial_dot=False,
path_specified=False)
)
# 發送請求
requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
data=https://www.cnblogs.com/Jcloud/p/{'k1': 'v1', 'k2': 'v2'},
cookies=obj
)
4.4.2 requests.get()
構造一個向服務器請求資源的request物件,然后回傳一個包含服務器資源的response物件,
url:網址鏈接地址;
params:在url上傳遞的引數,以GET形式傳遞到后臺,可為字典或位元組流格式;
kwargs:14個控制訪問的引數;
示例:
import requests
# 1、基本GET實體
# 設定url
url="http://127.0.0.1:8080/example/get"
# 呼叫get方法發送請求
response = requests.get(url)
# 列印請求狀態碼
print(response.status_code)
# 列印回應內容
print(response.text)
# 列印編碼方式
print(response.encoding)
# 列印二進制形式內容
print(response.content)
# 2、帶引數與請求頭
url = "http://127.0.0.1:8080/example/get"
params = { "username": "admin" }
header = {'User-Agent': 'chrome'}
# 將請求偽裝成谷歌瀏覽器chrome進行訪問后的User-Agent,發送GET請求介面資訊
response = requests.get(url=url,params=params,headers=header)
# 如介面回傳資料格式為json格式
print(response.json())
# 結果為:{ "code": 200, "msg": "請求成功", "data": [{...}] }
4.4.3 requests.head()
構造一個向服務器請求資源的request物件,獲取HTML網頁頭資訊,
url:網址鏈接地址;
kwargs:14個控制訪問的引數;
示例:
import requests
url = "http://127.0.0.1:8080/example/get"
response = requests.head(url)
# 列印請求頭資訊
print(response.headers)
注:部分網址請求時,可能會遇到網路防火墻,此時添加瀏覽器請求頭資訊,可避免此類問題發生,
另外,在發送一些請求時,如:網路爬蟲時,如不加headers,將會被網站識別出是python程式請求,可以使用真實的瀏覽器資訊頭,模擬發生請求(警語:請遵守爬蟲Robots協議),
import requests
url = "127.0.0.1:8080/example/get"
header = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
response = requests.get(url=url, headers=header)
# 列印請求狀態碼
print(response.status_code)
# 200
4.4.4 requests.post()
構造一個向服務器請求資源的request物件,然后回傳一個包含服務器資源的response物件,
url:網址鏈接地址;
kwargs:14個控制訪問的引數;
示例:
# 1、基本POST實體
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://127.0.0.1:8080/example/post", data=https://www.cnblogs.com/Jcloud/p/payload)
print(ret.text)
# 2、發送請求頭和資料實體
import requests
import json
url ='http://127.0.1:8080/example/post'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}
response = requests.post(url, data=https://www.cnblogs.com/Jcloud/p/json.dumps(payload), headers=headers)
# 列印回應內容
print(response.text)
# 列印cookie
print(response.cookies)
4.4.5 其他請求
import requests
requests.put(url, data=https://www.cnblogs.com/Jcloud/p/None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs)
# 以上方法均是在此方法的基礎上構建
requests.request(method, url, **kwargs)
5 本期常見問題
1.列印text時,出現亂碼
答:1、查看是否正確配置encoding;2、查看是否為圖片,圖片資料為二進制資料,將圖片轉化為str的字串型別,就會出現亂碼,
2.列印content時,出現“\x00\x00”等內容:
答:在python中,b開頭的內容,表示為bytes型別的資料,
作者:京東物流 駱銅磊
來源:京東云開發者社區
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555325.html
標籤:Python
上一篇:01. 組建知識星球服務體系
下一篇:返回列表
