1城瞎、安裝
終端cmd 輸入:
pip install requests
2、發(fā)送請(qǐng)求
import requests
>>> r=requests.get( 'https://github.com/timeline.json' )
>>> 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")
3俱恶、傳遞參數(shù)
URL參數(shù)可直接跟在問(wèn)號(hào)后,置于URL之后,如:httpbin.org/get?key=val募判,除此以外,
get方法:
>>>payload={'key1':'value1','key2':'value2'}
>>>r=requests.get("http://httpbin.org/get",params=payload)
post方法:
>>>payload={'key1':'value1','key2':'value2'}
>>>r=requests.post("http://httpbin.org/post",data=payload)
其中咒唆,若請(qǐng)求參數(shù)為json:先將參數(shù)轉(zhuǎn)化為json格式(json.dumps())
>>>import ?json
>>>url = ' https://api.github.com/some/endpoint '
>>>payload = {'some':'data'}
>>>r =requests.post (url,data=json.dumps(payload))
2.4.2版本之后可直接使用json參數(shù)傳遞
>>>url = 'https://api.github.com/some/endpoint'
>>>payload = {'some':'data'}
>>>r = requests.post (url,?json=payload)
上傳文件參數(shù)(Multipart-Encoded):
>>>url = 'http://httpbin.org/post'
>>>files = { 'file' : open('report.xls','rb') }
>>>r = requests.post(url, files=files)
4届垫、響應(yīng)內(nèi)容
>>>importrequests
>>>r=requests.get('https://github.com/timeline.json')
>>>r.text
u'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 會(huì)自動(dòng)解碼來(lái)自服務(wù)器的內(nèi)容。大多數(shù) unicode 字符集都能被無(wú)縫地解碼全释。
請(qǐng)求發(fā)出后装处,Requests 會(huì)基于 HTTP 頭部對(duì)響應(yīng)的編碼作出有根據(jù)的推測(cè)。當(dāng)你訪問(wèn)r.text之時(shí)浸船,Requests 會(huì)使用其推測(cè)的文本編碼妄迁。
也能以字節(jié)的方式訪問(wèn)請(qǐng)求響應(yīng)體,對(duì)于非文本請(qǐng)求:
>>>r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...
Requests 會(huì)自動(dòng)為你解碼gzip和deflate傳輸編碼的響應(yīng)數(shù)據(jù)李命。
例如登淘,以請(qǐng)求返回的二進(jìn)制數(shù)據(jù)創(chuàng)建一張圖片,你可以使用如下代碼:
>>>from ?PIL ?import ?Image
>>>from ?io ?import ?BytesIO
>>>i = Image.open(BytesIO(r.content))
Requests 中也有一個(gè)內(nèi)置的 JSON 解碼器封字,來(lái)處理 JSON 數(shù)據(jù):
>>>import ?requests
>>>r = requests.get('https://github.com/timeline.json')
>>>r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
>>>r.json()['url'] ? ? ? ? ? #獲取json屬性值
如果 JSON 解碼失敗黔州,r.json()就會(huì)拋出一個(gè)異常。例如阔籽,相應(yīng)內(nèi)容是 401 (Unauthorized)流妻,嘗試訪問(wèn)r.json()將會(huì)拋出ValueError:NoJSONobjectcouldbedecoded異常。
5笆制、定制請(qǐng)求頭
>>>url = 'https://api.github.com/some/endpoint'
>>>headers = {'user-agent':'my-app/0.0.1'}
>>>r = requests.get(url, headers=headers)
注意: 定制 header 的優(yōu)先級(jí)低于某些特定的信息源合冀,例如:
? ? ? ?如果在.netrc中設(shè)置了用戶(hù)認(rèn)證信息,使用headers=設(shè)置的授權(quán)就不會(huì)生效项贺。而如果設(shè)置了 ? ? ? ? ? ? ? auth=參數(shù)君躺,``.netrc`` 的設(shè)置就無(wú)效了。
? ? ? ? 如果被重定向到別的主機(jī)开缎,授權(quán) header 就會(huì)被刪除棕叫。
? ? ? ? 代理授權(quán) header 會(huì)被 URL 中提供的代理身份覆蓋掉。
? ? ? ? ?在我們能判斷內(nèi)容長(zhǎng)度的情況下奕删,header 的 Content-Length 會(huì)被改寫(xiě)俺泣。
更進(jìn)一步講,Requests 不會(huì)基于定制 header 的具體情況改變自己的行為。只不過(guò)在最后的請(qǐng)求中伏钠,所有的 header 信息都會(huì)被傳遞進(jìn)去横漏。
注意: 所有的 header 值必須是string、bytestring 或者 unicode熟掂。盡管傳遞 unicode header 也是允許的缎浇,但不建議這樣做。
6赴肚、響應(yīng)狀態(tài)碼
>>>r=requests.get('http://httpbin.org/get')
>>>r.status_code
200
如果發(fā)送了一個(gè)錯(cuò)誤請(qǐng)求(一個(gè) 4XX 客戶(hù)端錯(cuò)誤素跺,或者 5XX 服務(wù)器錯(cuò)誤響應(yīng)),我們可以通過(guò)Response.raise_for_status()來(lái)拋出異常:
>>>bad_r=requests.get('http://httpbin.org/status/404')
>>>bad_r.status_code
404
>>>bad_r.raise_for_status()
Traceback (most recent call last):File"requests/models.py", line832, in raise_for_statusraisehttp_error
requests.exceptions.HTTPError:404 Client Error
7誉券、響應(yīng)頭
>>>r.headers
{'content-encoding': 'gzip','transfer-encoding': 'chunked','connection': 'close','server': 'nginx/1.0.4','x-runtime': '148ms','etag': '"e1ca502697e5c9317743dc078f67693f"','content-type': 'application/json'}
8指厌、Cookie
響應(yīng)中包含cookie,可快速訪問(wèn)
>>>url='http://example.com/some/cookie/setting/url'
>>>r=requests.get(url)
>>>r.cookies['example_cookie_name']
'example_cookie_value'
也使用cookie參數(shù)踊跟,發(fā)送cookie到服務(wù)器踩验,
>>>url='http://httpbin.org/cookies
'>>>cookies=dict(cookies_are='working')
>>>r=requests.get(url, cookies=cookies)
>>>r.text
'{"cookies": {"cookies_are": "working"}}'
9.其他
重定向和請(qǐng)求歷史:
默認(rèn)情況下,除了 HEAD, Requests 會(huì)自動(dòng)處理所有重定向商玫。
可以使用響應(yīng)對(duì)象的history方法來(lái)追蹤重定向晰甚。
Response.history是一個(gè)Response對(duì)象的列表,為了完成請(qǐng)求而創(chuàng)建了這些對(duì)象决帖。這個(gè)對(duì)象列表按照從最老到最近的請(qǐng)求進(jìn)行排序。
例如蓖捶,Github 將所有的 HTTP 請(qǐng)求重定向到 HTTPS:
>>>r=requests.get('http://github.com')
>>>r.url'https://github.com/'
>>>r.status_code200
>>>r.history
[< Response [301]>]
如果你使用的是GET地回、OPTIONS、POST俊鱼、PUT刻像、PATCH 或者 DELETE,那么你可以通過(guò)allow_redirects參數(shù)禁用重定向處理:
>>>r =requests.get('http://github.com', allow_redirects=False)
>>>r.status_code
301
超時(shí)
你可以告訴 requests 在經(jīng)過(guò)以timeout參數(shù)設(shè)定的秒數(shù)時(shí)間之后停止等待響應(yīng):
>>>requests.get('http://github.com',timeout=0.001)
注意
timeout僅對(duì)連接過(guò)程有效并闲,與響應(yīng)體的下載無(wú)關(guān)细睡。timeout并不是整個(gè)下載響應(yīng)的時(shí)間限制,而是如果服務(wù)器在timeout秒內(nèi)沒(méi)有應(yīng)答帝火,將會(huì)引發(fā)一個(gè)異常(更精確地說(shuō)溜徙,是在timeout秒內(nèi)沒(méi)有從基礎(chǔ)套接字上接收到任何字節(jié)的數(shù)據(jù)時(shí))