
Scrapling 爬蟲全流程指南從一條請求到整站抓取【免費(fèi)下載鏈接】Scrapling? An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!項(xiàng)目地址: https://gitcode.com/GitHub_Trending/sc/ScraplingScrapling 是一個(gè)自適應(yīng) Web 爬蟲框架把從一條 HTTP 請求到整站并發(fā)抓取的全流程收進(jìn)了一個(gè)庫里。本文用 4 個(gè)遞進(jìn)的真實(shí)場景帶你走完它的安裝、選 fetcher、抗改版、斷點(diǎn)續(xù)爬每一步代碼都能直接復(fù)制運(yùn)行。主線很簡單每當(dāng)你爬到下一個(gè)階段就遇到一個(gè)新問題然后我們只解決那一個(gè)問題。3 條命令裝好并拿到第一頁內(nèi)容大多數(shù)爬蟲庫裝完就能用Scrapling 稍微特別一點(diǎn)基礎(chǔ)安裝只包含解析引擎不裝 fetcher 依賴的話import scrapling.fetchers會直接報(bào)ModuleNotFoundError。所以按下面這個(gè)順序來pip install scrapling[fetchers] # 裝庫和 fetcher 依賴需 Python 3.10 scrapling install # 下載瀏覽器及指紋模擬所需的系統(tǒng)依賴裝完后跑這段最小爬蟲向練習(xí)網(wǎng)站 quotes.toscrape.com 發(fā)一條普通 HTTP 請求from scrapling.fetchers import Fetcher page Fetcher.get(https://quotes.toscrape.com/) quotes page.css(.quote .text::text).getall() print(len(quotes), 條引言) print(quotes[0])跑出來應(yīng)該看到10 條引言接著打印出第一條名言。注意page本身就能用.css()查元素不用額外建解析器——返回的Response對象自帶查詢能力還能通過page.status、page.headers、page.cookies看響應(yīng)細(xì)節(jié)。?術(shù)語解析TLS 指紋網(wǎng)站能根據(jù)你握手時(shí)的 TLS 特征判斷你是不是瀏覽器。Fetcher.get(url, impersonatechrome)會讓請求偽裝成最新版 Chrome 的 TLS 指紋和頭部比手動改 User-Agent 隱蔽得多。普通 HTTP 請求能拿到的頁面就到這里為止。下一頁內(nèi)容如果是 JavaScript 渲染出來的你拿到的就只剩一個(gè)空殼 DOM 了。頁面內(nèi)容不在源碼里按場景選對 fetcher實(shí)際跑起來你會發(fā)現(xiàn)三種 fetcher 是三個(gè)不同檔位的工具官方文檔里有一張對比表結(jié)論可以壓縮成一句話能用 HTTP 就別開瀏覽器瀏覽器里優(yōu)先用輕的。Fetcher純 HTTP最快適合靜態(tài)頁面DynamicFetcher開一個(gè)真實(shí) Chromium/Chrome 渲染 JS適合動態(tài)加載和中小防護(hù)StealthyFetcher在動態(tài)渲染之上疊加指紋偽裝能自動過 Cloudflare 的 Turnstile 和 Interstitial 挑戰(zhàn)內(nèi)容靠 JS 渲染的頁面把上一條請求換成下面這樣即可from scrapling.fetchers import DynamicFetcher page DynamicFetcher.fetch(https://quotes.toscrape.com/, network_idleTrue) data page.css(.quote .text::text).getall() print(len(data), 條引言瀏覽器渲染后)network_idleTrue讓 fetcher 等到頁面 500ms 內(nèi)沒有網(wǎng)絡(luò)請求再返回避免抓到 JS 還沒執(zhí)行完的中間狀態(tài)。跑出來應(yīng)該同樣看到 10 條引言但這次 DOM 是瀏覽器真實(shí)執(zhí)行后的產(chǎn)物。遇到帶 Cloudflare 防護(hù)的站點(diǎn)換StealthyFetcher并顯式打開挑戰(zhàn)求解詳細(xì)機(jī)制見反檢測文檔from scrapling.fetchers import StealthyFetcher page StealthyFetcher.fetch(https://nopecha.com/demo/cloudflare, solve_cloudflareTrue) data page.css(#padded_content a).getall() print(len(data), 個(gè)鏈接穿過了 Cloudflare 挑戰(zhàn))?術(shù)語解析Headless 模式Headless 指不帶圖形界面的無頭瀏覽器運(yùn)行模式。兩個(gè)瀏覽器 fetcher 默認(rèn)都是headlessTrue調(diào)試時(shí)傳headlessFalse就能看到瀏覽器窗口方便觀察頁面實(shí)際加載過程。網(wǎng)站改版了讓選擇器自己找到原來的元素這是 Scrapling 最有辨識度的一點(diǎn)。傳統(tǒng)做法是頁面 DOM 一變你寫死的#p1或div.product選擇器就失效爬蟲直接靜默返回空結(jié)果。Scrapling 的 adaptive自適應(yīng)功能會記住元素的屬性下次找不到時(shí)按相似度把元素搬回來重新定位不依賴 AI。先在全局開啟這個(gè)開關(guān)并保存一次元素屬性from scrapling.fetchers import Fetcher Fetcher.adaptive True # 默認(rèn)是關(guān)閉的必須顯式開啟 page Fetcher.get(https://quotes.toscrape.com/) element page.css(.quote, auto_saveTrue) # auto_saveTrue 記錄元素指紋之后某天網(wǎng)站改版選擇器查不到東西時(shí)別慌用adaptiveTrue讓它按相似度重新找element page.css(#p1, adaptiveTrue) # 舊選擇器失效后照樣找到那個(gè)元素文檔里有個(gè)很能說明問題的實(shí)測用 2010 年 StackOverflow 頁面上生成的超具體選擇器去今天的 StackOverflow 上定位同一個(gè)按鈕adaptive 模式依然能找到見adaptive 文檔。也就是說你第一次保存得越認(rèn)真后面改版時(shí)它認(rèn)路就越準(zhǔn)。整站抓取寫一個(gè)可暫??衫m(xù)跑的 Spider單頁腳本扛不住多頁、并發(fā)和中斷恢復(fù)。Scrapling 的 Spider 走的是 Scrapy 風(fēng)格定義start_urls在異步parse()里yield結(jié)果或后續(xù)請求內(nèi)部引擎自己管事件循環(huán)、調(diào)度器、會話池和斷點(diǎn)存檔Spider 提交初始請求Crawler Engine 調(diào)度會話抓取并把結(jié)果存盤隨時(shí)可從 checkpoint 恢復(fù)下面這個(gè) Spider 抓取 quotes.toscrape.com 的全部 10 頁from scrapling.spiders import Spider, Response class QuotesSpider(Spider): name quotes start_urls [https://quotes.toscrape.com] async def parse(self, response: Response): for quote in response.css(div.quote): yield { text: quote.css(span.text::text).get(), author: quote.css(small.author::text).get(), } next_page response.css(li.next a::attr(href)).get() if next_page: yield response.follow(next_page, callbackself.parse) result QuotesSpider().start() result.items.to_json(quotes.json) print(f共抓取 {result.stats.items_scraped} 條耗時(shí) {result.stats.elapsed_seconds:.1f}s)跑完終端會打印詳細(xì)的抓取統(tǒng)計(jì)當(dāng)前目錄多出quotes.json里面是 100 條引言。response.follow()會自動處理相對路徑并帶上 Referer不用自己拼 URL。?術(shù)語解析Checkpoint檢查點(diǎn)Spider 運(yùn)行時(shí)會把已完成的進(jìn)度定期存到磁盤。給start()傳一個(gè)目錄即可開啟QuotesSpider(crawldir./crawl_data).start()。運(yùn)行中按 CtrlC 優(yōu)雅暫停之后用同一個(gè)crawldir再啟動它會從上次停下的位置繼續(xù)適合長時(shí)間大站爬取。規(guī)模上去后被封是遲早的事內(nèi)置的ProxyRotator讓每個(gè)請求自動輪換出口 IP代理與封禁處理文檔from scrapling.spiders import Spider, Response from scrapling.fetchers import FetcherSession, ProxyRotator class MySpider(Spider): name my_spider start_urls [https://example.com] def configure_sessions(self, manager): rotator ProxyRotator([http://proxy1:8080, http://proxy2:8080]) manager.add(default, FetcherSession(proxy_rotatorrotator)) async def parse(self, response: Response): yield {proxy: response.meta.get(proxy), title: response.css(title::text).get()}每個(gè)請求自動取輪換隊(duì)列里的下一個(gè)代理實(shí)際用了哪個(gè)記在response.meta[proxy]里方便你追查是哪個(gè) IP 抓到了哪頁。常見坑與下一步把前面幾個(gè)場景串起來用過之后最容易踩的坑其實(shí)是這些導(dǎo)入即報(bào)錯(cuò)只跑了pip install scrapling就會在from scrapling.fetchers import ...處報(bào)ModuleNotFoundError。必須帶[fetchers]安裝再執(zhí)行scrapling install。adaptive 默認(rèn)關(guān)閉不顯式Fetcher.adaptive True第一次就不會保存元素指紋后面想用也白用。想不起選擇器就開 shellscrapling shell能進(jìn)交互式爬蟲 shell把瀏覽器請求轉(zhuǎn)成 Scrapling 請求、在本地瀏覽器里預(yù)覽結(jié)果省去來回復(fù)制粘貼。開發(fā)期最常用的姿勢瀏覽器里 Copy as cURL扔進(jìn) shell 里直接改造成 fetcher 調(diào)用最后提醒一句合規(guī)Scrapling 的免責(zé)聲明里寫明使用前請遵守目標(biāo)網(wǎng)站的服務(wù)條款、robots.txt 和當(dāng)?shù)財(cái)?shù)據(jù)法規(guī)Spider 也內(nèi)置了robots_txt_obey選項(xiàng)來遵守 robots 指令。下一步行動用第一節(jié)的 3 條命令裝好環(huán)境拿你自己的目標(biāo)站點(diǎn)把四個(gè)場景各跑一遍卡在哪一步再翻對應(yīng)文檔官方文檔首頁fetcher 選擇、spider、CLI 的完整說明API 參考每個(gè)類的參數(shù)一覽Spider 入門文檔多會話、模板 SpiderCrawlSpider/SitemapSpider/ShopifySpider等進(jìn)階內(nèi)容【免費(fèi)下載鏈接】Scrapling? An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!項(xiàng)目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考