最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最新Python爬蟲從入門到精通:靜態(tài)爬取+JS逆向+反爬繞過實戰(zhàn)教程

 更新時間:2026年04月11日 10:04:57   作者:編程實戰(zhàn)派  
本文從零基礎(chǔ)出發(fā),系統(tǒng)講解Python爬蟲的靜態(tài)抓取、動態(tài)接口分析、JS逆向破解加密參數(shù)、反爬繞過(IP代理、Cookie維持、延時控制)及數(shù)據(jù)存儲,包含完整可運行代碼、抓包技巧、簽名算法還原、常見報錯解決方案,幫助讀者真正實現(xiàn)從入門到精通

前言

在大數(shù)據(jù)時代,數(shù)據(jù)采集是數(shù)據(jù)分析、人工智能、商業(yè)決策的基礎(chǔ)環(huán)節(jié)。Python 憑借簡潔的語法、豐富的第三方庫,成為爬蟲開發(fā)的首選語言。但對于大多數(shù)初學(xué)者而言,往往停留在靜態(tài)網(wǎng)頁爬取階段,面對當(dāng)下網(wǎng)站普遍存在的異步加載、參數(shù)加密、IP 限制、簽名校驗等反爬機(jī)制時,常常束手無策。

小知識:據(jù)調(diào)研,目前超過85%的主流網(wǎng)站采用了至少一種反爬手段,其中動態(tài)接口和參數(shù)加密占比最高。這意味著掌握逆向爬蟲技術(shù)已成為爬蟲工程師的核心競爭力。

本文將以真實網(wǎng)站數(shù)據(jù)爬取 為實戰(zhàn)目標(biāo),遵循「零基礎(chǔ)入門 → 環(huán)境搭建 → 靜態(tài)爬取 → 動態(tài)接口分析 → JS 逆向加密 → 完整爬蟲實現(xiàn) → 反爬繞過 → 數(shù)據(jù)存儲」的完整路徑,由淺入深、從理論到實戰(zhàn),帶你真正實現(xiàn) Python 爬蟲從入門到精通。全文包含詳細(xì)原理、逐行注釋代碼、常見報錯解決方案,可直接復(fù)制運行,兼顧新手入門與進(jìn)階提升。

重要聲明 :本文僅用于網(wǎng)絡(luò)爬蟲技術(shù)學(xué)習(xí)與交流,嚴(yán)格遵守《網(wǎng)絡(luò)安全法》《數(shù)據(jù)安全法》等法律法規(guī),遵守網(wǎng)站 robots 協(xié)議。嚴(yán)禁將本文技術(shù)用于非法爬取、商業(yè)牟利、侵犯他人數(shù)據(jù)權(quán)益、破壞網(wǎng)站正常運行等違法違規(guī)行為,一切違規(guī)使用后果自負(fù)。

一、爬蟲前置基礎(chǔ)認(rèn)知

1.1 什么是網(wǎng)絡(luò)爬蟲

網(wǎng)絡(luò)爬蟲又稱為網(wǎng)頁蜘蛛、網(wǎng)絡(luò)機(jī)器人,是一種按照一定規(guī)則,自動抓取互聯(lián)網(wǎng)信息的程序或腳本。簡單來說,就是模擬瀏覽器發(fā)送請求,獲取網(wǎng)頁數(shù)據(jù)并進(jìn)行提取、清洗、存儲的自動化工具。

爬蟲工作的三個核心步驟
1. 請求發(fā)送:構(gòu)造HTTP請求(URL、請求頭、請求體等),向目標(biāo)服務(wù)器發(fā)起訪問。
2. 數(shù)據(jù)獲取:接收服務(wù)器返回的響應(yīng)(HTML、JSON、XML、圖片等二進(jìn)制數(shù)據(jù))。
3. 解析與存儲:從響應(yīng)中提取所需字段,經(jīng)過清洗、去重、結(jié)構(gòu)化后存入文件或數(shù)據(jù)庫。

