gidlov/copycat

一款通用的抓取工具,可用于各种数据收集。您可以决定从哪里以及收集什么。全部使用正则表达式。更多详情请查看GitHub页面。

v1.0.5 2017-08-30 20:09 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:18:22 UTC


README

Latest Stable Version Total Downloads Monthly Downloads Reference Status Software License

您可以在gidlov.com/en/code/copycat上找到更多信息

针对Laravel 5/4开发者

composer.json文件的require键中添加以下内容

"gidlov/copycat": "1.*"

运行Composer的update命令。

针对Laravel 5开发者

app/config/app.php文件中将以下内容添加到providers

Gidlov\Copycat\CopycatServiceProvider::class,

并添加到同一文件的aliases

'Copycat' => Gidlov\Copycat\Copycat::class,

针对Laravel 4开发者

app/config/app.php文件中将以下内容添加到providers

'Gidlov\Copycat\CopycatServiceProvider',

并添加到同一文件的aliases

'Copycat' => 'Gidlov\Copycat\Copycat',

另一个抓取类

在编写这个类之前,我并没有做太多研究,所以可能已经有类似的东西,肯定有一些更不错的解决方案。这个类的Python版本正在开发中

但仍然,我需要一个可以从中提取所选片段的类,使用正则表达式显示或保存它。我还需要能够保存文件和或图片,并指定或完成当前文件名。

还可以使用搜索引擎查找地址以提取数据。假设您已为该特定页面输入了表达式。

简要说明

  • 使用正则表达式,匹配一个或全部。
  • 可以下载并保存具有自定义文件名的文件。
  • 可以按顺序搜索数千甚至数万个页面。
  • 可以使用搜索引擎查找正确的页面。
  • 还可以为所有项目应用回调函数。

如何使用此类

包含类,并使用一些自定义的cURL参数初始化对象,如果需要或喜欢的话。

require_once('copycat.php');
$cc = new Copycat;
$cc->setCURL(array(
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_CONNECTTIMEOUT => 5,
  CURLOPT_HTTPHEADER, "Content-Type: text/html; charset=iso-8859-1",
  CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',
));

在这些示例中,我将IMDb作为目标源。

假设我们想要检索一部特定电影的评分,为了简单起见,我们恰好知道这部电影的确切地址,Donnie Darko。代码可能如下所示。

$cc->match(array(
    'score' => '/itemprop="ratingValue">(.*?)</ms',))
  ->URLs('http://imdb.com/title/tt0246578/')

基本上就是所有内容。我们指定要匹配的内容,并为它命名,然后输入一个地址。我们的答案数组将如下所示

Array (
  [0] => Array (
    [score] => 8.1
  )
)

如果我们给URLs()方法一个关联数组而不是一个字符串array('Donnie Darko' => 'http://imdb.com/title/tt0246578/'),则结果将如下所示

Array (
  [Donnie Darko] => Array (
    [score] => 8.1
  )
)

请注意,我正在使用方法链,这是支持的,但这纯粹是个人喜好。

但我们不太可能知道或猜测IMDb为特定电影选择的URL,所以当我们不知道时,我们将使用Binging它 (Google往往在未知数量的查询后中断序列,因此我选择了Binging)

$cc->match(array(
    'score' => '/itemprop="ratingValue">(.*?)</ms',))
  ->fillURLs(array(
    'query' => 'http://www.bing.com/search?q=',
    'regex' => '/<a href="(http:\/\/www.imdb.com\/title\/tt.*?\/)".*?>.*?<\/a>/ms',
    'to' => 'match',
    'keywords' => array(
      'imdb+donnie+darko',)))

现在我们引入了fillURLs(),它包括一个搜索查询,一个匹配目标页面的正则表达式和代表搜索的关键词。结果与第一个示例相同。

让我们更深入地了解这部电影。原始标题、评分和投票、上映年份、导演、主演演员,当然还有封面图片。图片的原始文件名可能类似于MV5BMTczMzE4Nzk3N15BMl5BanBnXkFtZTcwNDg5Mjc4NA @ @. V1_SX214.jpg,所以我们将其重命名为标题。

