寫在前面的話:
在學習爬蟲入門時,會常用到requests模塊,熟悉這個模塊的使用需要熟悉http,https ,及瀏覽器的請求原理。初次接觸爬蟲時了解下,掌握瀏覽器的請求過程和爬蟲的本質,學起來就輕松多啦。
什么時候用get / post ?
# get response = requests.get(url, headers=headers) # get 帶參數 requests.get(url, params=kw , headers=headers) # post response = requests.post(url, data=data, headers=headers)
# get 請求放在請求頭里,有請求頭 請求行 沒請求體
# post 請求頭 請求行 請求體
一、requests模塊發送簡單的請求、獲取響應
需求:通過requests向百度首頁發送請求,獲取百度首頁的數據
response = requests.get(url)
response的常用屬性:
-
response.text ----獲取響應體的二進制內容編碼后的內容 即str
-
respones.content ----獲取響應體的二進制內容,即bytes (二進制字節字符串)
-
response.status_code
-
response.request.headers ----根據響應獲取請求的headers
-
response.headers ----響應的headers
-
response.url ------響應的url
-
response.request.url ------根據響應獲取請求的url
注意:response.text 和response.content的區別
-
response.text
-
類型:str
-
解碼類型: 根據HTTP 頭部對響應的編碼作出有根據的推測,推測的文本編碼; 可能出現亂碼情況
-
如何修改編碼方式:指定 response.encoding=”utf-8”
-
或
-
指定 response.encoding='gbk' (ubuntu環境下的linux系統)
-
response.content
-
類型:bytes (二進制字節字符串)
-
解碼類型: 沒有指定
-
如何修改編碼方式:response.content.deocde(“utf8”) 默認utf-8
使用requests模塊發送帶headers的請求 ***
headers形式的字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
為什么請求時要帶上header?
模擬用戶操作,迷惑瀏覽器
用法
requests.get(url,headers=headers)
使用requests模塊
發送帶參數的請求 ****
參數的形式:字典
kw = {'wd':'長城'}
用法
requests.get(url,params=kw)
代理:

如果使用HTTPS代理 參數記得加上verify=False,因為https是一種加密傳輸、身份認證的網絡協議
verify=False 表示對證書的有效性不作驗證
二 、requests模塊處理(攜帶)cookie請求的3種方式
第1種:使用session類
-
requests 提供了一個叫做session類,來實現客戶端和服務端的會話保持
-
會話保持有兩個內涵:
- 保存cookie 在session中
- 實現和服務端的長連接
-
使用方法:
# 創建 session實例 # get請求 session = requests.session() response = session.get(url,headers) # post請求 session = requests.session() response = session.post(post_url, data=post_data , headers=headers)
session實例在請求了一個網站后,對方服務器設置在本地的cookie會保存在session中,下一次再使用session請求對方服務器的時候,會帶上前一次的cookie
第2種:把cookie放在headers中
注意:cookie有過期時間

在這個位置放置的cookie以鍵值對的形式,以 ;加一個空格 隔開
第3種 :使用cookies參數有2種方式
3.1 第一種
- cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}
- 使用方法:
- 把cookie字典交給cookies 來處理
requests.get(url,headers=headers,cookies=cookie_dict}
字典推導式
>>> {i:i+10 for i in range(10)} {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19} >>> {i:i+10 for i in range(10) if i%2 == 0} {0: 10, 2: 12, 4: 14, 6: 16, 8: 18}
# 准備cookie形式的字典 # cookie_dict = { i for i in cookie.spilt("; " )} cookie_dict = {i.split("=")[0]: i.split("=")[1] for i in cookie.split("; ")} response = requests.get(url, headers=headers, cookies=cookie_dict)
3.2 第二種 requests.utils.dict_from_cookiejar:把cookiejar對象轉化為字典
# coding="utf-8" import requests url = "http://www.baidu.com" response = requests.get(url) print(type(response.cookies)) ---輸出結果如下: ---<class 'requests.cookies.RequestsCookieJar'> # 把cookiejar對象轉化為字典 cookies = requests.utils.dict_from_cookiejar(response.cookies) print(cookies) ---輸出結果如下: ---{'BDORZ': '27315'}
超時參數的使用
第1種方式:timeout
response = requests.get(url,timeout=3)
第二種方式:retrying 模塊的使用 ----比timeout更好用,在代碼中可以實現刷新
from retrying import retry @retry(stop_max_attempt_number=3) # 最大嘗試連接次數 def _parse_url(url): """加上一個下划線表示該方法僅能在當前模塊內使用""" # print("-----------") response = requests.get(url, headers=headers, timeout=3) assert response.status_code == 200 return response