codeguy / arachnid
一个用于查找给定网站上所有独特内部页面的爬虫
Requires
- php: >=7.2.0
- ext-spl: *
- fabpot/goutte: ^4.0
- guzzlehttp/psr7: ^1.4
- psr/log: ^1.1
- symfony/panther: ^1.0
- tightenco/collect: ^v8.34
Requires (Dev)
- dbrekelmans/bdi: ^0.3.0
- monolog/monolog: ^1.22
- phpunit/phpunit: ^7.5|^8.5|^9.2
- squizlabs/php_codesniffer: ^3.5
- symfony/var-dumper: ^v4.4
This package is not auto-updated.
Last update: 2022-02-01 12:29:50 UTC
README
此库会爬取给定网站上找到的所有独特内部链接,直到指定的最大页面深度。
此库使用 symfony/panther 和 FriendsOfPHP/Goutte 库抓取网站页面并提取主要的SEO相关信息,包括: title
,h1元素
,h2元素
,statusCode
,contentType
,meta描述
,meta关键词
和 canonicalLink
。
此库基于 Zeid Rashwani 在此的原始博客文章
http://zrashwani.com/simple-web-spider-php-goutte
Josh Lockhart 修改了原始博客文章的代码(经许可),以符合 Composer 和 Packagist,并更新了语法以符合 PSR-2 编码标准。
如何安装
您可以使用 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();
如何贡献
- 分支此存储库
- 为每个功能或改进创建一个新的分支
- 将代码更改与应用相应的单元测试一起应用
- 从每个功能分支发送拉取请求
将新功能或改进分开到单独的功能分支,并针对每个分支发送拉取请求非常重要。这使我能够单独审查和合并新功能或改进。
所有拉取请求都必须遵守PSR-2 编码规范。
系统要求
- PHP 7.2.0+
作者
- Josh Lockhart https://github.com/codeguy
- Zeid Rashwani http://zrashwani.com
许可证
MIT 公共许可证