日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python Requests快速入门

發(fā)布時(shí)間:2025/4/16 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python Requests快速入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

快速上手

迫不及待了嗎?本頁內(nèi)容為如何入門Requests提供了很好的指引。其假設(shè)你已經(jīng)安裝了Requests。如果還沒有, 去?安裝?一節(jié)看看吧。

首先,確認(rèn)一下:

  • Requests?已安裝
  • Requests是?最新的

讓我們從一些簡單的示例開始吧。

發(fā)送請(qǐng)求

使用Requests發(fā)送網(wǎng)絡(luò)請(qǐng)求非常簡單。

一開始要導(dǎo)入Requests模塊:

>>> import requests

然后,嘗試獲取某個(gè)網(wǎng)頁。本例子中,我們來獲取Github的公共時(shí)間線

>>> r = requests.get('https://github.com/timeline.json')

現(xiàn)在,我們有一個(gè)名為?r?的?Response?對(duì)象。可以從這個(gè)對(duì)象中獲取所有我們想要的信息。

Requests簡便的API意味著所有HTTP請(qǐng)求類型都是顯而易見的。例如,你可以這樣發(fā)送一個(gè)HTTP POST請(qǐng)求:

>>> r = requests.post("http://httpbin.org/post")

漂亮,對(duì)吧?那么其他HTTP請(qǐng)求類型:PUT, DELETE, HEAD以及OPTIONS又是如何的呢?都是一樣的簡單:

>>> 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")

都很不錯(cuò)吧,但這也僅是Requests的冰山一角呢。

為URL傳遞參數(shù)

你也許經(jīng)常想為URL的查詢字符串(query string)傳遞某種數(shù)據(jù)。如果你是手工構(gòu)建URL,那么數(shù)據(jù)會(huì)以鍵/值 對(duì)的形式置于URL中,跟在一個(gè)問號(hào)的后面。例如,httpbin.org/get?key=val?。 Requests允許你使用?params?關(guān)鍵字參數(shù),以一個(gè)字典來提供這些參數(shù)。舉例來說,如果你想傳遞?key1=value1?和?key2=value2?到?httpbin.org/get?,那么你可以使用如下代碼:

>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get("http://httpbin.org/get", params=payload)

通過打印輸出該URL,你能看到URL已被正確編碼:

>>> print r.url u'http://httpbin.org/get?key2=value2&key1=value1'

響應(yīng)內(nèi)容

我們能讀取服務(wù)器響應(yīng)的內(nèi)容。再次以Github時(shí)間線為例:

>>> import requests >>> r = requests.get('https://github.com/timeline.json') >>> r.text '[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests會(huì)自動(dòng)解碼來自服務(wù)器的內(nèi)容。大多數(shù)unicode字符集都能被無縫地解碼。

請(qǐng)求發(fā)出后,Requests會(huì)基于HTTP頭部對(duì)響應(yīng)的編碼作出有根據(jù)的推測。當(dāng)你訪問r.text?之時(shí),Requests會(huì)使用其推測的文本編碼。你可以找出Requests使用了什么編碼,并且能夠使用?r.encoding?屬性來改變它:

>>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1'

如果你改變了編碼,每當(dāng)你訪問?r.text?,Request都將會(huì)使用?r.encoding?的新值。

在你需要的情況下,Requests也可以使用定制的編碼。如果你創(chuàng)建了自己的編碼,并使用codecs?模塊進(jìn)行注冊(cè),你就可以輕松地使用這個(gè)解碼器名稱作為?r.encoding?的值, 然后由Requests來為你處理編碼。

二進(jìn)制響應(yīng)內(nèi)容

你也能以字節(jié)的方式訪問請(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 StringIO import StringIO >>> i = Image.open(StringIO(r.content))

JSON響應(yīng)內(nèi)容

Requests中也有一個(gè)內(nèi)置的JSON解碼器,助你處理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/...

如果JSON解碼失敗,?r.json?就會(huì)拋出一個(gè)異常。

原始響應(yīng)內(nèi)容

在罕見的情況下你可能想獲取來自服務(wù)器的原始套接字響應(yīng),那么你可以訪問?r.raw?。 如果你確實(shí)想這么干,那請(qǐng)你確保在初始請(qǐng)求中設(shè)置了?stream=True?。具體的你可以這么做:

>>> r = requests.get('https://github.com/timeline.json', stream=True) >>> r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> >>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

定制請(qǐng)求頭

如果你想為請(qǐng)求添加HTTP頭部,只要簡單地傳遞一個(gè)?dict?給?headers?參數(shù)就可以了。

例如,在前一個(gè)示例中我們沒有指定content-type:

>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> headers = {'content-type': 'application/json'} >>> r = requests.post(url, data=json.dumps(payload), headers=headers)

更加復(fù)雜的POST請(qǐng)求

通常,你想要發(fā)送一些編碼為表單形式的數(shù)據(jù)—非常像一個(gè)HTML表單。 要實(shí)現(xiàn)這個(gè),只需簡單地傳遞一個(gè)字典給?data?參數(shù)。你的數(shù)據(jù)字典 在發(fā)出請(qǐng)求時(shí)會(huì)自動(dòng)編碼為表單形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print r.text { ... "form": { "key2": "value2", "key1": "value1" }, ... }

很多時(shí)候你想要發(fā)送的數(shù)據(jù)并非編碼為表單形式的。如果你傳遞一個(gè)?string?而不是一個(gè)dict?,那么數(shù)據(jù)會(huì)被直接發(fā)布出去。

例如,Github API v3接受編碼為JSON的POST/PATCH數(shù)據(jù):

>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, data=json.dumps(payload))

