Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。
Requests 允許你發送純天然,植物飼養的 HTTP/1.1 請求,無需手工勞動。你不需要手動爲 URL 添加查詢字串,也不需要對 POST 數據進行表單編碼。Keep-alive 和 HTTP 連接池的功能是 100% 自動化的,一切動力都來自於根植在 Requests 內部的 urllib3。以上內容來自Requests官網文檔
注:requests庫發送請求以後,並不會執行js代碼,這需要我們自己分析目標站點然後發起新的request請求。
目錄
一、安裝Requests
pip install requests
二、六種請求方式(post和get最常見)
requests.get('you url') # GET請求
requests.post('you url') # POST請求
requests.put('you url') # PUT請求
requests.delete('you url') # DELETE請求
requests.head('you url') # HEAD請求
requests.options('you url') # OPTIONS請求
import requests
r = requests.get('https://www.baidu.com/') # 發起get請求
# r = requests.request(method='get',url='https://www.baidu.com/') # 另一種寫法,和上邊效果一樣
# r = requests.post('you url',data={'key':'value'}) # 發起post請求(發送字典)
# r = requests.post('you url',data=json.dumps({'key':'value'})) # 發起post請求(發送json)
# r = requests,request(method='post',url='you url',data={'key':'value'}) # 另一種寫法
# r = requests,request(method='post',url='you url',data=json.dumps({'key':'value'})) # 另一種寫法
print(r) # 打印結果爲狀態碼,<Response [200]>表示請求成功
三、Requests參數詳情
1、添加headers(請求頭)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
response = requests.get("http://www.baidu.com/", headers=headers)
print(response) # 返回結果爲<Response [200]>說明請求成功
2、添加params(給url添加參數)
import requests
kw = {'wd':'python'}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
print(response) # 返回結果爲<Response [200]>說明請求成功
3、添加proxies(代理)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
# {'類型':'ip:端口'}
proxies = {
'http':'106.110.212.206:9999'
}
# 如果代理需要使用HTTP Basic Auth,可以使用下面這種格式:
#proxy = { "http": "mr_mao_hacker:[email protected]:9999" }
response = requests.get("http://www.baidu.com/", headers=headers, proxies = proxies)
print(response) # 返回結果爲<Response [200]>說明請求成功
代理IP可以在免費的網站上獲取:西刺代理,大家都懂,免費的質量上不是很樂觀,測試還是沒問題的,可以多試幾個。
4、添加data(post請求)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
data = {
"key":"value"
}
response = requests.post("you url", data = data, headers = headers)
print(response)
5、添加auth(Web客戶端驗證)
import requests
auth = ('test', '123456')
response = requests.get('you url', auth=auth)
print(response) # 返回結果爲<Response [200]>說明請求成功
6、設置超時時間
import requests
response = requests.get('url',timeout=10) #設置秒數超時,僅對於連接有效
7、添加verify(跳過證書驗證)
例如這樣的頁面就可以使用verify
了
程序會報錯:SSLError: (“bad handshake: Error([(‘SSL routines’, ‘ssl3_get_server_certificate’, ‘certificate verify failed’)],)”,)
import requests
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)
print(response) # 返回結果爲<Response [200]>說明請求成功
四、獲取響應的內容
response.encoding # 獲取當前的編碼
response.encoding = 'utf-8' # 設置編碼
response.text # 以encoding解析返回內容。字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼。
response.content # 以字節形式(二進制)返回。字節方式的響應體,會自動爲你解碼 gzip 和 deflate 壓縮。
response.headers # 以字典對象存儲服務器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
response.status_code # 響應狀態碼
response.raw # 返回原始響應體,也就是 urllib 的 response 對象,使用 r.raw.read()
response.ok # 查看r.ok的布爾值便可以知道是否登陸成功
#*特殊方法*#
response.json() # Requests中內置的JSON解碼器,以json形式返回,前提返回的內容確保是json格式的,不然解析出錯會拋異常
response.raise_for_status() # 失敗請求(非200響應)拋出異常
response.cookies # 返回cookie
response.history # 返回重定向信息,當然可以在請求是加上allow_redirects = false 阻止重定向
import requests
response = requests.get('https://www.baidu.com/') # 發起get請求
print('當前的編碼:',r.encoding)
response.encoding = 'utf-8' #設置編碼
print('設置後的編碼:',response.encoding)
print('以encoding解析返回內容:',response.text)
print('以字節形式(二進制)返回:',response.content)
print('響應頭:',response.headers)
print('響應狀態碼:',response.status_code)
print('返回原始響應體:',response.raw)
print('是否登陸成功:',response.ok)
# print('以json形式返回:',response.json()) #確保返回的內容是json格式的,不然解析出錯會拋異常
print('失敗請求拋出異常:',response.raise_for_status())
print('結果爲狀態碼',response)
print('cookie:',response.cookies)
print('重定向信息:',response.history)
# 運行結果
當前的編碼: ISO-8859-1
設置後的編碼: utf-8
以encoding解析返回內容: <!DOCTYPE html><!--STATUS OK--><html> <head>...太多了,略一部分
以字節形式(二進制)返回: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head>...太多了,略一部分
響應頭: {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 09 Jan 2020 03:31:29 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
響應狀態碼: 200
返回原始響應體: <urllib3.response.HTTPResponse object at 0x000001A9337809B0>
是否登陸成功: True
失敗請求拋出異常: None
結果爲狀態碼 <Response [200]>
cookie: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
重定向信息: []
五、定製cookie信息
import requests
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'}
cookie = {'key':'value'}
response = requests.get('your url',headers=header,cookies=cookie)
六、操作Sission實現人人網登錄
import requests
# 1. 創建session對象,可以保存Cookie值
ssion = requests.session()
# 2. 處理 headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}
# 3. 需要登錄的用戶名和密碼
data = {"email": "用戶名", "password": "密碼"}
# 4. 發送附帶用戶名和密碼的請求,並獲取登錄後的Cookie值,保存在ssion裏
ssion.post("http://www.renren.com/PLogin.do", data=data)
# 5. ssion包含用戶登錄後的Cookie值,可以直接訪問那些登錄後纔可以訪問的頁面
response = ssion.get("http://www.renren.com/410043129/profile")
# 6. 打印響應內容
print(response.text)
七、會話對象,能夠跨請求保持某些參數
import requests
s = requests.Session()
s.auth = ('user','pwd')
s.headers = {'key':'value'}
r = s.get('you url1')
r1 = s.get('you url2')