爬取网站上的所有内部链接


README

spatie/crawler v2的分支,经过一些调整。仅用于内部项目。

爬取网站上的链接

Latest Version on Packagist Software License Build Status Quality Score StyleCI Total Downloads

此包提供了一个用于爬取网站链接的类。底层使用Guzzle承诺来并发爬取多个URL

因为爬虫可以执行JavaScript,所以它可以爬取JavaScript渲染的网站。底层使用无头Chrome来实现这一功能。

Spatie是比利时安特卫普的一家网络设计公司。您可以在我们的网站上找到所有开源项目的概述这里

安装

此包可以通过Composer安装

composer require spatie/crawler

使用方法

爬虫可以像这样实例化

Crawler::create()
    ->setCrawlObserver(<implementation of \Spatie\Crawler\CrawlObserver>)
    ->startCrawling($url);

传递给setCrawlObserver的参数必须是一个实现了\Spatie\Crawler\CrawlObserver接口的对象

/**
 * Called when the crawler will crawl the given url.
 *
 * @param \Spatie\Crawler\Url $url
 */
public function willCrawl(Url $url);

/**
 * Called when the crawler has crawled the given url.
 *
 * @param \Spatie\Crawler\Url $url
 * @param \Psr\Http\Message\ResponseInterface $response
 * @param \Spatie\Crawler\Url $foundOn
 */
public function hasBeenCrawled(Url $url, $response, Url $foundOn = null);

/**
 * Called when the crawl has ended.
 */
public function finishedCrawling();

执行JavaScript

默认情况下,爬虫不会执行JavaScript。这是启用JavaScript执行的方法

Crawler::create()
    ->executeJavaScript()
    ...

底层使用无头Chrome来执行JavaScript。以下是如何在您的系统上安装它的一些提示。

包将猜测Chrome在您的系统上的安装位置。您也可以手动将Chrome二进制文件的路径传递给executeJavaScript()

Crawler::create()
    ->executeJavaScript($pathToChrome)
    ...

过滤某些URL

您可以通过传递使用setCrawlProfile-函数来告诉爬虫不要访问某些URL。该函数期望一个实现了Spatie\Crawler\CrawlProfile-接口的对象

/*
 * Determine if the given url should be crawled.
 */
public function shouldCrawl(Url $url): bool;

此包自带三个CrawlProfiles

  • CrawlAllUrls:此配置文件将爬取所有页面上的所有URL,包括外部网站的URL。
  • CrawlInternalUrls:此配置文件将仅爬取主机页面上的内部URL。
  • CrawlSubdomainUrls:此配置文件将仅爬取主机页面上的内部URL及其子域名。

设置并发请求数量

为了提高爬取速度,默认情况下,该包并发爬取10个URL。如果您想更改该数字,可以使用setConcurrency方法。

Crawler::create()
    ->setConcurrency(1) //now all urls will be crawled one by one

设置最大爬取次数

默认情况下,爬虫将继续爬取,直到它爬取了提供的URL的每一页。如果您想限制爬虫应该爬取的URL数量,可以使用setMaximumCrawlCount方法。

// stop crawling after 5 urls

Crawler::create()
    ->setMaximumCrawlCount(5) 

设置最大爬取深度

默认情况下,爬虫将继续爬取,直到它爬取了提供的URL的每一页。如果您想限制爬虫的深度,可以使用setMaximumDepth方法。

Crawler::create()
    ->setMaximumDepth(2) 

使用自定义爬取队列

在爬取网站时,爬虫会将要爬取的URL放入队列中。默认情况下,此队列使用内置的CollectionCrawlQueue存储在内存中。

当一个站点非常大时,您可能希望将队列存储在其他地方,比如数据库。在这种情况下,您可以编写自己的爬取队列。

有效的爬取队列是任何实现了Spatie\Crawler\CrawlQueue\CrawlQueue接口的类。您可以通过爬虫上的setCrawlQueue方法传递自定义的爬取队列。

Crawler::create()
    ->setCrawlQueue(<implementation of \Spatie\Crawler\CrawlQueue\CrawlQueue>) 

更新日志

有关最近更改的更多信息,请参阅更新日志

贡献

有关详细信息,请参阅贡献指南

测试

要运行测试,您首先需要在单独的终端窗口中启动包含的基于节点的服务器。

cd tests/server
npm install
./start_server.sh

服务器运行后,您可以开始测试。

vendor/bin/phpunit

安全

如果您发现任何安全相关的问题,请通过电子邮件freek@spatie.be联系,而不是使用问题跟踪器。

明信片软件

您可以使用这个包,但如果它进入您的生产环境,我们非常希望您能从您的家乡给我们寄一张明信片,并说明您正在使用我们哪个包。

我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。

我们将所有收到的明信片发布在我们的公司网站上

致谢

支持我们

Spatie是一家位于比利时的安特卫普网络设计公司。您可以在我们的网站上找到我们所有开源项目的概述在这里

您的业务依赖于我们的贡献吗?请与我们联系,并在Patreon上支持我们。所有承诺都将专门用于分配人员以维护和新奇事物。

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件