搜尋
首頁後端開發Python教學Requests函式庫在Python中的用法

前面講了Python的urllib庫的使用和方法,Python網絡數據採集Urllib庫的基本使用 ,Python的urllib高級用法 。

今天我們來學習下Python中Requests函式庫的用法。

Requests函式庫的安裝

利用pip 安裝,如果你安裝了pip套件(一款Python套件管理工具,不知道可以百度喲),或是整合環境,例如Python(x, y)或者anaconda的話,就可以直接使用pip安裝Python的函式庫。

$ pip install requests

安裝完成之後,下面來看一下基本的方法:

    #get请求方法
    >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
#打印get请求的状态码
    >>> r.status_code
200
#查看请求的数据类型,可以看到是json格式,utf-8编码
    >>> r.headers['content-type']
'application/json; charset=utf8'
    >>> r.encoding
'utf-8'
#打印请求到的内容
    >>> r.text
u'{"type":"User"...'
#输出json格式数据
    >>> r.json()
    {u'private_gists': 419, u'total_private_repos': 77, ...}

下面看一個小栗子:

#小例子
import requests

r = requests.get('http://www.baidu.com')
print type(r)
print r.status_code
print r.encoding
print r.text
print r.cookies
'''请求了百度的网址,然后打印出了返回结果的类型,状态码,编码方式,Cookies等内容
输出:'''
<class &#39;requests.models.Response&#39;>
200
UTF-8
<RequestsCookieJar[]>

http基本請求

requests庫提供了http所有的基本請求方式。例如:

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請求

r = requests.get("http://httpbin.org/get")
#如果想要加参数,可以利用 params 参数:
import requests
payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
r = requests.get("http://httpbin.org/get", params=payload)
print r.url

#输出:http://httpbin.org/get?key2=value2&key1=value1

如果想請求JSON文件,可以利用json() 方法解析,例如自己寫一個JSON文件命名為a.json,內容如下:

