gidlov / copycat
一款通用的抓取工具,可用于各种数据收集。您可以决定从哪里以及收集什么。全部使用正则表达式。更多详情请查看GitHub页面。
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-23 14:18:22 UTC
README
您可以在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 许可下发布。
感谢
如果这个库对您有帮助,请通过 购买我一杯咖啡 表示感谢 ☕!