boyhagemann / scrape
该包最新版本(dev-master)的许可证信息不可用。
dev-master
2014-06-16 08:23 UTC
Requires
- php: >=5.3.0
- guzzle/guzzle: *
- illuminate/support: 4.2.*
This package is not auto-updated.
Last update: 2024-09-14 15:58:05 UTC
README
使用这个出色的 Laravel 4 包,您可以
- 从页面抓取任何内容
- 遵循特定的链接路径以获取该内容
- 使用闭包以获得最佳可用性
如何安装
使用 Composer 安装并包含所有依赖项:composer require boyhagemann/scrape *
然后您将 ServiceProvider 添加到应用配置中
'Boyhagemann\Scrape\ScrapeServiceProvider'
您可以选择添加别名
'Scraper' => 'Boyhagemann\Scrape\Facades\Container'
它是如何工作的?
Scrape 使用两个组件来抓取页面
容器
容器是在大多数情况下您将使用的单个类。它使用一个名称和一个闭包注册了如何抓取页面的信息。
页面
页面是一个用于许多 URL 的模板。例如,一个新闻条目页面。它可以有多个 URL,但有一个页面模板。使用 Scrape,您可以定义如何处理该页面的内容。
添加页面
您要做的第一件事是将页面添加到容器中。
Scraper::add('my-first-page', function() { // Start scraping... });
如果您不使用外观,您可以进行如下操作
$container = App::make('Boyhagemann\Scrape\Container'); $container->add('my-second-page', function($crawler) { // Your magic scraping starts here... });
现在开始抓取!
定义了所有页面后,您就可以开始抓取内容了!这非常简单,如下所示
Scraper::scrape('my-first-page', 'http://theurl.toscrape.com');
如何使用爬虫
Scrape 使用 Symfony DomCrawler 组件从 URL 中抓取 HTML。您可以通过查看其文档来获取完整详细信息。为了在您的 IDE 中使用自动完成,将 $crawler 变量类型提示是很有用的。
use Symfony\Component\DomCrawler\Crawler; Scraper::add('page-name', function(Crawler $crawler) { // You have autocompletion on the $crawler instance... });
抓取策略
大多数情况下,您并不知道所有要抓取的 URL。如果您有成千上万的 URL 要抓取,手动管理这是不可能的。您可以使用 Scrape 来跟随链接以获取所需的内容。
链式页面
您可以非常轻松地连续抓取多个页面
// Add a page that has links to your content Scraper::add('page-1', function($crawler) { $crawler->filter('.your-link')->each(function($node) { Scraper::scrape('page-2', $node->attr('href')); }); }); // Add the page with all the content Scraper::add('page-2', function($crawler) { $crawler->filter('.your-content')->each(function($node) { // Get the content and do a little dance! }); });
不再有超时时间!
链式进程可能需要大量的时间和资源,因此不要将所有内容都链在一起。您可以使用 Laravel Queue 或数据库结合 cron 作业来管理所有页面抓取。这将让您免受讨厌的请求超时的困扰!
Scraper::add('page-1', function($crawler) { $crawler->filter('.link')->each(function($node) { // Put the next crawl on a queue Queue::push(function($job) use ($node) { // Scrape this page! Scraper::scrape('page-2', $node->attr('href')); // Delete the queue job once finished $job->delete(); }); }); });