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