
做技術(shù)選型的時(shí)候最怕的不是“沒有工具”而是“工具太多不知道怎么選”。Python 爬蟲圈子尤其如此GitHub 上每天都有新的爬蟲項(xiàng)目出現(xiàn)有人開源了一個(gè)“一鍵采集某平臺(tái)數(shù)據(jù)”的工具有人實(shí)現(xiàn)了新的反反爬策略。但真到自己動(dòng)手寫爬蟲時(shí)很多人卻卡住了——收藏夾里存了幾十個(gè)項(xiàng)目不知道哪個(gè)能解決自己的問題requests 能抓到靜態(tài)頁面遇到動(dòng)態(tài)渲染的頁面就束手無策數(shù)據(jù)量一旦上來單機(jī)腳本跑不動(dòng)又不知道該怎么擴(kuò)展。這篇文章不打算吹捧某個(gè)具體的“爆火項(xiàng)目”而是想聊一個(gè)更值得關(guān)注的變化Python 爬蟲工具鏈正在從“requests BeautifulSoup 的單點(diǎn)腳本”走向“瀏覽器自動(dòng)化 任務(wù)調(diào)度 數(shù)據(jù)治理”的工程化方案。這個(gè)變化決定了你應(yīng)該選什么工具、怎么搭項(xiàng)目結(jié)構(gòu)、怎么避免把時(shí)間浪費(fèi)在重復(fù)造輪子上。讀完你會(huì)得到一份能直接落地的工具選型清單、一套完整的示例代碼以及一份常見問題排查清單。1. 爬蟲圈最近在關(guān)注什么從“寫請(qǐng)求”到“工程化”很多初學(xué)者對(duì)爬蟲的理解是“發(fā)出 HTTP 請(qǐng)求拿到 HTML用正則或解析庫提取數(shù)據(jù)”。這個(gè)理解本身沒有錯(cuò)它對(duì)應(yīng)的是最基礎(chǔ)的爬蟲模型。但如果你在 GitHub 上多翻幾個(gè)高 star 的爬蟲項(xiàng)目會(huì)發(fā)現(xiàn)大家討論的重心早就變了如何管理 Cookie、Token 和登錄態(tài)如何處理動(dòng)態(tài)渲染的頁面而不是只抓靜態(tài) HTML如何讓爬蟲按頻率、按優(yōu)先級(jí)、按增量去抓取如何把抓到的數(shù)據(jù)清洗、去重、落庫如何監(jiān)控爬蟲的健康狀態(tài)失敗了怎么重試如何在不影響目標(biāo)網(wǎng)站的前提下合法合規(guī)地抓取數(shù)據(jù)。這些問題加起來就是“爬蟲工程化”。從材料來看無論是 GitHub 上的開源框架還是社區(qū)里的熱門討論都在往這個(gè)方向走。單點(diǎn)工具依然有價(jià)值但生產(chǎn)級(jí)的爬蟲系統(tǒng)靠一個(gè) requests 循環(huán)是不夠的。所以你會(huì)看到近年熱門的 Python 爬蟲工具不再只有 requests 和 BeautifulSoup。瀏覽器自動(dòng)化工具、任務(wù)調(diào)度框架、布隆過濾器、代理池、日志系統(tǒng)都被整合到了爬蟲項(xiàng)目里。對(duì)開發(fā)者來說這既是好事也是挑戰(zhàn)好處是有成熟方案可以借力壞處是學(xué)習(xí)曲線變陡了。這篇文章的判斷是2025 年以后的爬蟲選型優(yōu)先考慮“能工程化”的工具而不是單個(gè)功能最強(qiáng)的工具。下面我按這個(gè)思路從基礎(chǔ)工具到完整框架做一個(gè)梳理。2. 核心概念先把爬蟲工具的分類搞明白在寫代碼之前建議先建立一張“工具地圖”。很多新手學(xué)爬蟲今天看一個(gè) requests 教程明天看一個(gè) Scrapy 教程最后混在一起不知道哪個(gè)環(huán)節(jié)該用哪個(gè)工具。其實(shí)爬蟲工具可以按功能分成四層2.1 請(qǐng)求層負(fù)責(zé)發(fā)起 HTTP 請(qǐng)求、處理響應(yīng)、管理會(huì)話。代表工具是 requests、httpx、aiohttp。requests 適合快速上手httpx 支持 HTTP/2 和異步aiohttp 適合高并發(fā)場(chǎng)景。2.2 解析層負(fù)責(zé)把響應(yīng)內(nèi)容轉(zhuǎn)成結(jié)構(gòu)化數(shù)據(jù)。代表工具有 BeautifulSoup、lxml、parsel、json。BeautifulSoup API 友好lxml 性能好parsel 是 Scrapy 內(nèi)部的解析器語法兼容 CSS 和 XPath。2.3 瀏覽器自動(dòng)化層負(fù)責(zé)模擬真實(shí)瀏覽器解決動(dòng)態(tài)渲染、JavaScript 加密、復(fù)雜交互等問題。代表工具有 Selenium、Playwright、DrissionPage。這一層是近年變化最大的部分后面單獨(dú)講。2.4 框架與調(diào)度層負(fù)責(zé)把請(qǐng)求、解析、存儲(chǔ)、去重、重試、調(diào)度整合成一個(gè)完整系統(tǒng)。代表工具有 Scrapy、feapder、crawlab。如果你的爬蟲只需要跑一次、抓幾十頁數(shù)據(jù)用框架反而笨重但如果要長(zhǎng)期運(yùn)行這一層幾乎必須引入。2.5 按任務(wù)類型分類從任務(wù)形態(tài)上看爬蟲還可以分成三類這有助于你做架構(gòu)設(shè)計(jì)類型特點(diǎn)典型使用方式批量型爬蟲一次性抓完存量數(shù)據(jù)單機(jī)腳本或小集群重解析不重調(diào)度增量型爬蟲只抓新增或變化的數(shù)據(jù)需要去重、時(shí)間戳或 ID 記錄通常配數(shù)據(jù)庫垂直型爬蟲針對(duì)某類站點(diǎn)深耕需要針對(duì)單個(gè)站點(diǎn)定制解析和反爬策略明白了分類再回頭看具體工具就不會(huì)迷路。接下來我們從環(huán)境準(zhǔn)備開始逐步跑通一個(gè)最小爬蟲再到動(dòng)態(tài)頁面最后說框架選型。3. 環(huán)境準(zhǔn)備Python 與虛擬環(huán)境的基礎(chǔ)配置無論你選哪個(gè)爬蟲框架第一步都是把 Python 環(huán)境收拾干凈。這里最容易被忽略的是不要用系統(tǒng)全局 Python 直接裝包尤其是 Ubuntu 或 macOS 自帶的環(huán)境裝到一半權(quán)限報(bào)錯(cuò)、依賴沖突都很常見。3.1 安裝 Python建議使用 Python 3.9 以上版本。macOS/Linux 可以優(yōu)先看系統(tǒng)是否自帶Windows 用戶從官網(wǎng)下載安裝包。如果你需要多個(gè) Python 版本切換可以考慮使用 pyenv 或 conda 管理。版本細(xì)節(jié)以你實(shí)際安裝的為準(zhǔn)本文不指定死版本。安裝完成后在終端驗(yàn)證python3 --version pip3 --version如果你的系統(tǒng)里同時(shí)有多個(gè) Python建議使用python3 -m pip而不是直接pip避免裝錯(cuò)環(huán)境。3.2 創(chuàng)建虛擬環(huán)境虛擬環(huán)境的作用是隔離項(xiàng)目依賴。一個(gè)爬蟲項(xiàng)目用 requests 1.0另一個(gè)用 requests 2.0互不干擾。mkdir python-spider-demo cd python-spider-demo python3 -m venv venv source venv/bin/activateWindows 下激活命令是venv\Scripts\activate激活成功后終端會(huì)顯示(venv)前綴。接下來安裝本階段需要的包pip install requests beautifulsoup4 lxml國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下如果 pip 下載慢可以臨時(shí)使用國(guó)內(nèi)鏡像源pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests beautifulsoup4 lxml注意這里只是給你一個(gè)通用的鏡像配置方式。實(shí)際使用哪個(gè)源取決于你所在網(wǎng)絡(luò)環(huán)境的可用性請(qǐng)以能訪問、可信任的源為準(zhǔn)。3.3 關(guān)于 GitHub 開源項(xiàng)目的下載問題GitHub 本身就是爬蟲開源項(xiàng)目的最大聚集地但很多開發(fā)者會(huì)遇到倉(cāng)庫下載慢、release 附件下載不動(dòng)的情況。這里可以推薦兩種通用思路一是使用 GitHub 鏡像站二是使用倉(cāng)庫下載加速服務(wù)常見的有 ghproxy 這類轉(zhuǎn)發(fā)服務(wù)。這些服務(wù)的可用性和安全性隨時(shí)可能變化使用前注意核對(duì)代碼來源生產(chǎn)環(huán)境不要使用你不信任的第三方打包。4. 入門級(jí)組合requests BeautifulSoup 快速抓取靜態(tài)頁面先寫一個(gè)最小可運(yùn)行的示例。示例目標(biāo)站使用一個(gè)公開的爬蟲練習(xí)站點(diǎn)quotes.toscrape.com它專門用來教學(xué)不涉及敏感數(shù)據(jù)。新建文件demo_quotes.py# 文件路徑python-spider-demo/demo_quotes.py import requests from bs4 import BeautifulSoup def fetch_page(page: int): url fhttps://quotes.toscrape.com/page/{page}/ try: resp requests.get(url, timeout10) resp.raise_for_status() except requests.RequestException as e: print(f請(qǐng)求失敗: {e}) return [] soup BeautifulSoup(resp.text, html.parser) quotes [] for item in soup.select(.quote): text item.select_one(.text).get_text(stripTrue) author item.select_one(.author).get_text(stripTrue) quotes.append({text: text, author: author}) return quotes if __name__ __main__: for page in range(1, 4): data fetch_page(page) print(f第 {page} 頁獲取到 {len(data)} 條數(shù)據(jù)) for quote in data[:2]: print(quote[author], quote[text][:30])代碼邏輯說明requests.get負(fù)責(zé)發(fā)起 HTTP 請(qǐng)求timeout10是必加的否則遇到慢接口會(huì)一直掛住resp.raise_for_status()會(huì)在狀態(tài)碼非 200 時(shí)拋異常避免拿到錯(cuò)誤頁面還繼續(xù)解析soup.select(.quote)使用 CSS 選擇器定位所有名言節(jié)點(diǎn)get_text(stripTrue)去掉首尾空白避免解析出大量換行符。運(yùn)行方式python demo_quotes.py預(yù)期輸出類似第 1 頁獲取到 10 條數(shù)據(jù) Albert Einstein “The world as we have created it...” J.K. Rowling “It is our choices, Harry, that show...” 第 2 頁獲取到 10 條數(shù)據(jù) ...如果這里能跑通說明你的 requests、BeautifulSoup、Python 環(huán)境都沒有問題。這個(gè)組合適合目標(biāo)頁面是服務(wù)端渲染、不需要登錄、反爬策略不強(qiáng)的場(chǎng)景。它也是后續(xù)學(xué)習(xí)框架的基礎(chǔ)。5. 動(dòng)態(tài)頁面與反爬場(chǎng)景DrissionPage 和 Playwright 如何選很多真實(shí)站點(diǎn)的數(shù)據(jù)不是寫在靜態(tài) HTML 里的而是通過 JavaScript 請(qǐng)求接口后再渲染。用 requests 直接抓得到的 HTML 里沒有數(shù)據(jù)。這時(shí)候需要瀏覽器自動(dòng)化工具。老牌方案是 Selenium。但 Selenium 的問題也很明顯需要下載對(duì)應(yīng)版本的 webdriver配置繁瑣啟動(dòng)瀏覽器時(shí)還要處理各種環(huán)境問題。近兩年更常用的方案是 Playwright 和 DrissionPage。工具核心特點(diǎn)適用場(chǎng)景Selenium歷史最久文檔多老項(xiàng)目維護(hù)、兼容舊瀏覽器測(cè)試Playwright微軟開源內(nèi)置瀏覽器下載支持多種語言跨瀏覽器測(cè)試、復(fù)雜交互、截圖DrissionPage國(guó)產(chǎn)開源把 requests 和瀏覽器控制封裝到一起配置簡(jiǎn)單快速做反爬繞過、混合模式采集從社區(qū)反饋和工具熱度來看DrissionPage 近年增長(zhǎng)很快。它的一個(gè)重要設(shè)計(jì)是同一個(gè)代碼里既能用瀏覽器自動(dòng)化模式去解決登錄和動(dòng)態(tài)渲染也能用類似 requests 的方式直接請(qǐng)求接口。這對(duì)于爬蟲場(chǎng)景非常方便因?yàn)椴恍枰?Selenium 和 requests 之間來回切換。下面是一個(gè) DrissionPage 抓取動(dòng)態(tài)頁面示例。注意不同版本的 API 可能略有差異請(qǐng)以官方文檔為準(zhǔn)。# 文件路徑python-spider-demo/demo_dynamic.py from DrissionPage import ChromiumPage page ChromiumPage() page.get(https://quotes.toscrape.com/js/) page.wait.load_start() for item in page.eles(.quote): text item.ele(.text).text author item.ele(.author).text print(f{author}: {text[:40]}) page.quit()這段代碼的邏輯是啟動(dòng)一個(gè) Chromium 瀏覽器實(shí)例訪問動(dòng)態(tài)渲染頁面等頁面加載完成后用選擇器提取名言和作者。相比 Selenium不需要手動(dòng)下載和配置 driver對(duì)新手更友好。如果你更傾向 Playwright官方提供了很強(qiáng)的調(diào)試工具執(zhí)行下面命令可以看到操作和頁面狀態(tài)pip install playwright playwright install chromium python -m playwright codegen https://quotes.toscrape.com/js/codegen會(huì)打開錄制窗口你手動(dòng)操作頁面它自動(dòng)生成代碼是一個(gè)快速學(xué)習(xí)選擇器的高效辦法。6. 完整實(shí)戰(zhàn)示例從列表頁到詳情頁的數(shù)據(jù)采集流程前面兩個(gè)例子分別處理了靜態(tài)頁面和動(dòng)態(tài)頁面。實(shí)際項(xiàng)目里通常還需要把數(shù)據(jù)從列表頁帶到詳情頁再加去重、更新邏輯。這里給一個(gè)更完整的工程項(xiàng)目結(jié)構(gòu)示例。假設(shè)我們要采集某個(gè)公開書籍站點(diǎn)流程是先抓列表頁得到每本書的詳情頁地址再訪問詳情頁拿價(jià)格和庫存。這個(gè)示例站點(diǎn)也是公開練習(xí)用的。推薦的項(xiàng)目結(jié)構(gòu)python-spider-demo/ ├── main.py # 入口 ├── config.py # 配置項(xiàng) ├── parse.py # 解析邏輯 ├── storage.py # 存儲(chǔ)邏輯 └── requirements.txt # 依賴清單config.py示例# 文件路徑python-spider-demo/config.py BASE_URL https://books.toscrape.com/ REQUEST_INTERVAL 1 # 每次請(qǐng)求間隔秒數(shù)避免對(duì)目標(biāo)站點(diǎn)造成壓力 OUTPUT_FILE books.csvparse.py示例# 文件路徑python-spider-demo/parse.py from bs4 import BeautifulSoup def parse_book_list(html: str) - list[dict]: soup BeautifulSoup(html, html.parser) books [] for article in soup.select(article.product_pod): title article.select_one(h3 a).get(title) price article.select_one(.price_color).get_text(stripTrue) detail_url article.select_one(h3 a).get(href) books.append({ title: title, price: price, detail_url: detail_url, }) return booksmain.py示例# 文件路徑python-spider-demo/main.py import time import csv import requests import config import parse def fetch_html(url: str) - str: resp requests.get(url, timeout10) resp.raise_for_status() resp.encoding resp.apparent_encoding return resp.text def main(): books [] for page in range(1, 3): url f{config.BASE_URL}catalogue/page-{page}.html html fetch_html(url) books.extend(parse.parse_book_list(html)) print(f第 {page} 頁累計(jì) {len(books)} 條) time.sleep(config.REQUEST_INTERVAL) with open(config.OUTPUT_FILE, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[title, price, detail_url]) writer.writeheader() writer.writerows(books) print(f已完成寫入 {config.OUTPUT_FILE}) if __name__ __main__: main()這個(gè)結(jié)構(gòu)雖然簡(jiǎn)單但已經(jīng)開始體現(xiàn)“工程化”思維配置獨(dú)立出來改請(qǐng)求間隔不用改業(yè)務(wù)代碼解析邏輯單獨(dú)成文件后續(xù)增強(qiáng)選擇器只改一個(gè)地方存儲(chǔ)端先用 CSV后續(xù)換成數(shù)據(jù)庫只需要改storage.py。運(yùn)行pip install requests beautifulsoup4 python main.py跑完以后可以用瀏覽器或文本編輯器打開books.csv查看是否有正確數(shù)據(jù)。一個(gè)小技巧是先手動(dòng)用瀏覽器打開目標(biāo)頁面F12 看一下 HTML 結(jié)構(gòu)和這段代碼的 CSS 選擇器是否匹配。很多時(shí)候抓不到數(shù)據(jù)不是代碼寫錯(cuò)而是頁面結(jié)構(gòu)和你以為的不一致。7. 運(yùn)行驗(yàn)證與失敗排查先看日志再談加功能很多人寫完爬蟲第一次運(yùn)行發(fā)現(xiàn)沒有輸出第一反應(yīng)是去改選擇器。但更穩(wěn)妥的順序是先確認(rèn)請(qǐng)求是否成功再確認(rèn)解析是否命中最后才懷疑選擇器。建議按這個(gè)順序排查確認(rèn)請(qǐng)求狀態(tài)。打印resp.status_code如果不是 200先解決請(qǐng)求層問題??赡茉虬?User-Agent 被攔截、需要登錄、目標(biāo)站封了 IP。確認(rèn)頁面內(nèi)容。打印resp.text[:500]看返回的是不是預(yù)期 HTML。有些站點(diǎn)會(huì)返回驗(yàn)證碼頁、安全頁或 JSON 數(shù)據(jù)說明你的請(qǐng)求模擬成度不夠。確認(rèn)選擇器命中。在 Python 里先解析并打印len(soup.select(...))如果為 0說明 CSS 選擇器沒有命中。這時(shí)候應(yīng)該回到瀏覽器 F12 重新復(fù)制選擇器。確認(rèn)編碼。如果輸出中文亂碼用resp.encoding resp.apparent_encoding重新指定編碼或者在響應(yīng)頭里找 charset。確認(rèn)頻率限制。如果前幾頁正常后面開始超時(shí)或 403大概率是請(qǐng)求頻率太高需要增加time.sleep。在第 5 節(jié)和第 6 節(jié)的代碼里我已經(jīng)用time.sleep(config.REQUEST_INTERVAL)做了基礎(chǔ)限速。這里想強(qiáng)調(diào)爬蟲的穩(wěn)定性往往不是靠技巧而是靠對(duì)請(qǐng)求頻率的控制。真正穩(wěn)定運(yùn)行的爬蟲看起來都“不太快”。8. 常見問題與排查思路下面整理一份爬蟲開發(fā)過程中最常見的 6 類問題按“現(xiàn)象 - 可能原因 - 排查方式 - 解決方案”給出。這份清單建議收藏后續(xù)遇坑可以對(duì)照。問題現(xiàn)象可能原因排查方式解決方案狀態(tài)碼 403服務(wù)端識(shí)別出非瀏覽器請(qǐng)求打印請(qǐng)求頭服務(wù)端是否要求 UA設(shè)置合理 User-Agent或換瀏覽器自動(dòng)化返回空數(shù)據(jù)數(shù)據(jù)由 JavaScript 動(dòng)態(tài)加載查看返回 HTML 是否包含字段使用 Playwright / DrissionPage中文亂碼編碼判斷錯(cuò)誤查看響應(yīng)頭 charset設(shè)置resp.encoding resp.apparent_encoding爬取到一半超時(shí)請(qǐng)求頻率過高被限流查看錯(cuò)誤日志中的狀態(tài)碼增加 sleep 間隔使用代理池GitHub 項(xiàng)目下載慢網(wǎng)絡(luò)環(huán)境問題查看下載速度使用鏡像站或下載加速服務(wù)注意核驗(yàn)來源依賴版本沖突requests / lxml 等版本不兼容查看 pip 依賴樹創(chuàng)建虛擬環(huán)境用 requirements.txt 鎖定版本這里特別提醒一下“代理池”。很多爬蟲教程會(huì)說“被封 IP 就上代理”但代理服務(wù)和代理池的搭建涉及額外的基礎(chǔ)設(shè)施成本對(duì)新手來說并不是第一優(yōu)先級(jí)。如果你的爬蟲只是學(xué)習(xí)或小規(guī)模使用控制頻率、添加隨機(jī)等待、做好重試比盲目上代理更有效。9. 最佳實(shí)踐與學(xué)習(xí)路線爬蟲項(xiàng)目的工程化建議學(xué)爬蟲的人很多但能把爬蟲寫好的人不多。差距往往不在“會(huì)不會(huì)用某個(gè)庫”而在“有沒有工程思維”。下面這幾條經(jīng)驗(yàn)來自長(zhǎng)時(shí)間和爬蟲項(xiàng)目打交道的通用實(shí)踐適合所有想從“能跑”走到“能長(zhǎng)期跑”的開發(fā)者。9.1 從最小項(xiàng)目開始再引入框架不建議一上來就搭 Scrapy 項(xiàng)目。先用 requests BeautifulSoup 跑通一個(gè)完整流程理解 HTTP 請(qǐng)求、解析、存儲(chǔ)三個(gè)環(huán)節(jié)。然后當(dāng)你發(fā)現(xiàn)需要處理去重、重試、并發(fā)、斷點(diǎn)續(xù)爬時(shí)再引入 Scrapy 或 feapder。9.2 數(shù)據(jù)存儲(chǔ)優(yōu)先考慮 CSV 和 SQLite前期不要急著上 MySQL 或 PostgreSQL。CSV 適合快速查看和調(diào)試SQLite 適合單機(jī)、結(jié)構(gòu)化查詢。等你真正遇到數(shù)據(jù)量瓶頸、并發(fā)寫庫問題再升級(jí)數(shù)據(jù)庫。這個(gè)順序能讓你把精力放在爬蟲本身的邏輯上。9.3 日志是最好的調(diào)試工具不要把print當(dāng)成唯一輸出。做一個(gè)簡(jiǎn)單的日志文件記錄每次請(qǐng)求的時(shí)間、URL、狀態(tài)碼、耗時(shí)。遇到問題先看日志而不是重新跑一遍。推薦用 Python 自帶的logging模塊不要額外引庫。9.4 學(xué)會(huì)用瀏覽器 DevTools 看接口很多數(shù)據(jù)并不需要“爬 HTML”而是直接找到頁面背后的 JSON 接口。打開瀏覽器 F12切換到 Network 面板刷新頁面找到 XHR 請(qǐng)求往往能看到接口返回的干凈 JSON。用 requests 直接請(qǐng)求這個(gè)接口比解析 HTML 高效得多。9.5 注意合法合規(guī)邊界爬蟲本身是中性技術(shù)但使用必須克制。建議始終遵守遵守目標(biāo)網(wǎng)站的 robots.txt 和使用條款不采集非公開、需要登錄才能訪問且明確禁止的數(shù)據(jù)控制請(qǐng)求頻率避免影響對(duì)方服務(wù)學(xué)習(xí)用途的數(shù)據(jù)不要用于商業(yè)販賣或公開傳播涉及個(gè)人信息的采集嚴(yán)格遵循最小必要原則。9.6 學(xué)習(xí)資源清單如果你想深入建議優(yōu)先看這些官方文檔它們是信息增量最大的來源requests 官方文檔理解 HTTP 會(huì)話、重試、代理BeautifulSoup 官方文檔掌握 CSS 選擇器和遍歷Scrapy 官方教程理解框架的 Pipeline、Middleware、SchedulerDrissionPage 官方文檔掌握瀏覽器自動(dòng)化與請(qǐng)求模式的混合使用Playwright 官方文檔適合復(fù)雜交互和調(diào)試。練習(xí)站點(diǎn)可以使用quotes.toscrape.com、books.toscrape.com、httpbin.org這些公開站點(diǎn)專門用于學(xué)習(xí)比直接抓取商業(yè)站點(diǎn)更穩(wěn)妥。9.7 增量采集的思路如果你的爬蟲需要長(zhǎng)期運(yùn)行不要每次都全量跑。最簡(jiǎn)單的增量方案是記錄上一次抓取的最大 ID 或時(shí)間戳下一次抓取只抓比它新的數(shù)據(jù)。如果做不到那就先抓全量再用數(shù)據(jù)庫唯一約束去重。再進(jìn)階一點(diǎn)可以用布隆過濾器或 Redis Set 做 URL 去重但那是后來的事。9.8 關(guān)于 GitHub 開源項(xiàng)目的閱讀方法選開源項(xiàng)目時(shí)不要只看 star 數(shù)。重點(diǎn)看這幾個(gè)指標(biāo)最近一次 commit 時(shí)間三年未更新的項(xiàng)目遇到新問題風(fēng)險(xiǎn)高Issue 活躍度有人維護(hù)、有人回復(fù)才值得深入文檔完整度一份好的 README 包含安裝、示例、常見問題License明確開源協(xié)議的項(xiàng)目更安全代碼風(fēng)格項(xiàng)目里的代碼是否規(guī)范、是否容易二次開發(fā)。這也是為什么建議你“按需求找項(xiàng)目而不是按熱度找項(xiàng)目”。GitHub 上的爆火項(xiàng)目往往營(yíng)銷做得好但不一定適合你的業(yè)務(wù)場(chǎng)景。爬蟲這條路走到后面真正拉開差距的不是你會(huì)多少反爬技巧而是你能不能把采集任務(wù)拆解成可靠的、可維護(hù)的、合法合規(guī)的系統(tǒng)。先跑通最小示例再逐步加去重、日志、增量、調(diào)度。收藏了那么多開源項(xiàng)目下一步就是挑一個(gè)自己熟悉的場(chǎng)景動(dòng)手寫起來。