1.2 爬蟲能做什么

  • 數(shù)據(jù)采集:新聞資訊、商品價格、行業(yè)數(shù)據(jù)、論壇帖子等;
  • 數(shù)據(jù)分析:為機(jī)器學(xué)習(xí)、深度學(xué)習(xí)提供數(shù)據(jù)集;
  • 自動化辦公:批量下載文件、自動填報、自動抓取報表;
  • 行業(yè)監(jiān)測:競品數(shù)據(jù)跟蹤、輿情監(jiān)控、價格監(jiān)控;
  • 搜索引擎:百度、谷歌等均依靠大規(guī)模爬蟲實現(xiàn)數(shù)據(jù)收錄。

實戰(zhàn)案例:某電商價格監(jiān)控爬蟲每天定時抓取競品SKU價格,當(dāng)價格低于閾值時自動發(fā)送郵件通知采購團(tuán)隊,幫助企業(yè)在雙11前調(diào)整定價策略,單月節(jié)省成本超20萬元。

1.3 爬蟲分類

類型原理適用場景技術(shù)棧難度
靜態(tài)爬蟲直接解析HTML源碼無異步、無加密的舊式網(wǎng)站requests + BeautifulSoup★☆☆☆☆
動態(tài)爬蟲分析Ajax/Fetch接口,模擬請求數(shù)據(jù)通過JSON接口返回,但無加密或弱加密requests + json + 抓包分析★★★☆☆
逆向爬蟲破解前端JS加密、簽名算法接口參數(shù)加密、響應(yīng)密文、防重放機(jī)制js2py、PyExecJS、Node.js★★★★☆
模擬瀏覽器爬蟲驅(qū)動真實瀏覽器執(zhí)行頁面交互復(fù)雜、需執(zhí)行JS、繞過簡單反爬Selenium、Playwright★★☆☆☆

專家建議:不要一上來就使用模擬瀏覽器(Selenium),它雖然簡單但資源消耗大、速度慢,且容易被高級反爬(如指紋檢測)識別。優(yōu)先嘗試接口分析+逆向,實在無法破解時再考慮模擬瀏覽器。

1.4 必須了解的 HTTP 基礎(chǔ)

  • 請求方法:GET(獲取數(shù)據(jù))、POST(提交數(shù)據(jù))、PUT(更新)、DELETE(刪除)
  • 請求頭:User-Agent、Referer、Origin、Cookie 等校驗信息
  • 響應(yīng)狀態(tài)碼:200 成功、301/302 重定向、403 禁止訪問、404 頁面不存在、500 服務(wù)器錯誤、503 服務(wù)不可用
  • 常見數(shù)據(jù)格式:HTML、JSON、XML、密文數(shù)據(jù)

狀態(tài)碼詳解
- 200 OK:請求成功,正常返回數(shù)據(jù)。
- 301 Moved Permanently / 302 Found:資源臨時或永久轉(zhuǎn)移,爬蟲應(yīng)跟隨Location頭。
- 403 Forbidden:服務(wù)器理解請求但拒絕執(zhí)行,通常是因為缺少合法Cookie、簽名錯誤或IP被封。
- 429 Too Many Requests:請求頻率過高,被限流,需要降低頻率或使用代理。
- 5xx:服務(wù)器內(nèi)部錯誤,可能是反爬機(jī)制觸發(fā)或真實故障,建議延時后重試。

二、開發(fā)環(huán)境完整搭建

2.1 Python 環(huán)境安裝

推薦使用 Python 3.8~3.11 版本,兼容絕大多數(shù)爬蟲庫,避免版本過高導(dǎo)致庫不支持。安裝時勾選 Add Python to PATH,自動配置環(huán)境變量。

虛擬環(huán)境建議(避免庫版本沖突):

# 創(chuàng)建虛擬環(huán)境
python -m venv spider_env
# 激活(Windows)
spider_env\Scripts\activate
# 激活(Mac/Linux)
source spider_env/bin/activate

驗證安裝:

 

python --version
pip --version

2.2 爬蟲核心第三方庫安裝

打開 CMD 執(zhí)行以下命令,使用清華鏡像加速安裝:

 

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install beautifulsoup4 lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyexecjs -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install fake-useragent -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

