爬蟲入門:從基礎到實戰全攻略

🧠?一、爬蟲基礎概念

1.1 爬蟲定義

  • 爬蟲(Web Crawler)是模擬瀏覽器行為,自動向服務器發送請求并獲取響應數據的一種程序。
  • 主要用于從網頁中提取結構化數據,供后續分析、展示或存儲使用。

1.2 爬蟲特點

  • 數據碎片化:網頁數據分散、不規則。
  • 模擬用戶行為:爬蟲需要盡可能模擬正常用戶的請求行為,以繞過反爬機制。
  • 目標明確:聚焦爬蟲有明確的目標網站與數據需求。

1.3 爬蟲分類

類型描述
通用爬蟲面向大量網站抓取數據,如搜索引擎使用的爬蟲
聚焦爬蟲有特定目標網站的數據采集任務

聚焦爬蟲細分:

  • 功能性爬蟲:不直接獲取數據,而是實現某些功能(如投票、搶票、短信轟炸等)
  • 數據增量爬蟲:持續獲取新數據用于分析,常見于新聞資訊、價格監控等領域

1.4 爬蟲流程

確認目標URL -> 發送請求 -> 獲取響應 -> 提取數據 -> 處理/保存數據↖_____________可能繼續解析新的URL__________________↙

1.5 Robots協議

  • 是一個約定俗成的協議文件(robots.txt),用于告知爬蟲哪些頁面可以訪問,哪些不能。
  • 并非強制性標準,但應尊重該協議以避免法律風險。

1.6 爬蟲的作用

  • 數據采集(電商價格、天氣預報、股票行情等)
  • 軟件測試(自動化測試接口)
  • 搶票、刷票、短信轟炸(需謹慎使用)
  • 網絡安全(漏洞掃描、安全檢測)

🔌?二、網絡通信原理

