zrashwani/arachnid

用于找到指定网站上所有唯一内部页面的爬虫

2.2.1 2021-10-19 19:45 UTC

README

此库将爬取给定网站上找到的所有唯一内部链接,直到达到指定的最大页面深度。

此库使用symfony/pantherFriendsOfPHP/Goutte库抓取网站页面并提取主要SEO相关信息,包括:titleh1元素h2元素statusCodecontentTypemeta描述meta关键词canonicalLink

此库基于Zeid Rashwani在这里的原始博客文章

http://zrashwani.com/simple-web-spider-php-goutte

Josh Lockhart在得到许可的情况下,将原始博客文章的代码(与Packagist兼容)进行了修改,并更新了语法以符合PSR-2编码标准。

Build Status codecov

赞助商

安装方法

您可以使用Composer安装此库。将以下内容添加到您的composer.json文件中

{
    "require": {
        "zrashwani/arachnid": "dev-master"
    }
}

然后运行composer install

入门指南

基本用法

以下是一个快速示例,演示如何爬取一个网站

    <?php
    require 'vendor/autoload.php';

    $url = 'http://www.example.com';
    $linkDepth = 3;
    // Initiate crawl, by default it will use http client (GoutteClient), 
    $crawler = new \Arachnid\Crawler($url, $linkDepth);
    $crawler->traverse();

    // Get link data
    $links = $crawler->getLinksArray(); //to get links as objects use getLinks() method
    print_r($links);

启用无头浏览器模式

可以启用无头浏览器模式,这样它将使用背景中的Chrome引擎,这对于获取基于JavaScript的网站的页面内容很有用。

enableHeadlessBrowserMode方法将用于抓取的适配器设置为基于Symfony Panther库的PantherChromeAdapter

    $crawler = new \Arachnid\Crawler($url, $linkDepth);
    $crawler->enableHeadlessBrowserMode()
            ->traverse()
            ->getLinksArray();

为了使用此功能,您需要在您的计算机上安装chrome-driver,您可以使用dbrekelmans/browser-driver-installer来本地安装chromedriver

composer require --dev dbrekelmans/bdi
./vendor/bin/bdi driver:chromedriver drivers

高级用法

通过在构造函数中指定选项数组或创建具有所需选项的Http客户端抓取器,设置底层http客户端的附加选项

    <?php
        use \Arachnid\Adapters\CrawlingFactory;
        //third parameter is the options used to configure http client
        $clientOptions = ['auth_basic' => array('username', 'password')];
        $crawler = new \Arachnid\Crawler('http://github.com', 2, $clientOptions);
           
        //or by creating and setting scrap client
        $options = array(
            'verify_host' => false,
            'verify_peer' => false,
            'timeout' => 30,
        );
                        
        $scrapperClient = CrawlingFactory::create(CrawlingFactory::TYPE_HTTP_CLIENT, $options);
        $crawler->setScrapClient($scrapperClient);

您可以将一个符合PSR-3的日志对象注入到爬虫中,以监控爬虫活动(如Monolog

    <?php    
    $crawler = new \Arachnid\Crawler($url, $linkDepth); // ... initialize crawler   

    //set logger for crawler activity (compatible with PSR-3)
    $logger = new \Monolog\Logger('crawler logger');
    $logger->pushHandler(new \Monolog\Handler\StreamHandler(sys_get_temp_dir().'/crawler.log'));
    $crawler->setLogger($logger);
    ?>

您可以通过使用filterLinks方法指定回调闭包来设置爬虫只访问具有特定标准的页面

    <?php
    //filter links according to specific callback as closure
    $links = $crawler->filterLinks(function($link) {
                        //crawling only links with /blog/ prefix
                        return (bool)preg_match('/.*\/blog.*$/u', $link); 
                    })
                    ->traverse()
                    ->getLinks();

您可以使用LinksCollection类获取有关链接的简单统计信息,如下所示

    <?php
    $links = $crawler->traverse()
                     ->getLinks();
    $collection = new LinksCollection($links);

    //getting broken links
    $brokenLinks = $collection->getBrokenLinks();
   
    //getting links for specific depth
    $depth2Links = $collection->getByDepth(2);

    //getting external links inside site
    $externalLinks = $collection->getExternalLinks();

如何贡献

  1. 分叉此存储库
  2. 为每个功能或改进创建一个新的分支
  3. 将您的代码更改与相应的单元测试一起应用
  4. 从每个功能分支发送拉取请求

将新功能或改进分开到单独的功能分支,并为每个分支发送拉取请求非常重要。这允许我分别审查和合并新功能或改进。

所有拉取请求都必须遵守PSR-2标准

系统需求

  • PHP 7.2.0+

作者

许可证

MIT公共许可证