文章目錄
- 寫在前面
- 爬蟲習慣
- web 網頁渲染方式
- 服務器渲染
- 客戶端渲染
- 反爬機制
- 使用session對象
- 使用cookie
- 讓請求頭信息更豐富
- 使用代理和隨機延遲
寫在前面
本文是對前兩篇文章所介紹的內容的補充,在了解前兩篇文章——《爬蟲入門與requests庫的使用》和《BeautifulSoup 庫的使用》,對python 爬蟲理論上的介紹后,再看本文,你將會有更加深刻的理解(大佬隨意🎉
)。
爬蟲習慣
在了解requests庫
和BeautifulSoup 庫
后,我們需要知道一些關于爬蟲開發習慣和原則,以此來應對網頁不同的渲染方式。
web 網頁渲染方式
首先,要知道一般情況,web網頁
會有兩種渲染方法:
- 服務器渲染:在服務器那邊,直接將
數據
與html頁面代碼
整合在一起,返回給瀏覽器-----在瀏覽器上的頁面源代碼
中能夠找到對應的數據。 - 客戶端渲染: 第一次請求服務器,只要一個
html
的骨架,第二次請求才會拿到對應的數據
,然后由客戶端(瀏覽器)將html
和數據
整合在一起,展示出來-----在瀏覽器上的頁面源代碼
中找不到對應的數據。
服務器渲染
其次,BeautifulSoup 庫
是用來處理爬取到的頁面源代碼(html
)的,若要爬取到網頁源代碼,就要知道其對應url
:
如上圖所示,紅框處不僅有url還有對應的參數信息
,以上方式適用于服務器渲染,即在頁面源代碼中找得到數據。
客戶端渲染
另外一種情況就是客戶端渲染,其依靠于瀏覽器抓包工具,如下圖:
若想要爬取到上述紅框
的數據,需要知道其對應的url,如下:
上圖中的url
后面也攜帶了參數,但是我們一般不看,因為不方便,我們一般采用如下方式查看參數:
最重要的原則是:以上兩個方式,
能直接爬取到數據,絕不爬取html頁面
!!!
反爬機制
一般的網站都會有反爬機制,當我們通過爬蟲進行爬取網站數據時,可能會觸發該網站的反爬機制,通常情況下,返回狀態碼<403>,就表明觸發了反爬機制,在反爬機制下,爬蟲是無法再繼續獲取數據的,必須要用戶親自登錄該網站才行,為此,我們必須盡可能地避免觸發網站的反爬機制,而避免的方法有以下幾種。
使用session對象
盡可能地使用Session(會話)對象來封裝爬蟲,而不是直接使用requests庫來封裝爬蟲。
Session(會話) 的主要作用:
- 自動管理Cookie
當我們訪問需要登錄的網站時,首次登錄后服務器會返回 Cookies
,后續請求需攜帶這些 Cookies
以維持登錄狀態。
而有了Session
后,Session
就可以自動保存和發送 Cookies
,無需手動處理。
session = requests.Session()
#創建一個持久化的會話對象# 向指定網址發送登錄請求(自動保存 Cookies)
session.post("https://example.com/login", data={"user": "admin", "pass": "123"})
# post——提交用戶名(user)和密碼(pass)等參數
# 用Session對象發送post登錄請求,Session對象可以自動接收并存儲服務器返回的Cookies# 后續請求通過Session對象發出,請求將自動攜帶 Cookies
response = session.get("https://example.com/dashboard")
- 持久化公共參數
當我們有多個請求都需要相同的 Headers
(請求頭)、超時時間
、認證信息
或代理
時,可以使用Session對象,一次性設置參數,所有通過 該Session對象
發起的請求自動繼承這些參數。
session = requests.Session() #創建一個session對象session.headers.update({"User-Agent": "My Crawler/1.0"})
# 向session對象中添加一個請求頭session.proxies = {"http": "http://10.10.1.10:3128"}
# 向session對象中添加一個代理# 所有請求自動攜帶 請求頭 和代理
session.get("https://example.com/page1")
session.get("https://example.com/page2")
- 復用 TCP 連接(性能優化)
當我們高頻次請求同一服務器時,重復建立和斷開 TCP 連接會浪費資源,這個時候,我們可以通過Session
對象來對TCP連接進行復用,通過復用連接,可以減少延遲并提升效率。
# 未使用 Session:每次請求新建連接
for _ in range(10):requests.get("https://example.com") # 10 次獨立連接# 使用 Session:復用同一連接(推薦使用)
with requests.Session() as session:for _ in range(10):session.get("https://example.com") # 更高效
4.保持請求上下文
某些網站會檢查請求的連貫性(如反爬機制),我們可以通過session對象
來模擬瀏覽器行為,保持一致的上下文(如Referer、Cookies)。
注意事項:
- 會話對象需合理關閉(推薦用
with
語句管理資源)。- 如果請求不同網站且無需共享參數,直接使用
requests.get()
更輕量
使用cookie
提前登錄你要爬取的網站,通過瀏覽器抓包,在你的登錄后的任意請求的請求頭中找到"cookie"
的字段或者在響應頭中找到"set-cookie"
字段,將cookie
復制到你的代碼中,作為爬蟲偽裝的請求頭的一部分。
- 如上圖,cookie的形式:
cookie名 = cookie值
,上圖紅框內有很多cookie
,有些是目標網站的,有些是第三方平臺的。這里面不是所有cookie
都必須需要,其核心的cookie
為dbcl2
+ck
(登錄相關)、bid
(反爬基礎)。 - 此外,cookie的獲取,還可以通過代碼來實現:
response.cookies
,該代碼作用是返回要爬取的網頁的所有的cookie
。
如上圖所示,只有一個cookie,cookie名為"bid"
,其值為tk6VyicFk4E
。
一般請求頭中有了
cookie
,服務器就會默認此請求是一個用戶發出的,而不是爬蟲。
讓請求頭信息更豐富
對于爬蟲偽裝的請求頭,信息要越豐富越好,一般必須有這兩個字段"referer"
和
"User-Agent"
,其余字段視情況判斷是否添加。
關于"User-Agent"
字段,可以使用 fake_useragent
庫生成隨機瀏覽器"User-Agent"
,這樣能夠增大繞開機制的可能。
from fake_useragent import UserAgent
import requestsua = UserAgent()
headers = {'User-Agent': ua.random} #隨機生成的UA
response = requests.get(url, headers=headers)
使用代理和隨機延遲
短時間高頻請求觸發會觸發網站對該 IP地址的封禁,因此,我們要控制訪問頻率。
import requests
import time
import randomproxies = {"http": "http://10.10.1.10:3128", # 假設此為有效代理"https": "http://10.10.1.10:1080",
}# 隨機延遲(1~3秒)
time.sleep(random.uniform(1, 3))response = requests.get(url, headers=headers, proxies=proxies)
注意:
- 以上,是一些常用的基本的繞開反爬機制的方法,但并不是全部,具體采用哪個方法,要根據你要爬取的網站的具體情況來判斷。
- 各個方法之間,也不是獨立的,可以相互配合使用,提高繞開反爬機制的可能。