["foo", "bar", {
"foo": "bar"
}]
#利用如下程序请求并解析:
import requests
r = requests.get("a.json")
print r.text
print r.json()
&#39;&#39;&#39;运行结果如下,其中一个是直接输出内容,另外一个方法是利用 json() 方法
解析,感受下它们的不同:&#39;&#39;&#39;
["foo", "bar", {
"foo": "bar"
}]
[u&#39;foo&#39;, u&#39;bar&#39;, {u&#39;foo&#39;: u&#39;bar&#39;}]

如果想取得來自伺服器的原始套接字回應,可以取得r.raw 。 不過需要在初始請求中設定 stream=True 。

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

這樣就取得了網頁原始套接字內容。

如果想新增 headers,可以傳 headers 參數:

import requests

payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
headers = {&#39;content-type&#39;: &#39;application/json&#39;}
r = requests.get("http://httpbin.org/get", params=payload, headers=headers)
print r.url
#通过headers参数可以增加请求头中的headers信息

基本POST請求

對於 POST 請求來說,我們一般需要為它增加一些參數。那麼最基本的傳參方法可以利用 data 這個參數。

import requests

payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
r = requests.post("http://httpbin.org/post", data=payload)
print r.text
#运行结果如下:
{
"args": {}, 
"data": "", 
"files": {}, 
"form": {
"key1": "value1", 
"key2": "value2"
}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "23", 
"Content-Type": "application/x-www-form-urlencoded", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": null, 
"url": "http://httpbin.org/post"
}

可以看到參數傳成功了,然後伺服器回傳了我們傳的資料。

有時候我們需要傳送的資訊不是表單形式的,需要我們傳送JSON格式的資料過去,所以我們可以用 json.dumps() 方法把表單資料序列化。

import json
import requests

url = &#39;http://httpbin.org/post&#39;
payload = {&#39;some&#39;: &#39;data&#39;}
r = requests.post(url, data=json.dumps(payload))
print r.text

#运行结果:
{
"args": {}, 
"data": "{\"some\": \"data\"}", 
"files": {}, 
"form": {}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "16", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": {
"some": "data"
}, 
"url": "http://httpbin.org/post"
}

透過上述方法,我們可以POST JSON格式的資料

如果想要上傳文件,那麼直接用file 參數即可:

#新建一个 test.txt 的文件,内容写上 Hello World!
import requests

url = &#39;http://httpbin.org/post&#39;
files = {&#39;file&#39;: open(&#39;test.txt&#39;, &#39;rb&#39;)}
r = requests.post(url, files=files)
print r.text

{
"args": {}, 
"data": "", 
"files": {
"file": "Hello World!"
}, 
"form": {}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "156", 
"Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": null, 
"url": "http://httpbin.org/post"
}

這樣我們便成功完成了一個文件的上傳。

requests 是支援串流上傳的,這允許你發送大的資料流或檔案而無需先把它們讀入記憶體。要使用串流上傳,只需為你的請求體提供一個類別檔案物件即可,非常方便:

with open(&#39;massive-body&#39;) as f:
requests.post(&#39;http://some.url/streamed&#39;, data=f)

Cookies

如果一個回應中包含了cookie,那麼我們可以利用cookies 變數來拿到:

import requests

url = &#39;Example Domain&#39;
r = requests.get(url)
print r.cookies
print r.cookies[&#39;example_cookie_name&#39;]

以上程式僅是範例,可以用cookies 變數來得到網站的cookies

另外可以利用cookies 變數來傳送cookies 訊息到伺服器:

import requests

url = &#39;http://httpbin.org/cookies&#39;
cookies = dict(cookies_are=&#39;working&#39;)
r = requests.get(url, cookies=cookies)
print r.text
#输出:
&#39;{"cookies": {"cookies_are": "working"}}&#39;

逾時設定

可以利用timeout 變數來設定最大請求時間

requests.get(‘Build software better, together’, timeout=0.001)

註:timeout 只對連線過程有效,與回應體的下載無關。

也就是說,這個時間只限制請求的時間。即使傳回的 response 包含很大內容,下載需要一定時間。

會話物件

在以上的請求中,每次請求其實都等於發起了一個新的請求。也就是相當於我們每個請求都用了不同的瀏覽器單獨打開的效果。也就是它並不是指的一個會話,即使請求的是同一個網址。例如:

import requests

requests.get(&#39;http://httpbin.org/cookies/set/sessioncookie/123456789&#39;)
r = requests.get("http://httpbin.org/cookies")
print(r.text)
#结果是:
{
"cookies": {}
}

很明顯,這不在一個會話中,無法取得 cookies,那麼在某些網站中,我們需要保持一個持久的會話怎麼辦呢?就像用一個瀏覽器逛淘寶一樣,在不同的選項卡之間跳轉,這樣其實就是建立了一個長久會話。

解決方案如下:

import requests

s = requests.Session()
s.get(&#39;http://httpbin.org/cookies/set/sessioncookie/123456789&#39;)
r = s.get("http://httpbin.org/cookies")
print(r.text)
#在这里我们请求了两次,一次是设置 cookies,一次是获得 cookies
{
"cookies": {
"sessioncookie": "123456789"
}
}

發現可以成功取得到 cookies 了,這就是建立一個會話到作用。

那麼既然會話是一個全域的變量,那麼我們肯定可以用來全域的配置了。

import requests

s = requests.Session()
s.headers.update({&#39;x-test&#39;: &#39;true&#39;})
r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test2&#39;: &#39;true&#39;})
print r.text
&#39;&#39;&#39;通过 s.headers.update 方法设置了 headers 的变量。然后我们又在请求中
设置了一个 headers,那么会出现什么结果?很简单,两个变量都传送过去了。
运行结果:&#39;&#39;&#39;
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1", 
"X-Test": "true", 
"X-Test2": "true"
}
}

如果get方法傳的headers 同樣也是 x-test 呢?

r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test&#39;: &#39;true&#39;})

#它会覆盖掉全局的配置:
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1", 
"X-Test": "true"
}
}

如果不想要全域配置中的一個變數了呢?很簡單,設定為 None 即可。

r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test&#39;: None})
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}
}

以上就是 session 會話的基本用法。

SSL證書驗證

現在隨處可見 https 開頭的網站,Requests可以為HTTPS請求驗證SSL證書,就像web瀏覽器一樣。要檢查某個主機的SSL證書,你可以使用verify 參數,因為前段時間12306 證書不是無效的嘛,來測試一下:

import requests

r = requests.get(&#39;https://kyfw.12306.cn/otn/&#39;, verify=True)
print r.text
#结果:
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

來試試github 的:

import requests

r = requests.get(&#39;Build software better, together&#39;, verify=True)
print r.text

嗯,正常請求,由於內容太多,我就不貼上輸出了。

如果我們想跳過剛才 12306 的憑證驗證,把 verify 設定為 False 即可:

import requests

r = requests.get(&#39;https://kyfw.12306.cn/otn/&#39;, verify=False)
print r.text

發現就可以正常請求了。在預設情況下 verify 是 True,所以如果需要的話,需要手動設定下這個變數。

代理

如果需要使用代理,你可以透過為任意請求方法提供 proxies 參數來設定單一請求。

import requests

proxies = {
"https": "http://41.118.132.69:4433"
}
r = requests.post("http://httpbin.org/post", proxies=proxies)
print r.text
#也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理
export HTTP_PROXY="http://10.10.1.10:3128"
export HTTPS_PROXY="http://10.10.1.10:1080"





#

以上是Requests函式庫在Python中的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python與C:學習曲線和易用性Python與C:學習曲線和易用性Apr 19, 2025 am 12:20 AM

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

Python vs. C:內存管理和控制Python vs. C:內存管理和控制Apr 19, 2025 am 12:17 AM

Python和C 在内存管理和控制方面的差异显著。1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

科學計算的Python:詳細的外觀科學計算的Python:詳細的外觀Apr 19, 2025 am 12:15 AM

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。

Python和C:找到合適的工具Python和C:找到合適的工具Apr 19, 2025 am 12:04 AM

選擇Python還是C 取決於項目需求:1)Python適合快速開發、數據科學和腳本編寫,因其簡潔語法和豐富庫;2)C 適用於需要高性能和底層控制的場景,如係統編程和遊戲開發,因其編譯型和手動內存管理。

數據科學和機器學習的Python數據科學和機器學習的PythonApr 19, 2025 am 12:02 AM

Python在數據科學和機器學習中的應用廣泛,主要依賴於其簡潔性和強大的庫生態系統。 1)Pandas用於數據處理和分析,2)Numpy提供高效的數值計算,3)Scikit-learn用於機器學習模型構建和優化,這些庫讓Python成為數據科學和機器學習的理想工具。

學習Python:2小時的每日學習是否足夠?學習Python:2小時的每日學習是否足夠?Apr 18, 2025 am 12:22 AM

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Web開發的Python:關鍵應用程序Web開發的Python:關鍵應用程序Apr 18, 2025 am 12:20 AM

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python vs.C:探索性能和效率Python vs.C:探索性能和效率Apr 18, 2025 am 12:20 AM

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具