1. GET請求帶參數(shù)
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.get("http://httpbin.org/get", params=params)
print(r.url)
print(r.text)
2. POST請求
2.1 表單提交
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", data=params)
print(r.url)
print(r.text)
2.2 JSON請求體
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", data=json.dumps(params))
print(r.url)
print(r.text)
由requests
自行轉(zhuǎn)JSON:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", json=json.dumps(params))
print(r.url)
print(r.text)
3. 文件上傳
上傳文件同時提交form表單:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
files = {'simple_request.py': ('simple_request.py', open('./simple_request.py', 'rb'), 'application/vnd.ms-excel',
{'Expires': '0'})}
r = requests.post("http://httpbin.org/post", data=params, files=files)
print(r.url)
print(r.text)
大多數(shù)場景下液肌,如果是通過代碼來上傳文件的,我們能拿到的往往不會是文件嗦哆,而是一個io對象或者字節(jié)數(shù)組,只需要將bytes
封裝為ByteIO
傳遞即可:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
b = b"abcefg"
files = {'simple_request.py': ('simple_request.py', BytesIO(b), 'application/vnd.ms-excel',
{'Expires': '0'})}
r = requests.post("http://httpbin.org/post", data=params, files=files)
print(r.url)
print(r.text)
4. 請求超時
這里的超時有兩個值老速,連接超時(connect timeout
)和讀取超時(read timeout
),連接超時是指客戶端和服務(wù)器建立連接的超時時間橘券,讀取超時是指客戶端發(fā)送請求后等待服務(wù)器響應(yīng)的時間。
傳給requests
的timeout
可以是一個數(shù)字卿吐,這個數(shù)字會被同時當(dāng)作連接超時和讀取超時:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", data=params, timeout=1)
print(r.url)
print(r.text)
也可以傳一個tuple,分別指定:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", data=params, timeout=(3, 4))
print(r.url)
print(r.text)
如果服務(wù)響應(yīng)的速度本來就慢箭窜,而且你希望無限期等待,可以將timeout
設(shè)置為None
:
import requests
import json
import os
import sys
from io import BytesIO
params = {"a": 1, "b": 2, "c": [3, 4]}
r = requests.post("http://httpbin.org/post", data=params, timeout=None)
print(r.url)
print(r.text)
5. 代理
也是比較常見的場景磺樱,如果做爬蟲的話纳猫,被抓取的服務(wù)往往有特定防爬策略竹捉,最簡單的就是單個IP訪問量異常的識別,通過使用多個代理服務(wù)器块差,我們就能降低每個IP的訪問量,避免被限制:
import requests
url = 'https://httpbin.org/post'
def response_hook(r, *args, **kwargs):
print("response", r, args, kwargs)
r.headers["WTF"] = "what is the fuck"
return r
proxies = {
'http': 'http://127.0.0.1:8888', # 127.0.0.1:8888 是我本機的Fiddler代理地址
'https': 'http://127.0.0.1:8888',
'ftp': 'http://127.0.0.1:8888',
}
r = requests.post(url, data={"a": 1, "b": 2}, hooks={"response": response_hook}, proxies=proxies, verify=False)
print(r.headers["WTF"])