2.1 基本流程

  1. 瀏覽器輸入 URL(如?www.baidu.com
  2. DNS 解析域名,返回 IP 地址
  3. 客戶端(瀏覽器)通過 TCP/IP 協議連接服務器
  4. 發送 HTTP 請求
  5. 服務器處理請求并返回響應
  6. 客戶端接收響應并渲染頁面(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

屬性類型特點
.textstr自動解碼(可能亂碼)
.contentbytes原始字節流,適合下載圖片、視頻等二進制數據

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 池

  • 防止頻繁使用單一 UA 被封禁
  • 示例:
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 模塊

  • 用于手動進行 URL 編碼/解碼
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)

??十、注意事項與最佳實踐

  1. 遵守 robots.txt:避免非法抓取敏感數據。
  2. 設置請求間隔:使用?time.sleep()?防止頻繁請求。
  3. 使用代理 IP 池:提高穩定性與隱蔽性。
  4. 記錄日志:便于調試與追蹤問題。
  5. 異常處理:添加 try-except 捕獲網絡異常。
  6. 合理設置超時時間requests.get(timeout=5)
  7. 定期更新 User-Agent 池
  8. 關注網站結構變化:防止因頁面結構調整導致解析失敗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82540.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uni-app學習筆記二十一--pages.json中tabBar設置底部菜單項和圖標

如果應用是一個多 tab 應用,可以通過 tabBar 配置項指定一級導航欄,以及 tab 切換時顯示的對應頁。 在 pages.json 中提供 tabBar 配置,不僅僅是為了方便快速開發導航,更重要的是在App和小程序端提升性能。在這兩個平臺&#xff…

行業分析---小米汽車2025第一季度財報

1 背景 最近幾年是新能源汽車的淘汰賽,前短時間比亞迪再次開始了降價,導致一片上市車企的股價大跌,足見車圈現在的敏感度。因此筆者會一直跟蹤新勢力車企的財報狀況,對之前財報分析感興趣的讀者朋友可以參考以下博客:…

Python 解釋器安裝全攻略(適用于 Linux / Windows / macOS)

目錄 一、Windows安裝Python解釋器1.1 下載并安裝Python解釋1.2 測試安裝是否成功1.3 設置pip的國內鏡像------永久配置 二、macOS安裝Python解釋器三、Linux下安裝Python解釋器3.1 Rocky8.10/Rocky9.5安裝Python解釋器3.2 Ubuntu2204/Ubuntu2404安裝Python解釋器3.3 設置pip的…

考研系列—操作系統:沖刺筆記(1-3章)

目錄 第一章 計算機系統概述 1.基本概念 2.內核態和用戶態 3.中斷(外中斷)、異常(內中斷-與當前執行的) 4.系統調用 5.操作系統引導程序 2021年真題: 6.操作系統結構 大綱新增 (1)分層結構 (2)模塊化 (3)外核 7.虛擬機 第二章 進程管理 1.畫作業運行的順序和甘…

監控 100 臺服務器磁盤內存CPU利用率

監控 100 臺服務器磁盤,內存,CPU利用率腳本 以下是一個優化后的監控腳本,用于同時監控100臺服務器的磁盤、內存和CPU利用率,并支持并發執行以提高效率: #!/bin/bash # 服務器監控腳本 - 支持并發獲取100臺服務器系統指標 # 功能…

[5-02-04].第01節:Jmeter環境搭建:

JMeter筆記大綱 Jmeter依賴于JDK,所以必須確保當前計算機上已經安裝了JDK,并且配置了環境變量 一、JMeter概述: 1.1.JMeter是什么: JMeter是Appache組織使用java開發的一款測試工具 可以用于對服務器、網絡或對象模擬巨大的負載…

【獸醫處方專用軟件】佳易王獸醫電子處方軟件:高效智能的寵物診療管理方案

一、軟件概述與核心優勢 (一)試用版獲取方式 資源下載路徑:進入博主頭像主頁第一篇文章末尾,點擊卡片按鈕;或訪問左上角博客主頁,通過右側按鈕獲取詳細資料。 說明:下載文件為壓縮包&#xff…

MapReduce(期末速成版)

起初在B站看3分鐘的速成視頻,感覺很多細節沒聽懂。 具體例子解析(文件內容去重) 對于兩個輸入文件,即文件A 和文件B,請編寫MapReduce 程序,對兩個文件進行合并,并剔除 其中重復的內容,得到一個新的輸出文件…

Java高級 | 【實驗四】Springboot 獲取前端數據與返回Json數據

隸屬文章: Java高級 | (二十二)Java常用類庫-CSDN博客 系列文章: Java高級 | 【實驗一】Spring Boot安裝及測試 最新-CSDN博客 Java高級 | 【實驗二】Springboot 控制器類相關注解知識-CSDN博客 Java高級 | 【實驗三】Springboot …

從零打造AI面試系統全棧開發

🤖 AI面試系統開發完整教程 📋 項目概述 本教程將帶你從零開始構建一個完整的AI面試系統,包含前端、后端、AI集成和部署的全流程。 源碼地址 技術棧 前端: React TypeScript Vite Vaadin Components后端: Spring Boot Spring Securi…

【硬件】PCIe協議 | 電腦的高速公路

文章目錄 PCIe | 外圍設備高速互聯通道(peripheral component interconnect express)的核心概念和應用 基礎概念 1.1 電腦內的”高速“,連接CPU、顯卡、SSD(固態硬盤)等核心組件;數據傳輸速度極快&#xff…

【 Redis | 完結篇 緩存優化 】

前言:本節包含常見redis緩存問題,包含緩存一致性問題,緩存雪崩,緩存穿透,緩存擊穿問題及其解決方案 1. 緩存一致性 我們先看下目前企業用的最多的緩存模型。緩存的通用模型有三種: 緩存模型解釋Cache Asi…

MySQL訪問控制與賬號管理:原理、技術與最佳實踐

MySQL的安全體系建立在精細的訪問控制和賬號管理機制上。本文基于MySQL 9.3官方文檔,深入解析其核心原理、關鍵技術、實用技巧和行業最佳實踐。 一、訪問控制核心原理:雙重驗證機制 連接驗證 (Connection Verification) 客戶端發起連接時,MySQL依據user_name@host_name組合進…

Go語言爬蟲系列教程4:使用正則表達式解析HTML內容

Go語言爬蟲系列教程4:使用正則表達式解析HTML內容 正則表達式(Regular Expression,簡稱RegEx)是處理文本數據的利器。在網絡爬蟲中,我們經常需要從HTML頁面中提取特定的信息,正則表達式就像一個智能的&quo…

筆記 | docker構建失敗

筆記 | docker構建失敗 構建報錯LOG1 rootThinkPad-FLY:/mnt/e/02-docker/ubunutu-vm# docker build -t ubuntu16.04:v1 . [] Building 714.5s (6/11) docker:default> [internal] load …

CentOS 7.9 安裝 寶塔面板

在 CentOS 7.9 上安裝 寶塔面板(BT Panel) 的完整步驟如下: 1. 準備工作 系統要求: CentOS 7.x(推薦 7.9)內存 ≥ 1GB(建議 2GB)硬盤 ≥ 20GBroot 權限(需使用 root 用戶…

第 86 場周賽:矩陣中的幻方、鑰匙和房間、將數組拆分成斐波那契序列、猜猜這個單詞

Q1、[中等] 矩陣中的幻方 1、題目描述 3 x 3 的幻方是一個填充有 從 1 到 9 的不同數字的 3 x 3 矩陣,其中每行,每列以及兩條對角線上的各數之和都相等。 給定一個由整數組成的row x col 的 grid,其中有多少個 3 3 的 “幻方” 子矩陣&am…

【AI News | 20250604】每日AI進展

AI Repos 1、jaaz Jaaz是一款免費開源的AI設計代理,作為Lovart的本地替代品,它能實現圖像、海報、故事板的設計、編輯和生成。Jaaz集成了LLM,可智能生成提示并批量生成圖像,支持Ollama、Stable Diffusion等本地及API模型。用戶可…

Docker load 后鏡像名稱為空問題的解決方案

在使用 docker load命令從存檔文件中加載Docker鏡像時,有時會遇到鏡像名稱為空的情況。這種情況通常是由于在保存鏡像時未正確標記鏡像名稱和標簽,或者在加載鏡像時出現了意外情況。本文將介紹如何診斷和解決這一問題。 一、問題描述 當使用 docker lo…

SQL進階之旅 Day 14:數據透視與行列轉換技巧

【SQL進階之旅 Day 14】數據透視與行列轉換技巧 開篇 歡迎來到“SQL進階之旅”系列的第14天!今天我們將探討數據透視與行列轉換技巧,這是數據分析和報表生成中的核心技能。無論你是數據庫開發工程師、數據分析師還是后端開發人員,行轉列或列…