各庫用途一覽
| 庫名 | 用途 | 備注 |
|------|------|------|
| requests | 發(fā)送HTTP請求,獲取響應(yīng) | 最常用的網(wǎng)絡(luò)請求庫 |
| beautifulsoup4 | 解析HTML/XML,提取數(shù)據(jù) | 適合靜態(tài)頁面 |
| lxml | 高性能解析器,支持XPath | 比BeautifulSoup自帶的解析器更快 |
| pandas | 數(shù)據(jù)清洗與存儲(Excel/CSV) | 數(shù)據(jù)分析標(biāo)配 |
| execjs | 在Python中調(diào)用JS代碼 | 逆向必備,需配合Node.js |

2.3 Node.js 環(huán)境安裝

JS 逆向需要執(zhí)行前端加密代碼,依賴 Node.js 環(huán)境。下載地址:https://nodejs.org/ 安裝 LTS 版本。

驗證安裝:

 

node -v
npm -v

安裝 crypto-js 用于加密算法:

 

npm install crypto-js

2.4 抓包工具準(zhǔn)備

使用 Chrome 瀏覽器自帶開發(fā)者工具,快捷鍵 F12 或 Ctrl+Shift+I。核心面板:

  • Element:查看網(wǎng)頁結(jié)構(gòu);
  • Network:抓包分析接口;
  • Source:查看前端 JS 代碼;
  • Console:調(diào)試 JS 代碼。

進(jìn)階抓包工具(可選):
- Fiddler:Windows平臺經(jīng)典抓包工具,可攔截和修改請求。
- Charles:跨平臺,支持手機(jī)APP抓包(需設(shè)置代理)。
- mitmproxy:命令行交互式抓包,適合集成到自動化腳本。

三、入門階段:靜態(tài)網(wǎng)頁爬蟲實戰(zhàn)

靜態(tài)網(wǎng)頁數(shù)據(jù)直接存在 HTML 中,無需處理加密與異步,適合新手入門。

3.1 靜態(tài)爬蟲核心流程

  1. 構(gòu)造請求頭,模擬瀏覽器訪問;
  2. 發(fā)送 GET 請求,獲取網(wǎng)頁源碼;
  3. 使用 BeautifulSoup 解析 HTML;
  4. 提取標(biāo)題、鏈接、時間等目標(biāo)數(shù)據(jù);
  5. 數(shù)據(jù)清洗與簡單存儲。

請求頭詳解
- User-Agent:告訴服務(wù)器你是什么瀏覽器/設(shè)備。許多網(wǎng)站會拒絕非瀏覽器UA的請求,必須偽造。
- Referer:告訴服務(wù)器你從哪個頁面跳轉(zhuǎn)過來,部分網(wǎng)站用于防盜鏈。
- Accept-Encoding:是否接受壓縮響應(yīng)(gzip等),建議保留讓requests自動解壓。
- Cookie:維持登錄狀態(tài)或會話標(biāo)識,后續(xù)會用到。

3.2 完整靜態(tài)爬蟲代碼

 

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import time

# 隨機(jī)請求頭
ua = UserAgent()
headers = {
    "User-Agent": ua.random,
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive"
}

def static_spider(url):
    try:
        # 發(fā)送請求
        resp = requests.get(url, headers=headers, timeout=10)
        if resp.status_code != 200:
            print(f"請求失敗,狀態(tài)碼:{resp.status_code}")
            return []
        
        # 編碼處理,解決亂碼
        resp.encoding = resp.apparent_encoding
        soup = BeautifulSoup(resp.text, "lxml")
        
        # 數(shù)據(jù)存儲列表
        data_list = []
        
        # 示例提取規(guī)則(根據(jù)實際頁面修改)
        items = soup.find_all("div", class_="list-item")
        for item in items:
            title = item.find("a").get_text(strip=True)
            link = item.find("a")["href"]
            publish_time = item.find("span", class_="time").get_text(strip=True)
            
            data = {
                "標(biāo)題": title,
                "鏈接": link,
                "發(fā)布時間": publish_time
            }
            data_list.append(data)
        
        return data_list
    
    except Exception as e:
        print(f"爬取異常:{str(e)}")
        return []

if __name__ == "__main__":
    target_url = "https://xxx.xxx.com/news"  # 替換為目標(biāo)靜態(tài)地址
    result = static_spider(target_url)
    for i, item in enumerate(result, 1):
        print(i, item)

