首頁 後端開發 Python教學 關於Python中第三方函式庫Requests函式庫的高階用法詳解

關於Python中第三方函式庫Requests函式庫的高階用法詳解

Mar 13, 2017 am 09:37 AM

雖然Python的標準函式庫中urllib2模組已經包含了平常我們使用的大多數功能,但是它的API使用起來讓人實在感覺不好。它已經不適合現在的時代,不適合現代的網路了。而Requests的誕生讓我們有了更好的選擇。本文就介紹了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(<a rel="external nofollow" href="http://httpbin.org/get">http://httpbin.org/get</a>)
登入後複製

基本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://www.php.cn/
登入後複製

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

##

四、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&#39;, 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=<a href="http://10.10.1.10:1080">http://10.10.1.10:1080</a>
登入後複製

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? 如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在Linux終端中使用python --version命令時如何解決權限問題? 在Linux終端中使用python --version命令時如何解決權限問題? Apr 02, 2025 am 06:36 AM

Linux終端中使用python...

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? 如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何繞過Investing.com的反爬蟲機制獲取新聞數據? 如何繞過Investing.com的反爬蟲機制獲取新聞數據? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...

Python 3.6加載pickle文件報錯ModuleNotFoundError: No module named '__builtin__'怎麼辦? Python 3.6加載pickle文件報錯ModuleNotFoundError: No module named '__builtin__'怎麼辦? Apr 02, 2025 am 06:27 AM

Python3.6環境下加載pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

使用Scapy爬蟲時,管道文件無法寫入的原因是什麼? 使用Scapy爬蟲時,管道文件無法寫入的原因是什麼? Apr 02, 2025 am 06:45 AM

使用Scapy爬蟲時管道文件無法寫入的原因探討在學習和使用Scapy爬蟲進行數據持久化存儲時,可能會遇到管道文�...

See all articles