學習python3時,需要用到requests,總結下來,以便之後複習
1、requests簡介
requests是通過urllib3實現自動發送HTTP/1.1請求,它能輕鬆的實現cookies,登陸驗證,代理設置等操作。Python內置的urllib模塊,用於訪問網絡資源。但是,它用起來比較麻煩,而且,缺少很多實用的高級功能。更好的方案是使用requests。它是一個Python第三方庫,處理URL 資源特別方便。
requests實現內容有:
1.保持活力和連接池
2.支持國際域名和網址
3.會話與Cookie持久性
4.瀏覽器式SSL驗證
5.自動內容解碼
6.基本/摘要式身份驗證
7.自動解壓縮
8.Unicode響應body
9.HTTP(s)代理支持
10.多部分文件上傳
11.流媒體下載
12.連接超時
13.分塊的請求
14.netrc 支持
2、requests的安裝
#pip install requests
requests依賴包關係如下:
requests==2.19.1
- certifi [required: >=2017.4.17, installed: 2018.4.16] #CA認證模塊
- chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4] #通用字符編碼檢測器模塊
- idna [required: <2.8,>=2.5, installed: 2.7] #國際化域名解析模塊
- urllib3 [required: <1.24,>=1.21.1, installed: 1.23] #線程安全HTTP庫
如版本不一樣,可通過 pip 下載最新版即可。
3、requests請求
所有請求的功能可通過這7種方法訪問,他們都返回response對象的一個實例。
(1)requests.request(method,url,**kwargs):構造併發送一個request,返回一個response對象
參數:
method: request對象的方法(POST)
url: request對象的URL
params: 可選的,要在查詢字符串中發送的字典或字節request
data: 可選的,字典或元祖列表以表單編碼,字節或類似文件的對象在主體中發送[(key,value)]
json: 可選的,一個json可序列化的python對象,在主體中發送request
headers: 可選的,用於編寫http頭信息
cookies: 可選,用dict或cookieJar對象發送Cookies
file: 可選,用於多部分編碼上傳的字典,可以是多元祖,其中是定義給定文件的內容類型的字符串,以及包含問文件添加的額外頭文件的類字典對象
auth: 可選,身份驗證元祖,自定義http身份驗證
timeout: 可選,發送等待請求數據的超時時間(float/tuple),設置爲元祖即爲練級connect和read讀取超時,如果設置爲None即爲永久等待
allow_redirects:布爾值,可選,啓用或禁用GET,OPTIONS,POST,PUT,PATCH,DELETE,HEAD重定向,默認爲true
proxies: 可選,字典映射協議到代理的URL
verify: 可選,可以是布爾值,可以指定驗證服務器的TLS證書路徑,默認爲true
stream: 可選,如果是False,響應內容將立即下載
cert: 可選,如果是string,則爲ssl客戶端證書文件路徑,如果是元祖則('cert','key')指定證書和密鑰
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from requests import request
header={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36' }
response=request('GET','https://api.github.com/events',headers=header)
#定義頭信息發送請求返回response對象
print(response.url) #返回請求的URL
print(response.status_code) #返回狀態碼200
print(response.encoding) #返回編碼
print(response.text) #返回響應的內容以unicode表示
print(response.headers) #返回頭信息
print(response.cookies) #返回cookies CookieJar
print(response.json()) #返回json數據
(2)requests.head(url,**kwargs):發送head請求,url:網站URL地址,返回一個response對象
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from requests import head
header=head('https://github.com/get')
print('text:',header.text) #不會返回內容信息
print('headers:',header.headers) #返回頭信息
print(header.cookies.items()) #返回cookies元組列表
(3)requests.get(url,params=None,**kwargs):發送GET請求,params:要在查詢字符串中發送的字典或字節request,返回一個response對象
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from requests import get
response=get('http://httpbin.org/get',params={'name':'py.qi','age':22})#添加參數查詢
print(response.text) #返回結果包含args參數,headers頭信息,URL和IP信息
print(response.url) #返回組合的URL(http://httpbin.org/get?name=py.qi&age=22)
print(response.json()) #如果返回網頁是JSON格式,可以使用json()方法解析返回字典數據
抓取網頁代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests import re
url='http://www.runoob.com/python3/python3-reg-expressions.html'
headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36' }
response=requests.get(url,headers=headers)
response.encoding='UTF-8'
#print(response.encoding)
#print(response.text)
pattern = re.compile('id="content">.*?<h1>(.*?)</h1>.*?<p>(.*?)</p><p>(.*?)</p>.*?<p>(.*?)</p>.*?<p>(.*?)</p>.*?<p>(.*?)</p>',re.S)
text = re.search(pattern,response.text)
for i in text.groups():
print(i)
# Python3 正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。
# Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。 re 模塊使 Python 語言擁有全部的正則表達式功能。
# compile 函數根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。
# re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做爲它們的第一個參數。
抓取二進制文件:圖像,BytesIO創建內存對象存儲數據,Image打開圖像獲得圖像對象,也可以用上下問方式將圖像直接寫入文件,適合音頻,視頻等文件
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests from io
import BytesIO from PIL
import Image
url='http://docs.python-requests.org/en/master/_static/requests-sidebar.png'
r=requests.get(url)
i=Image.open(BytesIO(r.content)) #獲得一個圖像對象
print(i.format,i.size,i.mode) #查看圖像的來源,像素和像素類型(RGB)
#print(i.show()) #顯示圖片
i.save('requests_log.png') #保存圖像數據到文件
(4)requests.post(url,data=None,json=None,**kwargs):發送POST請求,data:字典數據也可以是元組列表,將被表單編碼,以字節或文件對象在數據主體中發送json:在json數據中發送正文,返回一個response對象
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
data={'k1':'v1','k2':'v2'}
r = requests.post('http://httpbin.org/post',data=data) #以表單數據發送數據
body=r.json() #獲得字典格式的返回數據
print(body['form']) #竊取表單編碼數據
上傳文件:files參數指定上傳文件,上傳的文件在主體數據中
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
url='http://httpbin.org/post'
files={'file':open('network.csv','rb')}
files1={'file':('filename.xls',open('fileanme.xls','rb'),'application/vnd.ms-excel',{'expires':'0'})} #設置文件名
r=requests.post(url,files=files) #指定文件發送請求
print(r.json()['files'])
多個文件上傳:
代碼示例:
import requests
url='http://httpbin.org/post'
multple_files=[ ('images1',('11.jpg',open('11.jpg','rb'),'image/jpg')), ('images2',('22.jpg',open('22.jpg','rb'),'image/jpg')), ]
#字段代表意思依次爲:文件名,文件對象,文件類型
r=requests.post(url,files=multple_files)
print(r.text)
在網站中PUT,PATCH,DELETE請求很少使用,不做介紹
(5)requests.put(url,data=None,**kwargs):發送PUT請求參數同POST一樣,將返回一個response對象
(6)requests.patch(url,data=None,**kwargs):發送PATCH請求
(7)requests.delete(url,**kwargs):發送DELETE請求
4、請求響應
class response.Response :該Response對象包含服務器對HTTP請求的響應信息
該對象包含的屬性和方法:
apparent_encodind:由chardet庫提供的明顯編碼。
close():將連接釋放回池中,即關閉連接,通常不需要調用
content:響應的內容,以字節爲單位。
cookies=None :服務器發回的Cookies CookieJar。
elapsed=None :發送請求和響應到達之間所經過的時間量(作爲timedelta)。該屬性具體測量發送請求的第一個字節和完成解析報頭之間的時間。因此,它不受消費響應內容或stream關鍵字參數值的影響。
encoding=None :編碼以在訪問r.text時進行解碼。
headers=None :不區分大小寫的響應頭字典。例如,headers['content-encoding']將返回'Content-Encoding'響應頭的值。
history=None :Response請求歷史記錄中的對象列表。任何重定向響應都會在這裏結束。該列表從最舊的到最近的請求進行排序。
is_permanent_redirect:如果此響應爲真,則爲重定向的永久版本之一。
is_redirect:如果此響應是可以自動處理的格式良好的HTTP重定向,則爲真。
iter_content(chunk_size = 1,decode_unicode = False ):迭代響應數據。在請求中設置stream = True時,可以避免將內容一次性讀入內存以獲得較大的響應。塊大小是它應該讀入內存的字節數;chunk_size必須是int或None類型。stream = True將在數據以任何大小接收到的數據到達時讀取數據。如果stream = False,則數據作爲單個塊返回;如果decode_unicode爲True,則內容將使用基於響應的最佳可用編碼進行解碼。
iter_lines(chunk_size = 512,decode_unicode = None,delimiter = None ):迭代響應數據,一次一行。在請求中設置stream = True時,可以避免將內容一次性讀入內存以獲得較大的響應。
json(** kwargs ):返回響應的json編碼內容
links:返回解析的響應頭部鏈接
next:返回重定向鏈中下一個請求的PreparedRequest
ok:如果status_code小於400 則返回True,否則返回False
reason=None:響應HTTP狀態的文本原因,例如“未找到”或“確定”。
request=None:一個響應的對象。
status_code=None:整數響應HTTP狀態的代碼,例如404或200。
text:響應的內容,以unicode表示。
url=None:響應的最終URL位置
發送請求後,會得到響應信息,我們可以使用text和content獲取相應的內容,此外還有很多屬性和方法來獲取其他信息,如狀態碼,響應頭,Cookies等
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'}
r=requests.get('http://docs.python-requests.org/en/master/',headers=headers)
print('chardet提供的編碼:',r.apparent_encoding)
print('響應字節內容:',r.content)
print('響應cookies:',r.cookies.items())
print('請求到響應之間的時間:',r.elapsed)
print('響應編碼:',r.encoding)
print('響應頭信息:',r.headers)
print('頭信息中的server:',r.headers['Server'])
print('請求歷史記錄:',r.history)
print('迭代響應數據:',r.iter_lines())
#print('響應json編碼數據:',r.json())
print('返回解析的響應頭鏈接:',r.links)
print('返回狀態碼:',r.status_code)
print('響應str內容:',r.text)
print('響應URL:',r.url)
print('返回發送的頭參數:',r.request.headers)
5、requests異常處理
exception requests.RequestException(*args, **kwargs):發送一個模糊的異常
exception requests.ConnectionError(*args, **kwargs):發生連接錯誤時的異常
exception requests.HTTPError(*args, **kwargs):發生HTTP錯誤時的異常
exception requests.URLRequired(*args, **kwargs):URL錯誤時的異常
exception requests.TooManyRedirects(*args, **kwargs):太多的重定向
exception requests.ConnectTimeout(*args, **kwargs):連接服務器是請求超時
exception requests.ReadTimeout(*args, **kwargs):服務器沒有在指定的時間內發送數據
exception requests.Timeout(*args, **kwargs):請求超時
6、cookies
cookies包括下面四個類:
requests.utils.dict_from_cookiejar(cj):從CookieJar中返回一個鍵/值字典,cj爲CookieJar對象,返回字典
requests.utils.add_dict_to_cookiejar(cj, cookie_dict):從鍵/值字典中返回CookieJar,cj指定CookieJar類型,cookie_dict,字典類型的JAR值,返回CookieJar
requests.cookies.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):從鍵/值字典中返回CookieJar
class requests.cookies.RequestsCookieJar(policy=None):創建CookieJar,應用請求和未指定的請求和會話
cookieJar對象方法與屬性:
add_cookie_header(request):添加正確的Cookie到請求頭
clear(domain=None,path=None,name=None):清除cookies
clear_expired_cookies():丟棄所有過期的cookies。
clear_session_cookies():丟棄所有會話cookie。
copy():返回這個RequestsCookieJar的副本。
extract_cookies(response,request):根據請求提取允許的響應中的cookie。
get(name,default = None,domain = None,path = None):類似於字典的get(),它還支持可選的域和路徑參數,以解決在多個域中使用一個cookie jar造成的命名衝突。
get_dict(domain=None,path=None):以可選域和路徑作爲參數,並返回符合要求的名稱 - 值對Cookie的普通舊Python字典。
items():類似Dict的項目()從jar中返回名稱值元組的列表。
iteritems():類似於dict的iteritems()從jar中返回名稱值元組的迭代器。
iterkeys():返回jar中cookie的名字的迭代器。
itervalues():返回jar中cookie值的迭代器。
keys():返回jar中的cookies的名字列表。
list_domains():實用程序方法列出jar中的所有域。
list_paths():實用程序方法列出jar中的所有路徑。
make_cookies(response,request):從響應對象中提取的Cookie對象的返回序列。
multiple_domains():如果jar中有多個域,則返回True。否則返回False。
pop(k[,d]) :移除指定的鍵並返回相應的值。
popitem() :移除並返回(鍵,值)對
set(name,value):還支持可選的域和路徑參數,以解決在多個域中使用一個cookie jar造成的命名衝突。
set_cookie(cookie,* args,** kwargs):設置一個cookie,不檢查是否應該設置。
set_cookie_if_ok(cookie,request):判斷設置cookies是否可行,返回OK
update(other):用另一個CookieJar或類似字典的cookie更新這個jar
values():返回jar中cookie的值列表。
獲取網站cookies:
代碼示例:
import requests
r=requests.get('https://www.baidu.com')
print(r.cookies)
print(r.cookies.items()) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
#RequestsCookieJar對象 [('BDORZ', '27315')]
使用cookies維持登陸狀態:
代碼示例:
import requests
headers={ 'Cookie':'www51cto=F7A5DB397E1897B2B12EEC15A74FB351kYaA; Cto_lvt_=1503809599; ......#登陸網站後將cookie信息拷貝到此處 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' }
r=requests.get('http://blog.51cto.com/zhangxinqi',headers=headers)
print(r.text)
print(r.cookies.items()) #顯示結果是登陸後的信息,表明登陸成功
創建RequestsCookieJar對象,使用cookies保持登陸:
代碼示例:
import requests from requests.cookies
import RequestsCookieJar
cookie='www51cto=F7A5DB397E1897B2B12EEC15A74FB351kYaA; ......'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' }
jar=RequestsCookieJar() #創建Jar對象
for i in cookie.split(';'):
key,value = i.split('=',1)
jar.set(key,value) #設置cookies的鍵值
#print(jar.items())
r=requests.get('http://blog.51cto.com/zhangxinqi',cookies=jar,headers=headers) #傳入cookies
#print(r.text)
print(r.headers['Set-Cookie'])
print(r.request.headers['Cookie']) #獲取客戶端設置的cookie
7、請求會話(Session)
在requests中,如果直接利用get()和post()方法的確可以做到模擬網頁的請求,但這實際上是相當於不同的會話,也就是說相當於使用了兩個瀏覽器打開ileal不同的頁面如果利用psot()請求登陸了網站,然後使用get()方法請求個人信息,將得到兩個完全不同的會話,就不能獲取到個人信息,實際上可以使用設置cookies一樣請求會話得到個人信息,單方法顯得很繁瑣,可用使用更簡單的方法,Session維持會話,利用它不需要設置cookies,它能幫助我們自動處理,下面先看下Session對象的API
class requests.Session:請求會話,提供cookie持久性,連接池和配置
方法與屬性:
auth=None 身份驗證元祖
cert=None SSL客戶端證書路徑,如果爲元祖('cert','key')
close() 關閉會話
cookies=None 會話中設置的未處理的cookie的cookieJar,默認是一個RequestsCookieJar
delete(url,**kwargs) 發送DELETE請求,返回一個response對象
get(url) 發送GET請求,返回response對象
get_adapter(url) 爲給定的URL返回適當的連接適配器
get_redirect_target(resp) 返回重定向URL或None
head(url) 發送head請求,返回response對象
headers=None 一個不區分大小寫的字典,由字典發送Session
hooks=None 事件處理
max_redirects=None 允許最大重定向次數默認爲30
merge_environment_settings(url,proxies,stream,verify,cert) 檢查環境並將參數設置合併,返回字典
params=None 設置傳遞的參數
post(url,data=None,json=None) 發送POST請求返回response對象
prepare_request(request) 構造一個PreparedRequest並返回它,將生成一個請求的數據結構,通過Session發送
proxies=None 代理URL
request(method,url,params=None,data=None,headers=None,cookies=None,files=None,auth=None,timeout=None,allow_redirects=True,proxies=None,hooks=None,stream=None,verify=None,cert=None,json=None) 構建一個request,返回response對象
send(request) 發送給定的PreparedRequest,返回Response對象
stream=None 流響應的內容
trust_env=None 代理設置的身份驗證和信任環境設置
verify=None SSL驗證,設置爲false則忽略SSL驗證
測試能否獲取自己設置的cookies:
代碼示例:
import requests #使用測試網站設置cookies的名稱爲number值爲123456
requests.get('http://httpbin.org/cookies/set/number/123456')
r=requests.get('http://httpbin.org/cookies')
print(r.text) #然後通過請求獲取cookies,結果cookies顯示爲空 # {"cookies":{}}
然而並不能獲取到設置的cookies,說明它們使用不同的瀏覽器訪問了頁面,即得到的cookies會不一樣現在我們使用Seesion會話保持來設置請求看有什麼變化
代碼示例:
import requests
s=requests.Session() #創建session對象
s.get('http://httpbin.org/cookies/set/number/123456')
r=s.get('http://httpbin.org/cookies') #通過session獲取請求的cookies
print(r.text) #成功返回cookies信息 {"cookies":{"number":"123456"}}
利用session可以 做到模擬同一個會話而不用擔心cookies的問題,它常用於模擬登陸成功後再進行下一步操作,可以模擬在同一個瀏覽器中打開同一個站點的不同頁面
實例:通過session會話登陸頁面獲取個人信息
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests from requests.auth
import HTTPBasicAuth
url='http://192.168.146.140/admin/'
s=requests.Session()
response=s.get(url,auth=HTTPBasicAuth('admin','123'))
print(response.text)
print(response.headers)
print(response.status_code)
8、SSL證書驗證
rerquests提供了證書驗證的功能,當發送http請求時,它會檢查SSL證書,可以通過verify參數來控制是否檢查此證書,如果不設置默認爲True會自動驗證,我們使用https://www.12306.cn測試
代碼示例:
import requests
r=requests.get('https://www.12306.cn')
print(r.status_code)
#返回SSLError
raise SSLError(e, request=request)
將verify參數設置爲false在看結果:
代碼示例:
import requests
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code) #能正常返回200,但有個警告信息 connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) 200
可以使用urllib3中的disable_warnings()忽略警告,也可以用logging日子模塊將警告寫入日誌
代碼示例:
import requests
import logging
import urllib3
urllib3.disable_warnings() #忽略警告
#logging.captureWarnings(True) #也可以寫入日誌中
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code) # 200
除了以上的方法,我們如果有證書的話,可以cert參數指定證書路徑,如果是單個文件包含密鑰和證書,也可以設置兩個文件路徑的元祖分別指向證書和密鑰
代碼示例:
import requests
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code) #注意,如果是本地私有證書的key必須是解密狀態,加密狀態的key是不支持的
9、代理設置
對於某些網站,在測試的時候請求幾次,能正常獲取內容。但是一旦開始大規模爬取,對於大規模且頻繁的請求,網站可能會彈出驗證碼,或者跳轉到登錄認證頁面,更甚者可能會直接封禁客戶端的IP,導致一定時間段內無法訪問。那麼,爲了防止這種情況發生,我們需要設置代理來解決這個問題,這就需要用到proxies參數
代碼示例:
import requests
proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", }
requests.get("https://www.taobao.com", proxies=proxies)
若代理需要使用HTTP Basic Auth,可以使用類似http://user:password@host:port這樣的語法來設置代理
代碼示例:
import requests
proxies = { "http": "http://user:[email protected]:3128/", }
requests.get("https://www.taobao.com", proxies=proxies)
除了基本的HTTP代理外,requests還支持SOCKS協議的代理,這是一個可選功能,需要在使用前安裝額外的第三方庫
# pip install requests[socks]
一旦你安裝了這些依賴項,使用SOCKS代理就像使用HTTP代理一樣簡單:
代碼示例:
import requests
proxies = { 'http': 'socks5://user:password@host:port', 'https': 'socks5://user:password@host:port' }
requests.get("https://www.taobao.com", proxies=proxies)
使用該方案socks5會導致DNS解析發生在客戶端上,而不是在代理服務器上,它使用該方案來決定是否在客戶端或代理上執行DNS解析。如果要解析代理服務器上的域,請使用socks5h該方案。
10、身份認證
如果訪問的網站需要身份認證的話,可以使用requests自帶的身份認證功能,其中包括四個類:
class requests.auth.AuthBase:所有auth實現派生自的基類
class requests.auth.HTTPBasicAuth(username, password):將HTTP基本認證附加到給定的請求對象
class requests.auth.HTTPProxyAuth(username, password):將HTTP代理身份驗證附加到給定的請求對象
class requests.auth.HTTPDigestAuth(username, password):將HTTP摘要式身份驗證附加到給定的請求對象
基本認證:
代碼示例:
import requests from requests.auth
import HTTPBasicAuth
url='http://192.168.146.140/admin/'
s=requests.Session()
auth=HTTPBasicAuth('admin','123') #創建密碼認證對象
response=s.get(url,auth=auth) #附加認證信息
print(response.text)
代理身份驗證:
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests from requests.auth
import HTTPProxyAuth
proauth=HTTPProxyAuth(username='admin',password='123')
proxies={ 'http':'10.0.0.10:3324' }
s=requests.Session() #創建session對象
s.trust_env=proauth #添加代理身份驗證
s.proxies=proxies #添加代理URL
response=s.get('https://www.facebook.com')
print(response.text)
11、編碼
當您收到響應時,請求會在您訪問Response.text屬性時猜測用於解碼響應的編碼。請求將首先檢查HTTP標頭中的編碼,如果不存在,將使用chardet通用字符編碼檢測器,來嘗試猜測編碼,如果沒有明確的字符集是存在於HTTP頭,並在Content-Type 頭中包含text。在這種情況下,RFC 2616指定默認字符集必須是ISO-8859-1。在這種情況下,請求遵循規範。如果你需要不同的編碼,你可以手動設置Response.encoding 屬性,或者使用原始的Response.content。
requests.utils.get_encodings_from_content(content):從給定的內容字符串返回編碼
requests.utils.get_encoding_from_headers(headers):從給定的HTTP標題字典返回編碼,headers頭文件字典,返回str
requests.utils.get_unicode_from_response(r):以unicode形式返回請求的內容,r是響應對象,返回str
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests from requests.utils
import get_encodings_from_content from requests.utils
import get_encoding_from_headers from requests.utils
import get_unicode_from_response
r=requests.get('http://cnblogs.com')
print(get_encodings_from_content(r.text)) #從內容中返回編碼
print(get_encoding_from_headers(r.headers)) #從頭文件中返回編碼
print(get_unicode_from_response(r)) #unicode返回請求內容
12、其他說明
(1)狀態碼
requests.codes 該codes對象定義了從http狀態中通過名稱映射的數字代碼的狀態碼,可以作爲屬性或字典訪問
代碼示例:
import requests
print(requests.codes['forbidden']) #403
print(requests.codes['ok']) #200
print(requests.codes['not_modified']) #304
print(requests.codes['not_found']) #404
print(requests.codes['internal_server_error']) #500
(2)超時設置
如果服務器沒有及時響應,大多數對外部服務器的請求應該附加一個超時值。默認情況下,除非顯式設置超時值,否則請求不會超時。如果沒有超時,您的代碼可能會掛起幾分鐘或更長時間。一旦你的客戶端連接到服務器併發送了HTTP請求, 讀取超時就是客戶端等待服務器發送響應的秒數
爲超時指定單個值,如下所示:
r = requests.get('https://github.com', timeout=5)
超時值將應用於 超時connect和read超時。如果您想單獨設置值,請指定一個元組:
r = requests.get('https://github.com', timeout=(3.05, 27))
如果遠程服務器速度非常慢,您可以通過將None作爲超時值,讓“請求”永久等待響應:
r = requests.get('https://github.com', timeout=None)
(3)流媒體請求
可以使用iter_content方法迭代獲取數據,或者使用iter_line(),但在構建請求是需要指定stream=True來返回流內容數據
代碼示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
r=requests.get('http://httpbin.org/stream/20',stream=True)
for i in r.iter_content(chunk_size=1024,decode_unicode=True):
if i:
print(json.loads(i.decode()))
更多關於requests使用請查看python官網中對於requests的說明。