3.3 靜態(tài)爬蟲局限性

  • 無法獲取異步加載數(shù)據(jù);
  • 無法處理加密參數(shù)與加密數(shù)據(jù);
  • 容易被基礎(chǔ)反爬識別,無 IP 防護(hù)、無簽名機(jī)制。

想要爬取主流網(wǎng)站,必須進(jìn)入動態(tài)接口與逆向階段。

3.4 靜態(tài)爬蟲 vs 動態(tài)爬蟲對比表

對比維度靜態(tài)爬蟲動態(tài)爬蟲(含逆向)
數(shù)據(jù)位置直接嵌入HTML源碼通過Ajax/Fetch接口返回JSON
是否需要分析接口不需要必須抓包分析URL和參數(shù)
是否處理加密不需要需要破解sign、token等
請求頻率限制較寬松非常嚴(yán)格,容易封IP
代表性網(wǎng)站舊版博客、政府信息公開電商、短視頻、社交平臺

四、進(jìn)階階段:動態(tài)接口抓包分析

現(xiàn)代網(wǎng)站 90% 數(shù)據(jù)通過接口異步加載,數(shù)據(jù)不在 HTML 中,而是通過 JSON 返回。

4.1 抓包步驟

  1. 打開目標(biāo)網(wǎng)站 → F12 → Network;
  2. 勾選 Preserve log(保留日志,防止頁面刷新時清空)、篩選 XHR/Fetch;
  3. 刷新頁面或翻頁,查看出現(xiàn)的接口;
  4. 查看接口 URL、請求方法、參數(shù)、響應(yīng)。

抓包技巧
- 使用 Ctrl+E 清空現(xiàn)有日志,避免干擾。
- 點擊接口后,關(guān)注 Headers 中的 Request URL、Request Method、Request Headers 以及 Payload(POST參數(shù))。
- 如果響應(yīng)是密文(亂碼或Base64),說明需要解密。
- 嘗試在 Initiator 列點擊調(diào)用棧,可以直接跳轉(zhuǎn)到發(fā)起該請求的JS代碼行。

4.2 典型加密接口結(jié)構(gòu)

接口地址https://api.xxx.com/api/v1/data/list請求方式 :POST請求參數(shù)

{
    "page": 1,
    "size": 20,
    "timestamp": 1743000000,
    "nonce": "x927s1",
    "sign": "7a2f9d4e8b1c3e5f0a6b7d8c9e0f1a2b"
}

響應(yīng)內(nèi)容

{
    "code": 0,
    "msg": "success",
    "data": "加密字符串一串"
}

4.3 反爬特征分析

  • timestamp:時間戳,防止舊請求重復(fù)使用;
  • nonce:隨機(jī)字符串,防止請求重復(fù);
  • sign:簽名,核心加密參數(shù);
  • data:返回密文,需 AES 等方式解密。

直接請求會返回:簽名錯誤、參數(shù)非法、請求過期、無權(quán)限。

術(shù)語解釋
- 時間戳(timestamp):從1970年1月1日至今的秒數(shù)(或毫秒數(shù))。服務(wù)器會校驗時間差是否在允許范圍內(nèi)(如5分鐘),超時則拒絕。
- 隨機(jī)數(shù)(nonce):每次請求生成唯一字符串,服務(wù)器會緩存已使用的nonce,防止重放攻擊。
- 簽名(sign):將請求參數(shù)(包括timestamp、nonce等)按一定順序拼接后,進(jìn)行MD5、SHA256或HMAC運算得到的字符串。服務(wù)器用相同算法計算并比對,防止參數(shù)被篡改。

五、精通階段:JS 逆向破解加密

JS 逆向是爬蟲高薪核心技能,本質(zhì)是找到前端加密邏輯,用 Python 還原。

5.1 定位加密 JS 代碼

  1. 在 Network 面板 Ctrl+F 搜索 sign、encrypt、md5、aes;
  2. 在 Source 面板查找混淆 / 壓縮的 JS 文件;
  3. 使用斷點調(diào)試,查看參數(shù)生成過程。

