Python 的 requests 是一個(gè)簡(jiǎn)單易用的 HTTP 庫,但我之前很少用到它。我開(kāi)始重視是因為工程師分享給我 Rum Bot 代碼中,用到了這個(gè)方法來(lái)和 api 交互,同時(shí)也用到它來(lái)爬取和下載圖片。
這篇學(xué)習筆記匯總了 requests 的基本用法。
執行 import 檢查自己本地是否已經(jīng)安裝。如果沒(méi)有安裝,在命令行模式下執行 pip 安裝即可。
pip install requestsimport requestsrequests 有多個(gè)請求。最常用到的是 get() 和 post(),其它我目前沒(méi)有用到過(guò)。
在 requests 這個(gè)庫的簡(jiǎn)介中,也是只舉例了 get() 和 post() 這兩個(gè)方法。
下述 url 也都是 requests 開(kāi)發(fā)者所提供的,大膽嘗試。
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
requests.get('http://httpbin.org/get')這些請求的返回值,是 requests 自定義的一種類(lèi)型。
resp = requests.get('http://httpbin.org/get')
type(resp)以 Get() 請求為例,可以看到它具備如下屬性:
import requests
url = "http://httpbin.org/get"
resp = requests.get(url)狀態(tài)碼。200,一般表示正常。其它碼值見(jiàn) api 設計,通常碼值含義都是一致的。
#狀態(tài)碼
resp.status_code
type(resp.status_code)#請求url
resp.url
type(resp.url)#頭信息
resp.headers
type(resp.headers)h = resp.headers
for k,v in enumerate(h):
print(v,h[v])頭信息的 Connection 很關(guān)鍵,默認是 keep-alive,但有時(shí)會(huì )導致連接過(guò)多,而被目標拒絕訪(fǎng)問(wèn)??梢?update 為 Close:
resp.headers.update({"Connection":"Close"})
resp.headers#cookies
resp.cookies
type(resp.cookies)#以文本形式打印網(wǎng)頁(yè)源碼
resp.text
type(resp.text)#以字節流形式打印
resp.content
type(resp.content)字節流有個(gè)很好的用途。
比如:利用字節流下載并保存圖片
import requests
url = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
picname = url.split("/")[-1]
picfile = f'D://{picname}'
resp = requests.get(url)
b = resp.content
with open(picfile,'wb') as f:
f.write(b)用來(lái)下載文件也是可以的,但數據形式是 html,并不是 markdown。
注意 open() 的參數是 wb,其中 w for writing,b for bytes.
import requests
url = "https://github.com/rumsystem/quorum/blob/main/API.md"
name = url.split("/")[-1]
file = f'D://{name}'
resp = requests.get(url)
b = resp.content
with open(file,'wb') as f:
f.write(b)resp.json() 方法和 json.loads(resp.text) 效果相同。
import requests
resp = requests.get("http://httpbin.org/get")
resp.json()url 的返回值符合 json 語(yǔ)法格式才可以。否則會(huì )拋出錯誤。
比如:
import requests
resp = requests.get("http://baidu.com")
resp.json()總是可以用 resp.content、resp.text 這兩個(gè)屬性來(lái)查看返回值。
resp.text[:100]import requests
resp = requests.get("http://httpbin.org/get?name=gemey&age=22")
resp.json()import requests
data = {
'name': 'tom',
'age': 20
}
resp = requests.get('http://httpbin.org/get', params=data)
resp.json()3、為 post 請求添加參數
import requests
data = {"name":"tom","age":6}
requests.post('http://httpbin.org/post', data=data)import requests
headers = {'User-Agent':
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'}
requests.get('http://www.baidu.com',headers=headers)也可以對 headers 進(jìn)行 update。
import requests
session = requests.Session()
session.verify = r"C:\Users\75801\AppData\Local\Programs\prs-atm-app\resources\quorum_bin\certs\server.crt"
session.headers.update({
"USER-AGENT": "asiagirls-py-bot",
"Content-Type": "application/json",
})
url = "https://127.0.0.1:55043/api/v1/groups"
session.get(url)import requests
session = requests.Session()
session.verify = r"C:\Users\75801\AppData\Local\Programs\prs-atm-app\resources\quorum_bin\certs\server.crt"
session.headers.update({
"USER-AGENT": "asiagirls-py-bot",
"Content-Type": "application/json",
})
session.get("https://127.0.0.1:55043/api/v1/groups")sessionimport requests
session = requests.Session()
session.verify = r".\quorum_bin\certs\server.crt"
session.headers.update({
"USER-AGENT": "asiagirls-py-bot",
"Content-Type": "application/json",
"Connection": "close"
})
session.get("https://127.0.0.1:55043/api/v1/groups")sessionsession.get("https://127.0.0.1:55043/api/v1/network")session同添加headers方法,代理參數也要是一個(gè)dict
這里使用requests庫爬取了IP代理網(wǎng)站的IP與端口和類(lèi)型
因為是免費的,使用的代理地址很快就失效了。
我沒(méi)用過(guò)這個(gè)功能。這段筆記來(lái)自網(wǎng)上檢索。
import requests
import re
def get_html(url):
proxy = {
'http': '120.25.253.234:812',
'https': '163.125.222.244:8123'
}
heads = {}
heads['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
req = requests.get(url, headers=heads,proxies=proxy)
html = req.text
return html
def get_ipport(html):
regex = r'<td data-title="IP">(.+)</td>'
iplist = re.findall(regex, html)
regex2 = '<td data-title="PORT">(.+)</td>'
portlist = re.findall(regex2, html)
regex3 = r'<td data-title="類(lèi)型">(.+)</td>'
typelist = re.findall(regex3, html)
sumray = []
for i in iplist:
for p in portlist:
for t in typelist:
pass
pass
a = t+','+i + ':' + p
sumray.append(a)
print('高匿代理')
print(sumray)
if __name__ == '__main__':
url = 'http://www.kuaidaili.com/free/'
get_ipport(get_html(url))verify 與 ca 認證相關(guān)。某些網(wǎng)站不需要,某些網(wǎng)站需要;如果你不提供,會(huì )遇到報錯。但可以采用如下方式忽略報錯:
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #從urllib3中消除警告
resp = requests.get('https://www.12306.cn',verify=False) #證書(shū)驗證設為FALSE
resp.status_code但這個(gè)作為示例不太好,verify無(wú)論是 True 或 False 或 "" 返回碼都是 200。
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #從urllib3中消除警告
resp = requests.get('https://www.12306.cn',verify=True)
resp.status_codeimport requests
from requests.packages import urllib3
urllib3.disable_warnings() #從urllib3中消除警告
resp = requests.get('https://www.12306.cn',verify="")
resp.status_code所以我用 Rum 的 API 試試看,它對 verify 是有要求的。
requests.get('https://127.0.0.1:55043/api/v1/groups',verify=True)requests.get('https://127.0.0.1:55043/api/v1/groups',verify="")#對verify設置 False,能拿到返回值
requests.get('https://127.0.0.1:55043/api/v1/groups',verify=False)v = r"C:\Users\75801\AppData\Local\Programs\prs-atm-app\resources\quorum_bin\certs\server.crt"
requests.get('https://127.0.0.1:55043/api/v1/groups',verify=v)只是有點(diǎn)奇怪,verify 只要不是 True 都能正常返回。
如果用于長(cháng)時(shí)間運行,需要捕獲異常并針對性處理。比如有:
import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
response = requests.get('http://www.baidu.com',timeout=0.5)
print(response.status_code)
except ReadTimeout:
print('timeout')
except HTTPError:
print('httperror')
except RequestException:
print('reqerror')這篇筆記是從 Jupyter NoteBook 的 ipynb 文件轉換而來(lái),如果想直接運行 .ipynb 文件,可以在我的 github 倉庫找到它:
https://github.com/liujuanjuan1984/common_python_code/blob/master/Python_requests_examples.ipynb
以上就是關(guān)于 requests 庫的常見(jiàn)用法。
聯(lián)系客服