相比Python內(nèi)置的urllib和urllib2庫儒飒,第三方的requests庫提供了更強大的網(wǎng)絡(luò)請求功能领铐,使用起來也更方便锈锤。
測試一下:
import requests
resp = requests.get('http://baidu.com')
print resp.status_code
# 200
requests可以發(fā)送各種請求:
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
GET請求
最基本的GET請求可以直接用get方法
r = requests.get("http://httpbin.org/get")
如果想要加參數(shù)逢唤,可以利用 params 參數(shù)
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print r.url
運行結(jié)果
http://httpbin.org/get?key2=value2&key1=value1
通過headers參數(shù)可以增加請求頭中的headers信息
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
headers = {'content-type': 'application/json'}
r = requests.get("http://httpbin.org/get", params=payload, headers=headers)
print r.url
POST請求
對于 POST 請求來說彻消,一般需要為它增加一些參數(shù)省店。最基本的傳參方法可以利用 data 這個參數(shù)嚣崭。
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print r.text
代理
為requests套上一層代理的做法也非常簡單:
import requests
proxies = {"https": "http://41.118.132.69:4433"}
r = requests.post("http://httpbin.org/post", proxies=proxies)
print r.text
Get、Post以及其他請求均可添加代理懦傍。
Cookies
如果一個響應(yīng)中包含了cookie雹舀,那么我們可以利用 cookies 變量來獲取:
import requests
url = 'http://example.com'
r = requests.get(url)
print r.cookies
print r.cookies['example_cookie_name']
另外可以利用 cookies 變量來向服務(wù)器發(fā)送 cookies 信息:
import requests
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
print r.text
Session
以上的每次請求其實都是發(fā)起了一個新的請求粗俱,也就是相當(dāng)于我們每個請求都用了不同的瀏覽器單獨打開的效果说榆。也就是它并不是指的一個會話,即使請求的是同一個網(wǎng)址寸认。不在一個會話中签财,無法獲取 cookies,那么在一些站點中偏塞,我們需要保持一個持久的會話怎么辦呢唱蒸?就像用一個瀏覽器逛淘寶一樣,在不同的選項卡之間跳轉(zhuǎn)烛愧,這樣其實就是建立了一個長久會話油宜。
服務(wù)器端通過session來區(qū)分不同的用戶請求(瀏覽器會話)掂碱,requests的會話對象是用來模擬這樣的操作的,比如可以跨請求保持某些參數(shù):就像你在訪問微博的時候慎冤,不需要每次翻頁都重新登錄一次疼燥。
session = requests.Session()
session.post('http://test.cn/login', data={'user': 'user', 'pass': 'mypassword'})
# 登錄成功則可以發(fā)布文章了
session.put('http://test.cn/new', data={'title': 'title of article', 'data': 'content'})
既然會話是一個全局的變量,那么我們肯定可以用來全局的配置了蚁堤。
import requests
s = requests.Session()
s.headers.update({'x-test': 'true'})
r = s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})
print r.text
通過 s.headers.update 方法設(shè)置了 headers 的變量醉者。然后我們又在請求中設(shè)置了一個 headers,那么會出現(xiàn)什么結(jié)果披诗?很簡單撬即,兩個變量都傳送過去了。
如果get方法傳的headers 同樣也是 x-test呈队,它會覆蓋掉原來的設(shè)置:
r = s.get('http://httpbin.org/headers', headers={'x-test': 'true'})
如果不想要全局配置中的一個變量剥槐,設(shè)置為 None 即可:
r = s.get('http://httpbin.org/headers', headers={'x-test': None})
響應(yīng)內(nèi)容
請求發(fā)送成功的話會得到HTTP response,那么如何提取里面的內(nèi)容呢宪摧?
requests會自動對響應(yīng)內(nèi)容編碼粒竖,所以就可以通過resp.text
取出響應(yīng)文本了。對于別等響應(yīng)內(nèi)容(文件几于、圖片蕊苗、...),則可以通過resp.content
取出來沿彭。對于json內(nèi)容朽砰,也可以通過resp.json()
來取,或者采用如下的方法提群砹酢:
# resp.txt為json文件
jdict = json.loads(resp.text)
# 提取具體內(nèi)容
pageSize = jdict["content"]["pageSize"]