$cc->match(array(
    'title' => '/<title>(.*?)\(.*?<\/title>/ms',
    'description' => '/itemprop="description">(.*?)</ms',
    'score' => '/itemprop="ratingValue">(.*?)</ms',
    'votes' => '/itemprop="ratingCount">(.*?)</ms',
    'year' => '/class="nobr">.*?>(.*?)</ms',
    'file' => array(
      'key' => 'title',
      'directory' => 'poster',
      'after_key' => '.jpg',
      'regex' => '/img_primary">.*?src="(.*?)".*?<\/td>/ms',)))
  ->matchAll(array(
    'actors' => '/itemprop="actor.*?itemprop="name">(.*?)</ms',))
  ->fillURLs(array(
    'query' => 'http://www.bing.com/search?q=',
    'regex' => '/<a href="(http:\/\/www.imdb.com\/title\/tt.*?\/)".*?>.*?<\/a>/ms',
    'to' => 'match',
    'keywords' => array(
      'imdb+donnie+darko',
      'imdb+stay')))

此类操作的最终结果将提供

Array (
  [0] => Array (
    [title] => Donnie Darko
    [description] => A troubled teenager is plagued by visions of a large bunny rabbit that manipulates him to commit a series of crimes, after narrowly escaping a bizarre accident.
    [score] => 8.1
    [votes] => 363,099
    [year] => 2001
    [Donnie Darko.jpg] => http://ia.media-imdb.com/images/M/MV5BMTczMzE4Nzk3N15BMl5BanBnXkFtZTcwNDg5Mjc4NA@@._V1_SX214_.jpg
    [actors] => Array (
      [0] => Jake Gyllenhaal
      [1] => Jake Gyllenhaal
      [2] => Holmes Osborne
      [3] => Maggie Gyllenhaal
      [4] => Daveigh Chase
      [5] => Mary McDonnell
      [6] => James Duval
      [7] => Arthur Taxier
      [8] => Patrick Swayze
      [9] => Mark Hoffman
      [10] => David St. James
      [11] => Tom Tangen
      [12] => Jazzie Mahannah
      [13] => Jolene Purdy
      [14] => Stuart Stone
      [15] => Gary Lundy
    )
  )
  [1] => Array (
    [title] => Stay
    [description] => This movie focuses on the attempts of a psychiatrist to prevent one of his patients from committing suicide while trying to maintain his own grip on reality.
    [score] => 6.7
    [votes] => 43,222
    [year] => 2005
    [Stay.jpg] => http://ia.media-imdb.com/images/M/MV5BMTIzODM1NjE4N15BMl5BanBnXkFtZTcwNzY4NDE5MQ@@._V1_SY317_CR6,0,214,317_.jpg
    [actors] => Array (
      [0] => Ewan McGregor
      [1] => Ewan McGregor
      [2] => Ryan Gosling
      [3] => Kate Burton
      [4] => Naomi Watts
      [5] => Elizabeth Reaser
      [6] => Bob Hoskins
      [7] => Janeane Garofalo
      [8] => BD Wong
      [9] => John Tormey
      [10] => José Ramón Rosario
      [11] => Becky Ann Baker
      [12] => Lisa Kron
      [13] => Gregory Mitchell
      [14] => John Dominici
      [15] => Jessica Hecht
    )
  )
)

在所有值项上应用您的回调函数,并查看结果。

  ->callback(array(
    '_all_' => array('trim'
    ),
  );

$result = $cc->get();

要在选定的元素上应用函数,将 _all_ 替换为您的键值,如下所示

  ->callback(array(
    '_all_' => array('trim'),
    'title' => array(
      function($string) {
        return str_replace(' ', '_', $string);
      },
    ),
    'actors' => array(
      function($string) {
        return $string.', ';
      },
    ),
  ));

请注意,使用 匿名函数 也是可以的。

缺点

PHP 本身不适合长时间运行的操作,因为一旦用户关闭网页,或者 PHP 的时间限制达到,进程就会被中断(然而在构造方法中使用了 set_time_limit(0),因此在这里应该没有问题)。

要求

  • PHP 5.3
  • cURL 扩展

许可证

Copycat 在 LGPL 许可下发布。

感谢

如果这个库对您有帮助,请通过 购买我一杯咖啡 表示感谢 ☕!