boyhagemann/scrape

该包最新版本(dev-master)的许可证信息不可用。

dev-master 2014-06-16 08:23 UTC

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();
        });
    
    });

});