這個包提供了一個類別來抓取網站上的連結。在底層,Guzzle Promise 用於同時抓取多個 url。
因為爬蟲可以執行JavaScript,所以它可以爬到JavaScript渲染的網站。在底層,Chrome 和 Puppeteer 用於支援此功能。
我們投入了大量資源來創建一流的開源套件。您可以透過購買我們的一款付費產品來支持我們。
我們非常感謝您從家鄉寄給我們一張明信片,並註明您正在使用我們的哪種套餐。您可以在我們的聯絡頁面上找到我們的地址。我們在虛擬明信片牆上發布所有收到的明信片。
這個包可以透過 Composer 安裝:
作曲家需要空間/爬蟲
爬蟲可以這樣實例化
使用 SpatieCrawlerCrawler; 爬蟲::create() ->setCrawlObserver(<擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>) ->startCrawling($url);
傳遞給setCrawlObserver
參數必須是擴充SpatieCrawlerCrawlObserversCrawlObserver
抽象類別的物件:
命名空間 SpatieCrawlerCrawlObservers;使用 GuzzleHttpExceptionRequestException;使用 PsrHttpMessageResponseInterface;使用 PsrHttpMessageUriInterface;抽象類別 CrawlObserver {/* * 當爬蟲抓取url時呼叫。 */公用函式 willCrawl(UriInterface $url, ?string $linkText): void{ }/* * 當爬蟲成功抓取給定的url時呼叫。 */爬取的抽象公用函式(UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = null, ? ): void;/* * 當爬蟲在爬取給定的 url 時遇到問題時呼叫。 */抽象公用函數crawlFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = null, ? ): void;/** * 爬網結束時呼叫。 */公用函數finishedCrawling(): void{ } }
您可以使用setCrawlObservers
設定多個觀察者:
爬蟲::create() ->setCrawlObservers([ <擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>, <擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>, …… ]) ->startCrawling($url);
或者,您可以使用addCrawlObserver
一一設定多個觀察者:
爬蟲::create() ->addCrawlObserver(<擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>) ->addCrawlObserver(<擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>) ->addCrawlObserver(<擴充 SpatieCrawlerCrawlObserversCrawlObserver 的類別>) ->startCrawling($url);
預設情況下,爬蟲不會執行JavaScript。這是啟用 JavaScript 執行的方法:
爬蟲::create() ->執行JavaScript() ……
為了能夠在執行完 javascript 後取得正文 html,這個套件依賴我們的 Browsershot 套件。這個包在底層使用了 Puppeteer。以下是有關如何在系統上安裝它的一些提示。
Browsershot 將對其相依性安裝在系統上的位置進行有根據的猜測。預設情況下,Crawler 將實例化一個新的 Browsershot 實例。您可能會發現需要使用setBrowsershot(Browsershot $browsershot)
方法設定自訂建立的實例。
爬蟲::create() ->setBrowsershot($browsershot) ->執行JavaScript() ……
請注意,即使您沒有 Browsershot 所需的系統依賴項,爬網程式仍然可以運作。僅當您呼叫executeJavaScript()
時才需要這些系統相依性。
您可以使用setCrawlProfile
函數告訴爬蟲不要存取某些網址。此函數需要一個擴充SpatieCrawlerCrawlProfilesCrawlProfile
的物件:
/* * 決定是否應該抓取給定的url。 */公用函數shouldCrawl(UriInterface $url): bool;
軟體包附帶三個開箱即用的CrawlProfiles
:
CrawlAllUrls
:此設定檔將抓取所有頁面上的所有 url,包括外部網站的 url。
CrawlInternalUrls
:此設定檔只會抓取主機頁面上的內部 URL。
CrawlSubdomains
:此設定檔只會抓取主機頁面上的內部 URL 及其子網域。
您可以透過將自訂UrlParser
傳遞給爬網程式來自訂從頁面提取連結的方式。
爬蟲::create() ->setUrlParserClass(<實作 SpatieCrawlerUrlParsersUrlParser 的類別>::class) ……
預設情況下,使用LinkUrlParser
。該解析器將從a
的href
屬性中提取所有連結。
還有一個內建的SitemapUrlParser
可以從網站地圖中提取和抓取所有連結。它確實支援網站地圖索引檔案。
爬蟲::create() ->setUrlParserClass(SitemapUrlParser::class) ……
預設情況下,爬蟲將尊重機器人數據。可以像這樣停用這些檢查:
爬蟲::create() ->忽略機器人() ……
機器人資料可以來自robots.txt
檔案、元標記或回應標頭。有關該規範的更多信息,請訪問:http://www.robotstxt.org/。
解析機器人資料是由我們的套件 spatie/robots-txt 完成的。
預設情況下,爬蟲會拒絕所有包含屬性 rel="nofollow" 的連結。可以像這樣停用這些檢查:
爬蟲::create() ->接受NofollowLinks() ……
為了遵守自訂使用者代理程式的 robots.txt 規則,您可以指定您自己的自訂使用者代理程式。
爬蟲::create() ->setUserAgent('我的代理')
您可以在 robots.txt 中為「my-agent」新增特定的抓取規則群組。此範例不允許對「my-agent」標識的爬網程式爬網整個網站。
// 禁止抓取 my-agent 用戶代理:我的代理 禁止:/
為了提高抓取速度,該套件預設同時抓取 10 個 url。如果您想變更該數字,可以使用setConcurrency
方法。
爬蟲::create() ->setConcurrency(1) // 現在所有的url都會被一一抓取
預設情況下,爬網程式會繼續爬網,直到爬完它能找到的每個頁面。如果您在有限制的環境(例如無伺服器環境)中工作,此行為可能會導致問題。
可以使用以下兩個選項來控制爬網行為:
爬網總數限制( setTotalCrawlLimit
):此限制定義要爬網的 URL 的最大數量。
目前抓取限制( setCurrentCrawlLimit
):這定義了目前抓取期間處理的 URL 數量。
讓我們看一些範例來闡明這兩種方法之間的差異。
setTotalCrawlLimit
方法可讓您限制要爬網的 URL 總數,無論您呼叫爬網程式的頻率為何。
$queue = <您選擇/實現的佇列>;// 抓取 5 個 URL 並結束。 ->setCrawlQueue($隊列) ->設定TotalCrawlLimit(5) ->startCrawling($url);// 達到總限制後不再繼續爬行。 ->setCrawlQueue($隊列) ->設定TotalCrawlLimit(5) ->startCrawling($url);
setCurrentCrawlLimit
將設定每次執行抓取的 UR 數量的限制。這段程式碼每次執行將處理 5 個頁面,沒有爬行頁面總數的限制。
$queue = <您選擇/實現的佇列>;// 抓取 5 個 URL 並結束。 ->setCrawlQueue($隊列) ->設定CurrentCrawlLimit(5) ->startCrawling($url);// 抓取接下來的5個URL並結束.Crawler::create() ->setCrawlQueue($隊列) ->設定CurrentCrawlLimit(5) ->startCrawling($url);
這兩個限制可以結合起來控制爬蟲:
$queue = <您選擇/實現的佇列>;// 抓取 5 個 URL 並結束。 ->setCrawlQueue($隊列) ->設定總抓取限制(10) ->設定CurrentCrawlLimit(5) ->startCrawling($url);// 抓取接下來的5個URL並結束.Crawler::create() ->setCrawlQueue($隊列) ->設定總抓取限制(10) ->設定CurrentCrawlLimit(5) ->startCrawling($url);// 達到總限制後不再繼續爬行。 ->setCrawlQueue($隊列) ->設定總抓取限制(10) ->設定CurrentCrawlLimit(5) ->startCrawling($url);
您可以使用setCurrentCrawlLimit
來中斷長時間運行的爬網。以下範例示範了一種(簡化的)方法。它由初始請求和任意數量的繼續爬網的後續請求組成。
要開始跨不同請求進行爬網,您需要為所選佇列驅動程式建立一個新佇列。首先將隊列實例傳遞給爬蟲。當頁面被處理並發現新的 URL 時,爬蟲將開始填充隊列。爬網程序完成後序列化並儲存團隊引用(使用當前爬網限制)。
// 使用您的佇列驅動程式建立一個佇列。 ->setCrawlQueue($隊列) ->設定目前抓取限制(10) ->startCrawling($url);// 序列化並儲存你的佇列$serializedQueue = serialize($queue);
對於以下任何請求,您需要反序列化原始隊列並將其傳遞給爬蟲:
// 反序列化佇列$queue = unserialize($serializedQueue);// 抓取下一組URLsCrawler::create() ->setCrawlQueue($隊列) ->設定目前抓取限制(10) ->startCrawling($url);// 序列化並儲存你的佇列$serialized_queue = serialize($queue);
該行為基於隊列中的信息。僅當在行為中傳遞相同的佇列實例時,行為才按所述工作。當傳入一個全新的佇列時,先前抓取的限制(即使對於同一網站)將不適用。
可以在此處找到包含更多詳細資訊的範例。
預設情況下,爬網程式會繼續爬網,直到爬網完所提供 URL 的每個頁面。如果你想限制爬蟲的深度,你可以使用setMaximumDepth
方法。
爬蟲::create() ->設定最大深度(2)
大多數 html 頁面都很小。但爬蟲程式可能會意外抓取 PDF 和 MP3 等大檔案。為了在這種情況下保持較低的記憶體使用量,爬網程式將僅使用小於 2 MB 的回應。如果在串流回應時,它變得大於 2 MB,爬網程式將停止串流回應。將假定回應正文為空。
您可以變更最大響應大小。
// 讓我們使用最大 3 MB.Crawler::create() ->設定最大回應大小(1024 * 1024 * 3)
在某些情況下,如果爬行過於激進,您可能會受到速率限制。為了避免這種情況,您可以使用setDelayBetweenRequests()
方法在每個請求之間新增暫停。該值以毫秒錶示。
爬蟲::create() ->setDelayBetweenRequests(150) // 每爬完一個頁面,爬蟲就會等待150ms
預設情況下,將下載每個找到的頁面(大小最多為setMaximumResponseSize()
)並解析其他連結。您可以透過使用允許的類型數組設定setParseableMimeTypes()
來限制應下載和解析的內容類型。
爬蟲::create() ->setParseableMimeTypes(['text/html', 'text/plain'])
這將防止下載具有不同 MIME 類型的頁面正文,例如二進位檔案、音訊/視訊…不太可能嵌入連結。此功能主要節省頻寬。
當抓取網站時,抓取工具會將要抓取的 URL 放入佇列中。預設情況下,該佇列使用內建的ArrayCrawlQueue
儲存在記憶體中。
當網站非常大時,您可能想要將該佇列儲存在其他地方,也許是資料庫。在這種情況下,您可以編寫自己的抓取佇列。
有效的爬網佇列是實作SpatieCrawlerCrawlQueuesCrawlQueue
介面的任何類別。您可以透過爬蟲上的setCrawlQueue
方法傳遞自訂爬網隊列。
爬蟲::create() ->setCrawlQueue(<SpatieCrawlerCrawlQueuesCrawlQueue的實作>)
這裡
數組抓取隊列
RedisCrawlQueue(第三方包)
Laravel 的 CacheCrawlQueue(第三方套件)
Laravel 模型作為佇列(第三方範例應用程式)
預設情況下,如果沒有,爬蟲會將基本 url 方案設為http
。您可以使用setDefaultScheme
更改它。
爬蟲::create() ->setDefaultScheme('https')
請參閱變更日誌以了解最近變更的更多資訊。
詳細資訊請參閱貢獻。
首先,安裝 Puppeteer 依賴項,否則您的測試將失敗。
npm install puppeteer
要執行測試,您必須先在單獨的終端視窗中啟動包含的基於節點的伺服器。
cd 測試/伺服器 npm 安裝 節點伺服器.js
伺服器運行後,您可以開始測試。
作曲家測試
如果您發現有關安全的錯誤,請發送郵件至 [email protected],而不是使用問題追蹤器。
您可以自由使用這個軟體包,但如果它進入您的生產環境,我們非常感謝您從您的家鄉給我們寄一張明信片,註明您正在使用我們的哪個軟體包。
我們的地址是:Spatie, Kruikstraat 22, 2018 安特衛普, 比利時。
我們在公司網站上發布所有收到的明信片。
弗里克·范德赫滕
所有貢獻者
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。