POST一個(gè)多部分編碼(Multipart-Encoded)的文件

Requests使得上傳多部分編碼文件變得很簡單:

>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }

你可以顯式地設(shè)置文件名:

>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'))} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }

如果你想,你也可以發(fā)送作為文件來接收的字符串:

>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\\nanother,row,to,send\\n" }, ... }

響應(yīng)狀態(tài)碼

我們可以檢測響應(yīng)狀態(tài)碼:

>>> r = requests.get('http://httpbin.org/get') >>> r.status_code 200

為方便引用,Requests還附帶了一個(gè)內(nèi)置的狀態(tài)碼查詢對(duì)象:

>>> r.status_code == requests.codes.ok True

如果發(fā)送了一個(gè)失敗請(qǐng)求(非200響應(yīng)),我們可以通過?Response.raise_for_status()?來拋出異常:

>>> 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", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error

但是,由于我們的例子中?r?的?status_code?是?200?,當(dāng)我們調(diào)用?raise_for_status()?時(shí),得到的是:

>>> r.raise_for_status() None

一切都挺和諧哈。

響應(yīng)頭

我們可以查看以一個(gè)Python字典形式展示的服務(wù)器響應(yīng)頭:

>>> r.headers { 'status': '200 OK', 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json; charset=utf-8' }

但是這個(gè)字典比較特殊:它是僅為HTTP頭部而生的。根據(jù)?RFC 2616?, HTTP頭部是大小寫不敏感的。

因此,我們可以使用任意大寫形式來訪問這些響應(yīng)頭字段:

>>> r.headers['Content-Type'] 'application/json; charset=utf-8' >>> r.headers.get('content-type') 'application/json; charset=utf-8'

如果某個(gè)響應(yīng)頭字段不存在,那么它的默認(rèn)值為?None

>>> r.headers['X-Random'] None

Cookies

如果某個(gè)響應(yīng)中包含一些Cookie,你可以快速訪問它們:

>>> url = 'http://example.com/some/cookie/setting/url' >>> r = requests.get(url) >>> r.cookies['example_cookie_name'] 'example_cookie_value'

要想發(fā)送你的cookies到服務(wù)器,可以使用?cookies?參數(shù):

>>> url = 'http://httpbin.org/cookies' >>> cookies = dict(cookies_are='working') >>> r = requests.get(url, cookies=cookies) >>> r.text '{"cookies": {"cookies_are": "working"}}'

重定向與請(qǐng)求歷史

使用GET或OPTIONS時(shí),Requests會(huì)自動(dòng)處理位置重定向。

Github將所有的HTTP請(qǐng)求重定向到HTTPS。可以使用響應(yīng)對(duì)象的?history?方法來追蹤重定向。 我們來看看Github做了什么:

>>> r = requests.get('http://github.com') >>> r.url 'https://github.com/' >>> r.status_code 200 >>> r.history [<Response [301]>]

Response.history?是一個(gè):class:Request?對(duì)象的列表,為了完成請(qǐng)求而創(chuàng)建了這些對(duì)象。這個(gè)對(duì)象列表按照從最老到最近的請(qǐng)求進(jìn)行排序。

如果你使用的是GET或OPTIONS,那么你可以通過?allow_redirects?參數(shù)禁用重定向處理:

>>> r = requests.get('http://github.com', allow_redirects=False) >>> r.status_code 301 >>> r.history []

如果你使用的是POST,PUT,PATCH,DELETE或HEAD,你也可以啟用重定向:

>>> r = requests.post('http://github.com', allow_redirects=True) >>> r.url 'https://github.com/' >>> r.history [<Response [301]>]

超時(shí)

你可以告訴requests在經(jīng)過以?timeout?參數(shù)設(shè)定的秒數(shù)時(shí)間之后停止等待響應(yīng):

>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

注:

timeout?僅對(duì)連接過程有效,與響應(yīng)體的下載無關(guān)。

錯(cuò)誤與異常

遇到網(wǎng)絡(luò)問題(如:DNS查詢失敗、拒絕連接等)時(shí),Requests會(huì)拋出一個(gè)ConnectionError?異常。

遇到罕見的無效HTTP響應(yīng)時(shí),Requests則會(huì)拋出一個(gè)?HTTPError?異常。

若請(qǐng)求超時(shí),則拋出一個(gè)?Timeout?異常。

若請(qǐng)求超過了設(shè)定的最大重定向次數(shù),則會(huì)拋出一個(gè)?TooManyRedirects?異常。

所有Requests顯式拋出的異常都繼承自?requests.exceptions.RequestException?。

轉(zhuǎn)載于:https://www.cnblogs.com/lotusto/p/5800569.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Python Requests快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。