1. 程式人生 > >Requests庫函式的學習(玩轉python網路爬蟲)

Requests庫函式的學習(玩轉python網路爬蟲)

一、請求方式

HTTP常用的請求方式是GET和POST,Requests對此區分兩種不同的請求方式。

(1)GET請求

Requests的GET請求分為兩種:不帶引數和帶引數。判斷URL是否帶有引數,通過對“?”進行判斷,“?”表示帶有引數。

import requests
# 第一種方法
r = requests.get('https://www.baidu.com/s?wd=python')
# 第二種方法
url = 'https://www.baidu.com/s'
# params表示GET請求中的引數
params = {'wd': 'python'}
r = requests.get(url,params = params)
print(r.url)

兩種方法都表示請求同一URL,實際開發選擇第一種方法,因為不僅程式碼簡單,而且如果引數動態變化,那麼可以使用字串格式對URL動態設定,比如:'https://www.baidu.com/s?wd=%s'%('python')。

(2)POST請求

POST請求就是提交表單,表單的資料內容就是POST的請求引數,Requests實現POST請求需設定請求引數data,資料格式可以是字典,元組,列表,JSON格式。

# 字典型別
data = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}
# 元組或列表
(('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3'))
# JSON
import json
# 將字典轉化為JSON
data = json.dumps(data)
# 傳送POST請求
import requests
# data是POST方法的請求引數
r = requests.post('https://www.baidu.com/', data=data)
print(r.text)

Requests的GET和POST方法的請求引數分別是params和data。

(3)response(響應物件)

當向網站傳送請求時,網站會返回相應的響應物件,包含伺服器響應的資訊。

Requests提供以下方法響應內容:

r.status_code:響應狀態碼

r.raw:原始響應體,使用r.raw.read()讀取

r.content:位元組方式的響應體,需要進行解碼。

r.text:字串方式的響應體。

r.header:以字典物件儲存伺服器響應頭。

r.json:Requsts內建的JSON解碼器。

r.raise_for_status():請求失敗(非200響應),丟擲異常。

r.url:獲取請求連結。

r.cookies:獲取請求後的cookies。

r.encoding:獲取編碼格式。

二、複雜的請求方式

(1)新增請求頭(headers)

import requests
headers = {
    'content-type': 'application/json',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2473.400'
}
requests.get('http://www.baidu.com/', headers=headers)

(2)使用代理IP(proxies)

import requests
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'https://10.10.1.10:1080'
}
requests.get('http://www.baidu.com/', proxies=proxies)

(3)證書驗證(verify)

通常設定關閉驗證。

import requests
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
# 關閉證書驗證
r = requests.get(url, verify=False)
print(r.status_code)
# 開始證書驗證
# r = requests.get(url, verify=True)
# 設定證書路徑
# r = requests.get(url, verify='/path/to/certfile')

(4)設定超時時間(timeout)

傳送請求後超出設定的時間便會停止等待響應,如果伺服器在該時間之內沒有響應就會導致異常。

import requests
# GET請求
requests.get('http://www.baidu.com/', timeout=0.001)
# POST請求
requests.post('http://www.baidu.com/', timeout=0.001)

(5)標識識別身份(Cookies)

import requests
url = 'https://static.zhihu.com/heifetz/vendor.995451a211dcf23e7059.js'
temp_cookies = '_zap=e6bcb677-f710-4bf1-8ceb-de51e97415c9; _xsrf=685f3baf-45be-43b4-8f32-02de3367b5e5; d_c0="AEDkwu2GVA6PThq56D3xIo2-6W-daZoS90s=|1538970683"; q_c1=185fcb11f0f7429eaba419368a2f4b7e|1538970685000|1538970685000; l_n_c=1; n_c=1; l_cap_id="Y2E3MGY5ZTdhZWFiNDE0ZjkzMmQ0MTQzOGM1YWExM2Y=|1539332192|46faa5b9406b718f99e6c369465bccbde3cc5ba9"; r_cap_id="ZWEwODQwMTkyMGM0NDE1N2E3YWFhNDI5ZTZmOTE5NmU=|1539332192|405231c0a71396732f27d6a4368c78c0f7bb86cb"; cap_id="YjAxNGUzN2M1MzFjNDhjNWE4M2UyZjg3MDBkNWJiNWY=|1539332192|4758bc5f5a4678861d6990b9dd2dc86bb2812364"; tgw_l7_route=5bcc9ffea0388b69e77c21c0b42555fe'
cookies_dict = {}
for i in temp_cookies.split(';'):
    value = i.split('=')
    cookies_dict[value[0]] = value[1]
r = requests.get(url, cookies=cookies_dict)
print(r.text)

當程式傳送請求時,自動生成一個RequestsCookieJar物件,用於存放Cookies物件。

requests.utils.dict_from_cookiesjar()方法提供RequestsCookieJar轉化為字典。

requests.utils.cookiesjar_from_dict()方法提供字典轉化為RequestsCookieJar。