python-requests


python-requests

作用:能夠模擬瀏覽器向服務器發送請求的庫

requests庫的主要方法

方法 描述
requests.request() 構造一個請求,支持以下各種方法
requests.get() 獲取html的主要方法
requests.head() 獲取html頭部信息的主要方法
requests.post() 向html網頁提交post請求的方法
requests.put() 向html網頁提交put請求的方法
requests.patch() 向html提交局部修改的請求
requests.delete() 向html提交刪除請求
requests.Session() session相關

請求接收的參數

requests.request(method,url,**kwargs)類能夠構造一個請求,支持不同的請求方式。

給指定url發送請求

response = requests.get(url='url路徑',timeout=5)

 

import requests

response = requests.request(method='get',url='https://www.baidu.com')
print(response.status_code) #打印返回的參數

request類中看看幾個參數:

method:請求方式。

url:請求URL

**kwargs:

params:字典或者字節序列,作為參數增加到url中,使用這個參數可以把一些鍵值對以k1=v1&
k2=v2的模式增加到url中,get請求中用的較多。
       data:字典、字節序列或者文件對象,重點作為向服務器提供或提交資源,作為請求的請求體,與params不同放在url上不同。它也可以接受一個字符串對象。
json:json格式的數據,可以向服務器提交json類型的數據。
headers:字典,定義請求的請求頭,比如可以headers字典定義user agent。
cookies:字典或者CookieJar。
auth:元組,用來支持HTTP認證功能。
files:字典,用來向服務器傳輸文件。
timeout:指定超時時間。
proxies:字典,設置代理服務器。
allow_redirects:開關,是否允許對URL進行重定向,默認為True。
stream:開關,是否對獲取內容進行立即下載,默認為False,也就是立即下載。這里需要說明的,stream一般應用於流式請求,
比如說下載大文件,不可能一次請求就把整個文件都下載了,不現實,這種情況下,就要設置stream=True,requests無法將連接釋放回連接池,除非下載完了所有數據,或者調用了response.close。
verify:開關,用於SSL證書認證,默認為True。
cert:用於設置保存本地SSL證書路徑

響應對象支持的屬性

import requests
response = requests.request(method='get',url='http://www.baidu.com')

當請求被發送后,會有一個response響應。requests同樣為這個reponse賦予了相關方法:

response:響應對象。
response.status_code:請求返回狀態碼。
response.text:字符串形式的響應內容。
response.json():返回響應的是json類型的數據,如果響應的類型不是json,則拋出ValueError。
response.content:二進制的響應內容。
response.iter_content(chunk_size):生成器,在stream=True的情況下,當遍歷生成器時,以塊的形式返回,也就是一塊一塊的遍歷要下載的內容。
避免了遇到大文件一次性的將內容讀取到內存中的弊端,如果stream=False,全部數據作為一個塊返回。chunk_size參數指定塊大小。

response.iter_lines():生成器,當stream=True時,迭代響應數據,每次一行,也就是一行一行的遍歷要下載的內容。同樣避免了大文件一次性寫入到內存中的問題。
當然,該方法不安全。至於為啥不安全,咱也不知道,咱也不敢問,主要是官網上沒說!經查,如果多次調用該方法,iter_lines不保證重新進入時的安全性,因此可能會導致部分收到的數據丟失。
response.cookies:響應中的cookie信息。
response.cookies.get_dict():以字典的形式返回cookies信息。
response.cookies.items():以列表的形式返回cookies信息。
response.headers:響應頭字典。取其中的指定key,response.headers.get('Content-Type', '哎呀,沒取到!')
response.reqeust:請求類型。
response.url:請求的URL。
response.reason:響應HTTP狀態的文本原因。
response.encoding:響應結果的編碼方式。
response.encoding = “gbk”:修該響應編碼方式,比如說響應結果的編碼是utf-8,通過這么response.encoding = “gbk”指定為gbk。
response.apparent_encoding:根據響應字節流中去chardet庫中匹配,返回編碼方式,並不保證100%准確。
response.history:以列表的形式返回請求記錄。列表內的請求以最老到最新排序

requests.get()

requests.get(url,params=None,**kwargs)  #發送GET請求。相關參數:
url,請求的URL.
params參數:可選url中的額外參數,字典或者字節流格式。
**kwargs:
		params:字典或者字節序列,作為參數增加到url中,使用這個參數可以把一些鍵值對以k1=v1&k2=v2的模式增加到url中,get請求中用的較多。
       data:字典、字節序列或者文件對象,重點作為向服務器提供或提交資源,作為請求的請求體,與params不同放在url上不同。它也可以接受一個字符串對象。
json:json格式的數據,可以向服務器提交json類型的數據。
headers:字典,定義請求的請求頭,比如可以headers字典定義user agent。
cookies:字典或者CookieJar。
auth:元組,用來支持HTTP認證功能。
files:字典,用來向服務器傳輸文件。
timeout:指定超時時間。
proxies:字典,設置代理服務器。
allow_redirects:開關,是否允許對URL進行重定向,默認為True。
stream:開關,是否對獲取內容進行立即下載,默認為False,也就是立即下載。這里需要說明的,
stream一般應用於流式請求,比如說下載大文件,不可能一次請求就把整個文件都下載了,不現實,
這種情況下,就要設置stream=True,requests無法將連接釋放回連接池,除非下載完了所有數據,或者調用了response.close。
verify:開關,用於SSL證書認證,默認為True。
cert:用於設置保存本地SSL證書路徑

params參數

get難免會帶一些額外的參數K1=V1&K2=V2

手動拼接:

import requests

response = requests.get(url='http://www.httpbin.org/get?k1=v1&k2=v2')
print(reponse.url) #http://www.httpbin.org/get?k1=v1&k2=v2
print(response.json().get('args'))

現在我們可以使用params參數來解決這個問題

import requests
params = {"user":"張開","pwd":"666"}
response = requests.get(url='httpbin.org/get',params=params)
print(response.url)   #http://www.httpbin.org/get?user=%E5%BC%A0%E5%BC%80&pwd=666
print(response.json().get('args'))   #{'pwd':'666','user':'張開'}

headers

使用headers的目的是模擬人請求網頁數據

最起碼在請求頭中加入user-agent

再來看看,GET請求中如何攜帶headers(請求頭)

import requests
headers = {'user-agent':"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}

扒網頁過程中如果,存在網頁亂碼情況

response.encoding = 'gbk'  #響應的數據用這種方式做轉碼操作
print(reponse.encoding)
print(response.text)

遇到大型文件

import requests
response = requests.get(url="https://up.ruyile.com/jy_img/bj/image/5/242/159qt158301921542923.png",timeout=5)

with open('a.ang','wb') as f:
for i in requests.iter_content(chunk_size=1):
f.wirte(i)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM