🧠?一、爬蟲基礎概念
1.1 爬蟲定義
- 爬蟲(Web Crawler)是模擬瀏覽器行為,自動向服務器發送請求并獲取響應數據的一種程序。
- 主要用于從網頁中提取結構化數據,供后續分析、展示或存儲使用。
1.2 爬蟲特點
- 數據碎片化:網頁數據分散、不規則。
- 模擬用戶行為:爬蟲需要盡可能模擬正常用戶的請求行為,以繞過反爬機制。
- 目標明確:聚焦爬蟲有明確的目標網站與數據需求。
1.3 爬蟲分類
類型 | 描述 |
---|
通用爬蟲 | 面向大量網站抓取數據,如搜索引擎使用的爬蟲 |
聚焦爬蟲 | 有特定目標網站的數據采集任務 |
聚焦爬蟲細分:
- 功能性爬蟲:不直接獲取數據,而是實現某些功能(如投票、搶票、短信轟炸等)
- 數據增量爬蟲:持續獲取新數據用于分析,常見于新聞資訊、價格監控等領域
1.4 爬蟲流程
確認目標URL -> 發送請求 -> 獲取響應 -> 提取數據 -> 處理/保存數據↖_____________可能繼續解析新的URL__________________↙
1.5 Robots協議
- 是一個約定俗成的協議文件(
robots.txt
),用于告知爬蟲哪些頁面可以訪問,哪些不能。 - 并非強制性標準,但應尊重該協議以避免法律風險。
1.6 爬蟲的作用
- 數據采集(電商價格、天氣預報、股票行情等)
- 軟件測試(自動化測試接口)
- 搶票、刷票、短信轟炸(需謹慎使用)
- 網絡安全(漏洞掃描、安全檢測)
🔌?二、網絡通信原理
2.1 基本流程
- 瀏覽器輸入 URL(如?
www.baidu.com
) - DNS 解析域名,返回 IP 地址
- 客戶端(瀏覽器)通過 TCP/IP 協議連接服務器
- 發送 HTTP 請求
- 服務器處理請求并返回響應
- 客戶端接收響應并渲染頁面(HTML/CSS/JS)
2.2 URL 統一資源定位符
- 示例:
https://www.baidu.com/s?wd=搜索詞
- 結構:
- 協議(http/https)
- 域名(主機名)
- 端口(默認80或443)
- 路徑(路徑+查詢參數)
2.3 請求方法(HTTP Methods)
方法 | 描述 |
---|
GET | 請求獲取資源,參數在URL中 |
POST | 提交數據給服務器,參數在請求體中 |
PUT | 更新資源 |
DELETE | 刪除資源 |
2.4 請求組成
- 請求行(Method + Path + HTTP Version)
- 請求頭(Headers)
- 請求體(Body,僅POST/PUT等有)
2.5 響應狀態碼
狀態碼 | 描述 | 備注 |
---|
200 | 請求成功 | 表示服務器已成功處理了請求,并返回請求的數據。 |
302 | 臨時重定向 | 服務器要求客戶端執行臨時重定向(原始為GET請求),新的URL位于響應頭中的?Location ?字段。 |
303 | 查看其他位置 | 對于 POST 請求的響應,瀏覽器會自動重定向至新的 URL,該新地址位于?Location ?中。 |
307 | 臨時重定向 (GET) | 類似于 302,但明確指示 GET 請求應保持原樣,不改變為 POST 或其他方法。 |
403 | 禁止訪問 | 服務器理解請求,但拒絕執行它。可能是由于權限不足或被封禁 IP。 |
404 | 找不到頁面 | 服務器找不到與請求 URI 相匹配的任何資源。 |
500 | 內部服務器錯誤 | 服務器遇到意外情況,無法完成請求。 |
503 | 服務不可用 | 通常是因為服務器正在進行維護或過載。可能會在響應中攜帶?Retry-After ?頭來提示客戶端何時可以再次嘗試連接。 |
📡?三、HTTP & HTTPS 協議詳解
3.1 HTTP 協議
- 超文本傳輸協議,默認端口:80
- 明文傳輸,易被監聽或篡改
3.2 HTTPS 協議
- HTTP + SSL/TLS 加密層,默認端口:443
- 更安全,防止中間人攻擊
- 性能略低于 HTTP
3.3 SSL/TLS 的作用
- 數據加密:保證傳輸過程中的隱私
- 身份驗證:確保客戶端連接的是正確的服務器
🕵??♂??四、瀏覽器開發者工具(F12)
4.1 使用 F12 查看請求信息
- 打開“開發者工具” → Network(網絡)面板
- 可查看:
- 請求 URL
- 請求方法(GET/POST)
- 請求頭(Headers)
- 請求體(Body)
- 響應數據(Response)
- 響應狀態碼(Status Code)
4.2 注意事項
- 實際響應數據才是判斷依據,不要依賴 Elements 中的 HTML 渲染結果。
- 有些數據由 JavaScript 動態加載,需查看 XHR/Fetch 請求。
📦?五、Requests 模塊詳解
5.1 requests 模塊介紹
- Python 第三方庫,用于發送 HTTP 請求
- 支持 GET、POST、PUT、DELETE 等多種方法
- 安裝命令:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
5.2 常用方法
import requestsurl = "https://www.baidu.com"
response = requests.get(url)print(response.status_code) # 響應狀態碼
print(response.text) # 響應文本(str類型)
print(response.content) # 響應字節流(bytes類型)
print(response.headers) # 響應頭
print(response.url) # 最終請求的URL(可能重定向)
5.3 response.text vs response.content
屬性 | 類型 | 特點 |
---|
.text | str | 自動解碼(可能亂碼) |
.content | bytes | 原始字節流,適合下載圖片、視頻等二進制數據 |
5.4 設置編碼格式
response.encoding = 'utf-8' # 手動指定解碼方式
5.5 下載圖片示例
url = "https://example.com/image.jpg"
res = requests.get(url)
with open("image.jpg", "wb") as f:f.write(res.content)
🧪?六、User-Agent 和 Headers 設置
6.1 User-Agent 概述
- 標識客戶端身份(瀏覽器型號、操作系統等)
- 服務器會根據 UA 判斷是否為合法瀏覽器
- 如果 UA 不合法,可能被識別為爬蟲,返回 403 或 503 錯誤
6.2 構建請求頭
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
response = requests.get(url, headers=headers)
6.3 構建 User-Agent 池
user_agents = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...","Mozilla/5.0 (iPad; CPU OS 16_6 like Mac OS X)...",...
]
import random
headers = {"User-Agent": random.choice(user_agents)}
6.4 使用 fake_useragent 庫
pip install fake_useragent -i https://pypi.tuna.tsinghua.edu.cn/simple
from fake_useragent import UserAgent
ua = UserAgent()
headers = {"User-Agent": ua.random}
🌐?七、帶參數請求(GET)
7.1 參數傳遞方式
- URL 編碼參數(GET 請求)
- 表單數據(POST 請求)
元素 | 說明 |
---|
鍵(Key) | 參數名稱,如?q ,?form |
值(Value) | 對應的參數值,如?學習 ,?QBLH |
分隔符 | 使用?= ?連接鍵與值,多個參數之間使用?& ?分隔 |
7.2 URL 參數傳參
params = {"q": "學習"}
response = requests.get("https://cn.bing.com/search", params=params)
7.3 urllib.parse 模塊
from urllib.parse import quote, unquoteprint(quote("學習")) # 輸出:%E5%AD%A6%E4%B9%A0
print(unquote("%E5%AD%A6%E4%B9%A0")) # 輸出:學習
🛡??八、反爬機制與應對策略
8.1 常見反爬手段
類型 | 描述 |
---|
IP 封鎖 | 識別頻繁訪問的IP地址 |
UA 識別 | 檢查 User-Agent 是否異常 |
Cookie 限制 | 登錄后才可訪問 |
JS 渲染限制 | 數據由 JavaScript 異步加載 |
CAPTCHA 驗證 | 圖形驗證碼攔截爬蟲 |
請求頻率控制 | 單位時間內請求數量限制 |
8.2 反反爬策略
方法 | 描述 |
---|
使用代理IP池 | 避免固定IP被封鎖 |
隨機 User-Agent | 模擬不同瀏覽器 |
添加 Referer | 模擬從其他頁面跳轉而來 |
設置延遲 | 控制請求頻率(time.sleep()) |
使用 Selenium | 模擬瀏覽器操作動態網頁 |
使用 Headless 瀏覽器 | 如 Puppeteer、Playwright |
📌?九、實戰案例:構建簡單搜索引擎爬蟲
import requests
from fake_useragent import UserAgent
from urllib.parse import quoteua = UserAgent()
headers = {"User-Agent": ua.random}keyword = input("請輸入你要搜索的內容:")
encoded_kw = quote(keyword)
url = "https://cn.bing.com/search"
params = {"q": encoded_kw}response = requests.get(url, headers=headers, params=params)
print(response.text)
??十、注意事項與最佳實踐
- 遵守 robots.txt:避免非法抓取敏感數據。
- 設置請求間隔:使用?
time.sleep()
?防止頻繁請求。 - 使用代理 IP 池:提高穩定性與隱蔽性。
- 記錄日志:便于調試與追蹤問題。
- 異常處理:添加 try-except 捕獲網絡異常。
- 合理設置超時時間:
requests.get(timeout=5)
- 定期更新 User-Agent 池
- 關注網站結構變化:防止因頁面結構調整導致解析失敗