【python】requests模塊初探(一)

来源:https://www.cnblogs.com/flowertester/archive/2019/09/24/11581892.html
-Advertisement-
Play Games

一、寫在前面 Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發的,所以它比 ...


一、寫在前面


Requests 是用Python語言編寫,基於 urllib,採用 Apache2 Licensed 開源協議的 HTTP 庫。它比 urllib 更加方便,可以節約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發的,所以它比 urllib 更加 Pythoner。

那麼,requests都有哪些應用場景呢?

1.伺服器編程基礎;

2.爬蟲利器;

3.自動化介面測試;

4.運維監控腳本

等等

本篇,我就記錄一下requests最常用的兩個請求方式和以及響應,其他內容後續更新


二、安裝

安裝很簡單,只需要使用命令行安裝即可:

pip install requests

三、請求

3.1 GET請求

r = requests.get('https://api.github.com/events')

3.2 傳遞URL參數的GET請求

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

3.3 請求cookies

url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
#後面用到再詳細分析

3.4 POST請求

通常,想要發送一些編碼為表單形式的數據——非常像一個 HTML 表單。要實現這個,只需簡單地傳遞一個字典給 data 參數。你的數據字典在發出請求時會自動編碼為表單形式:

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

還可以為 data 參數傳入一個元組列表。在表單中多個元素使用同一 key 的時候,這種方式尤其有效:

payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)

很多時候你想要發送的數據並非編碼為表單形式的,例如你要傳遞一個 string 而不是一個 dict:

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

或者是定義一個字元串的data

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

此處除了可以自行對 dict 進行編碼,你還可以使用 json 參數直接傳遞,然後它就會被自動編碼

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

四、請求頭

如果想為請求添加 HTTP 頭部,只要簡單地傳遞一個 dict 給 headers 參數就可以了。

url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)

五、響應

前面的請求例子中,每個請求都會賦值給一個名為 r 的 Response 對象,我們可以從這個對象中獲取所有我們想要的信息

5.1獲得請求url

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
>>> http://httpbin.org/get?key1=value1&key2=value2&key2=value3

5.2獲得響應內容

r = requests.get('https://api.github.com/events')
r.text #獲得響應內容,類型為字元串
r.json() #如果 JSON 解碼失敗, r.json() 就會拋出一個異常
r.content #獲得響應內容,類型為bytes-二進位響應內容
r.raw #原始響應內容,在罕見的情況下,你可能想獲取來自伺服器的原始套接字響應(後面會詳細結合流數據來分析)

5.3響應狀態碼

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

如果發送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 伺服器錯誤響應),我們可以通過 Response.raise_for_status() 來拋出異常:

r = requests.get('http://httpbin.org/status/404')
r.status_code
>>> 404
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

5.4響應頭

r.headers

5.5 Response對象支持的所有方法

r.xxx #在ipython調試中,可以通過tab鍵來查看所有方法

該對象所有方法如下:

apparent_encoding
content
encoding
is_permanent_redirect
iter_lines
next
raw
status_code
close
cookies
headers
is_redirect
json
ok
reason
text
connection
elapsed
history
iter_content
links
raise_for_status
request
url

這裡僅介紹了幾個很常用的響應方法,後面遇到實際問題再展開討論

六、超時

可以告訴 requests 在經過以 timeout 參數設定的秒數時間之後停止等待響應。基本上所有的生產代碼都應該使用這一參數。如果不使用,你的程式可能會永遠失去響應:

requests.get('http://github.com', timeout=0.001)

後記

以上的兩種關於requests庫請求方式及響應方法應該可以處理一些基本問題了,後面會繼續探索requests庫的其他功能。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、記憶體分析 代碼:引用可以是局部變數也可以是成員變數 二、對象之間建立關係 二、源碼: D34_husband_and_wife.java 地址: https://github.com/ruigege66/Java/blob/master/D34_husband_and_wife.java​ 2. ...
  • 夢中驚醒 在Tomcat的線程池裡,有這樣一個線程,自打出生後,從來不去幹活兒,有好多次走出線程池“這座大山”去看世界的機會,都被他拱手讓給了弟兄們。弟兄們給他取了個名字叫二師兄。沒錯,好吃懶做,飽了睡,醒了吃。這不,又迷迷糊糊睡著了,還打呼嚕呢。“快起來,起來,幹活去了”,有人在喊他。只見二師兄轉 ...
  • 在上篇文章中 "SpringApplication到底run了什麼(上)" 中,我們分析了下麵這個run方法的前半部分,本篇文章繼續開工 6. 獲取系統屬性 但是這個屬性的作用還真不知道。。 7. 列印banner 8. 根據當前環境創建ApplicationContext 基於咱們的Servlet ...
  • PyCon China 是一年一度的 Python 中國開發者大會,今年上海站國內外大佬雲集,「流暢的 Python」作者、Flask 作者及核心維護者、PyCharm 開發者等等大佬都登臺演講。 ...
  • 今天一個同事問我文件複製的問題,他一個100M的文件複製的指定目錄下竟然成了1G多,嚇我一跳,後來看了他的代碼發現是自己通過位元組流複製的,定義的位元組數組很大,導致複製後目標文件非常大,其實就是空行等一些無效空間。我也是很少用這種方式拷貝問價,大多數用Apache提供的commons-io中的File ...
  • # -*-coding:utf-8-*- # !/usr/bin/env python # Author :vilicute ''' func:對某文件夾下的圖片進行批量裁剪 ''' import os import time from PIL import Image start = time.t... ...
  • 2019-09-24-23:24:24 一.什麼時生成器? 1.生成器的實質就是迭代器 二.生成器的獲取方式 1.通過生成器函數 2.通過各種推導式獲取生成器 3.通過數據轉換獲取生成器 三..案例 四.yield和return的區別 yield是通過分段執行函數,執行了yield不會立即停止函數的 ...
  • 預設情況下Spring Boot使用了內嵌的Tomcat伺服器,項目最終被打成jar包運行,每個jar包可以被看作一個獨立的Web伺服器。 傳統的Web開發,一般會將Web應用打成一個war包,然後將其部署到Web伺服器中運行。 Spring Boot也支持傳統的部署模式。 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...