常用定位技巧
- 搜索關(guān)鍵字:除了sign,還可以搜 hash、token、secret、key、param。
- XHR斷點:在Sources面板的XHR/fetch Breakpoints中添加接口URL包含的關(guān)鍵字,當(dāng)請求發(fā)出時會自動斷下。
- 事件監(jiān)聽斷點:在Sources右側(cè)的Event Listener Breakpoints中勾選 click、timer 等,適合反調(diào)試場景。
- Hook技術(shù):對于被封裝很深的加密函數(shù),可以重寫 window.btoa、window.atob 等常用編碼函數(shù),打印調(diào)用棧。

5.2 典型加密邏輯(真實通用)

 

// 生成簽名
function makeSign(page, timestamp, nonce){
    let key = "spider123456abcdef";
    let str = `page=${page}&t=${timestamp}&nonce=${nonce}&key=${key}`;
    return md5(str);
}
// 隨機(jī)字符串
function nonceStr(){
    let chars = "0123456789abcdef";
    let res = "";
    for(let i=0;i<6;i++){
        res += chars[Math.floor(Math.random()*chars.length)]
    }
    return res;
}
// AES解密
function decrypt(data){
    let key = CryptoJS.enc.Utf8.parse("1234567890123456");
    let iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");
    let decrypted = CryptoJS.AES.decrypt(data, key, {
        iv:iv,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

常見加密算法對比
| 算法 | 類型 | 特點 | 逆向難度 |
|------|------|------|----------|
| MD5 | 哈希(不可逆) | 速度快,常用于簽名校驗 | 低(直接調(diào)用庫即可) |
| SHA1/SHA256 | 哈希 | 更安全,輸出長度更長 | 低 |
| AES | 對稱加密 | 需要密鑰key和iv偏移量,可加解密 | 中(需找到key和iv) |
| RSA | 非對稱加密 | 公鑰加密,私鑰解密,無法逆向還原私鑰 | 高(通常需要模擬加密,無法解密) |
| Base64 | 編碼(非加密) | 可逆,常配合其他算法使用 | 極低 |

注意事項:不要試圖“破解”RSA私鑰,這是不可能的。正確做法是找到前端加密函數(shù),直接調(diào)用它加密參數(shù)后提交,或者使用Python的rsa庫加載公鑰進(jìn)行模擬加密。

六、終極實戰(zhàn):完整逆向爬蟲(可直接運行)

整合所有技術(shù),實現(xiàn)可落地的加密接口爬蟲。

6.1 完整源碼

 

# -*- coding: utf-8 -*-
import execjs
import requests
import time
import json
import pandas as pd
from fake_useragent import UserAgent

# ==================== JS 加密代碼 ====================
js_code = """
const CryptoJS = require('crypto-js');

function makeSign(page, timestamp, nonce){
    let key = "spider123456abcdef";
    let str = `page=${page}&t=${timestamp}&nonce=${nonce}&key=${key}`;
    return CryptoJS.MD5(str).toString();
}

function nonceStr(){
    let chars = "0123456789abcdef";
    let res = "";
    for(let i=0;i<6;i++){
        res += chars[Math.floor(Math.random()*chars.length)]
    }
    return res;
}

function decrypt(data){
    let key = CryptoJS.enc.Utf8.parse("1234567890123456");
    let iv = CryptoJS.enc.Utf8.parse("abcdef1234567890");
    let decrypted = CryptoJS.AES.decrypt(data, key, {
        iv:iv,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}
"""

# ==================== 初始化環(huán)境 ====================
ctx = execjs.compile(js_code)
ua = UserAgent()

headers = {
    "User-Agent": ua.random,
    "Content-Type": "application/json;charset=UTF-8",
    "Origin": "https://xxx.com",
    "Referer": "https://xxx.com/",
    "Accept": "application/json, text/plain, */*"
}

# 目標(biāo)接口
api = "https://api.xxx.com/api/v1/data/list"

# ==================== 核心爬蟲函數(shù) ====================
def crawl(page):
    try:
        # 構(gòu)造加密參數(shù)
        t = int(time.time())
        nonce = ctx.call("nonceStr")
        sign = ctx.call("makeSign", page, t, nonce)
        
        data = {
            "page": page,
            "size": 20,
            "timestamp": t,
            "nonce": nonce,
            "sign": sign
        }
        
        # 發(fā)送請求
        resp = requests.post(api, headers=headers, json=data, timeout=15)
        if resp.status_code != 200:
            print(f"第{page}頁請求失敗")
            return None
        
        res = resp.json()
        if res.get("code") != 0:
            print(f"錯誤:{res.get('msg')}")
            return None
        
        # 解密密文
        cipher = res.get("data")
        raw_data = ctx.call("decrypt", cipher)
        return json.loads(raw_data)
    
    except Exception as e:
        print(f"異常:{str(e)}")
        return None

# ==================== 批量爬取 + 保存 ====================
def run():
    all_data = []
    # 爬取 5 頁
    for page in range(1, 6):
        print(f"正在爬取第 {page} 頁")
        page_data = crawl(page)
        if page_data:
            all_data.extend(page_data)
        time.sleep(1)
    
    # 保存 Excel
    df = pd.DataFrame(all_data)
    df.to_excel("爬蟲結(jié)果.xlsx", index=False)
    print("爬取完成,已保存為 爬蟲結(jié)果.xlsx")

if __name__ == "__main__":
    run()

6.2 代碼說明

  1. 內(nèi)置完整 JS 加密邏輯,無需外部文件;
  2. 自動生成時間戳、隨機(jī)串、簽名;
  3. 自動解密接口返回密文;
  4. 批量爬取多頁并保存為 Excel;
  5. 自帶延時,降低反爬風(fēng)險。

代碼執(zhí)行注意事項
- 如果遇到 execjs._exceptions.ProgramError,請確保Node.js已安裝且crypto-js庫已全局安裝(npm install -g crypto-js)。
- 部分網(wǎng)站會對執(zhí)行環(huán)境做檢測(如檢測navigator.webdriver),此時可以改用 PyExecJS + 本地JS文件,或直接使用 subprocess 調(diào)用Node命令執(zhí)行加密。
- 對于更復(fù)雜的JS混淆(如obfuscator、JScrambler),建議將整個加密函數(shù)摳出來,補(bǔ)全依賴后單獨運行。

七、常見反爬繞過方案

7.1 IP 被封

  • 增加延時 time.sleep(1~3)
  • 使用代理 IP

 

proxies = {
    "http": "http://ip:port",
    "https": "https://ip:port"
}
requests.post(..., proxies=proxies)

代理IP來源
- 免費代理:從 https://free-proxy-list.net/ 等網(wǎng)站獲?。捎眯缘停环€(wěn)定)。
- 付費代理:芝麻代理、快代理、阿布云等,提供高匿、高可用代理,按流量或時間收費。
- 自建代理池:購買多臺云服務(wù)器,部署代理轉(zhuǎn)發(fā)服務(wù)。

7.2 Cookie 驗證

  • 登錄后復(fù)制 Cookie 加入 headers
  • 使用 requests.Session() 維持登錄態(tài)

Session的用法

session = requests.Session()
# 第一次請求登錄接口,獲取Cookie
session.post(login_url, data=login_data)
# 后續(xù)所有請求都會自動攜帶Cookie
resp = session.get(target_url)

7.3 簽名頻繁失效

  • JS 代碼可能更新,重新抓包替換;
  • 檢查時間戳是否為秒級 / 毫秒級。

額外建議:將簽名算法獨立成一個可配置模塊,當(dāng)網(wǎng)站更新加密時只需修改該模塊,無需重寫整個爬蟲。同時添加異常捕獲,當(dāng)簽名校驗失敗時自動觸發(fā)重新抓取JS邏輯。

7.4 請求頻率限制

  • 單線程慢速爬取
  • 隨機(jī)延時(1~5秒)
  • 避免高并發(fā)

更優(yōu)雅的限流方案:使用 ratelimit 庫或自定義裝飾器:

from ratelimit import limits, sleep_and_retry
@sleep_and_retry
@limits(calls=5, period=60)  # 每分鐘最多5次
def fetch(url):
    return requests.get(url)

7.5 驗證碼識別

  • 簡單圖形驗證碼:使用 ddddocr(帶帶弟弟OCR)庫免費識別,準(zhǔn)確率尚可。
  • 滑動驗證碼:可嘗試使用 OpenCV 計算缺口距離,配合 Selenium 模擬滑動。但商業(yè)級驗證碼(如極驗)需要更復(fù)雜的軌跡模擬或第三方打碼平臺。
  • 專業(yè)打碼平臺:超級鷹、圖鑒等,付費解決,價格低廉。

八、爬蟲規(guī)范與法律邊界

8.1 合法爬蟲原則

  • 遵守 robots.txt 協(xié)議;
  • 不爬取隱私數(shù)據(jù)、金融數(shù)據(jù)、未公開數(shù)據(jù);
  • 不用于商業(yè)用途、不惡意攻擊服務(wù)器;
  • 控制頻率,不造成服務(wù)器壓力。

robots.txt示例:訪問 https://example.com/robots.txt 可以看到網(wǎng)站允許哪些爬蟲路徑:

User-agent: *
Disallow: /admin/
Disallow: /api/private/
Allow: /public/

專家建議:即使robots.txt允許,也應(yīng)主動設(shè)置延時。一些網(wǎng)站雖然沒有法律禁止,但會在后端風(fēng)控系統(tǒng)中標(biāo)記高頻IP。建議將爬取速率控制在每秒1~2次以下。

8.2 禁止行為

  • 破解登錄、入侵服務(wù)器;
  • 大規(guī)模爬取導(dǎo)致網(wǎng)站癱瘓;
  • 販賣爬取數(shù)據(jù)、非法牟利;
  • 繞開網(wǎng)站加密與防護(hù)措施用于非法目的。

真實案例警示:2019年,某公司技術(shù)人員編寫爬蟲抓取競爭對手的房源數(shù)據(jù),繞過反爬措施,導(dǎo)致對方服務(wù)器壓力過大并造成經(jīng)濟(jì)損失。最終該公司被以“破壞計算機(jī)信息系統(tǒng)罪”判處罰金,技術(shù)人員獲刑。爬蟲技術(shù)必須在法律邊界內(nèi)使用。

九、學(xué)習(xí)路線總結(jié)(從入門到精通)

  1. 入門 :Python 基礎(chǔ) + requests + BeautifulSoup 靜態(tài)爬?。?/li>
  2. 進(jìn)階 :XPath、JsonPath、接口分析、分頁爬取;
  3. 精通 :JS 逆向、MD5/AES/RSA 加密、模擬瀏覽器;
  4. 高階 :異步爬蟲、分布式爬蟲、APP 爬蟲、驗證碼識別。

推薦學(xué)習(xí)資源
- 書籍:《Python3網(wǎng)絡(luò)爬蟲開發(fā)實戰(zhàn)》(崔慶才)
- 在線教程:Runobb、W3Cschool爬蟲板塊
- 練習(xí)靶場:GlidedSky、SpiderBoot(專門提供反爬練習(xí)網(wǎng)站)
- 逆向社區(qū):看雪論壇、吾愛破解(JS逆向板塊)

爬蟲的核心不是代碼,而是分析能力 :分析網(wǎng)頁結(jié)構(gòu)、分析接口參數(shù)、分析加密邏輯、分析反爬策略。只要掌握分析思路,任何網(wǎng)站都能實現(xiàn)合規(guī)爬取。

十、結(jié)語

本文從最基礎(chǔ)的靜態(tài)爬蟲,到動態(tài)接口分析,再到 JS 逆向加密破解,完整覆蓋 Python 爬蟲核心技術(shù)體系。文中代碼均為實戰(zhàn)可用版本,只需替換目標(biāo)地址與解析規(guī)則,即可快速適配絕大多數(shù)網(wǎng)站。

未來趨勢
- AI反爬:越來越多的網(wǎng)站開始使用機(jī)器學(xué)習(xí)模型識別異常流量(如鼠標(biāo)軌跡、行為模式),傳統(tǒng)爬蟲將面臨更大挑戰(zhàn)。
- WebAssembly(WASM)加密:部分高端網(wǎng)站將加密算法編譯為WASM二進(jìn)制格式,使得逆向難度陡增。
- 無頭瀏覽器指紋檢測:基于Canvas、WebGL、字體等生成設(shè)備指紋,Selenium等工具越來越容易被檢測。
- 合規(guī)爬蟲興起:隨著數(shù)據(jù)安全法的完善,使用官方API和正規(guī)數(shù)據(jù)交換將成為主流,逆向爬蟲的生存空間將被壓縮。

技術(shù)本身無對錯,關(guān)鍵在于使用者。希望大家在合法合規(guī)的前提下學(xué)習(xí)爬蟲技術(shù),用技術(shù)創(chuàng)造價值,而不是帶來風(fēng)險。堅持練習(xí)、多做實戰(zhàn)項目,你也能從爬蟲小白成長為逆向高手。

到此這篇關(guān)于最新Python爬蟲從入門到精通:靜態(tài)爬取+JS逆向+反爬繞過實戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Python爬蟲實戰(zhàn)教程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python通過http上傳文件思路詳解

    python通過http上傳文件思路詳解

    這篇文章主要介紹了python通過http上傳文件,在post請求中,用files參數(shù)來接受文件對象相關(guān)的參數(shù),通過data/json參數(shù)接受post請求體的其他參數(shù)
    2021-07-07
  • Python3 常用數(shù)據(jù)標(biāo)準(zhǔn)化方法詳解

    Python3 常用數(shù)據(jù)標(biāo)準(zhǔn)化方法詳解

    這篇文章主要介紹了Python3 常用數(shù)據(jù)標(biāo)準(zhǔn)化方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python多線程中比time.sleep更好用的暫停方式

    Python多線程中比time.sleep更好用的暫停方式

    這篇文章主要介紹了Python多線程中比time.sleep更好用的暫停方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python中如何使用正則表達(dá)式提取數(shù)據(jù)

    python中如何使用正則表達(dá)式提取數(shù)據(jù)

    這篇文章主要介紹了python中如何使用正則表達(dá)式提取數(shù)據(jù)問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Pandas統(tǒng)計每行數(shù)據(jù)中的空值的方法示例

    Pandas統(tǒng)計每行數(shù)據(jù)中的空值的方法示例

    處理缺失數(shù)據(jù)(NaN?值)是一個非常常見的問題,本文主要介紹了Pandas統(tǒng)計每行數(shù)據(jù)中的空值的方法示例,具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • Python實現(xiàn)打地鼠游戲

    Python實現(xiàn)打地鼠游戲

    這篇文章主要為大家詳細(xì)介紹了Python利用Pygame模塊實現(xiàn)簡單打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Django中模版的子目錄與include標(biāo)簽的使用方法

    Django中模版的子目錄與include標(biāo)簽的使用方法

    這篇文章主要介紹了Django中模版的子目錄與include標(biāo)簽的使用方法,有利于Python的Django框架的模版布局,需要的朋友可以參考下
    2015-07-07
  • python實現(xiàn)簡易內(nèi)存監(jiān)控

    python實現(xiàn)簡易內(nèi)存監(jiān)控

    這篇文章主要介紹了python實現(xiàn)簡易內(nèi)存監(jiān)控,每隔3秒獲取系統(tǒng)內(nèi)存,當(dāng)內(nèi)存超過設(shè)定的警報值時,獲取所有進(jìn)程占用內(nèi)存并發(fā)出警報聲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 解決Python中定時任務(wù)線程無法自動退出的問題

    解決Python中定時任務(wù)線程無法自動退出的問題

    今天小編就為大家分享一篇解決Python中定時任務(wù)線程無法自動退出的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 使用python將一個文件分配到指定的多個文件夾

    使用python將一個文件分配到指定的多個文件夾

    這篇文章主要為大家詳細(xì)介紹了如何使用python將一個文件分配到指定的多個文件夾,也就說將一個文件分配到一個母文件夾下的所有的子文件夾,感興趣的可以了解下
    2025-01-01

最新評論

固安县| 石阡县| 乌恰县| 启东市| 余干县| 宾川县| 社会| 合作市| 大同县| 耿马| 织金县| 临清市| 吴桥县| 葵青区| 丹寨县| 名山县| 南昌县| 隆尧县| 宜章县| 图片| 鄢陵县| 天津市| 乐陵市| 绿春县| 莒南县| 兴仁县| 黎川县| 石河子市| 双柏县| 时尚| 凌海市| 浦县| 延安市| 准格尔旗| 清新县| 惠来县| 南华县| 弥渡县| 丘北县| 西丰县| 应用必备|