codeguy/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 修改了原始博客文章的代码(经许可),以符合 Composer 和 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 方法将抓取适配器设置为 PantherChromeAdapter,它基于 Symfony Panther

    $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 公共许可证