有哪些可用的PHP网络爬虫库?

9

2
没有爬虫会进行数据抓取,这是你自己需要编写的。同时,确保你提取的内容没有侵犯版权。 - Richard H
可能是解析HTML的最佳方法的重复问题。 - Gordon
http://stackoverflow.com/search?q=web+crawler+php 可能存在其他重复内容。 - Gordon
@Gordon - 抱歉,我不需要解析HTML的帮助。 - Jason
@Jason 如果您不需要解析HTML的帮助,那么也许您应该澄清您想要什么。爬取的HTML不会自动转换为您认为重要的块。它必须被解析。请更新您的问题,指出您正在寻找什么或至少您不在寻找什么。此外,请浏览链接的搜索结果,看看它们是否包含有用的提示。如果您仍然有问题,请在您的问题中指出。换句话说:http://stackoverflow.com/questions/ask-advice - Gordon
可能是Scraping and Web crawling framework的重复问题。 - Gordon
8个回答

4

自从这个合并(https://github.com/FriendsOfPHP/Goutte/pull/397)之后,Goutte除了从Symfony继承的“Class Client extends HttpBrowser”之外,不再添加任何内容。因此,您可以直接使用Symfony HttpBrowser。 - Grzegorz

4

尝试使用Snoopy

摘自:"Snoopy是一个PHP类,模拟web浏览器。它自动化了检索网页内容和提交表单的任务,例如。"


4
抱歉,虽然这是一个旧帖子,但人们仍在阅读这个答案。我给它点了踩,因为Snoopy使用正则表达式解析HTML并不好。这里有关于这个问题的正式解释。 - fernandosavio

2

1
建议使用第三方替代品 SimpleHtmlDom,实际上使用 DOM 而不是字符串解析的有:phpQueryZend_DomQueryPathFluentDom - Gordon

2

在我发现phpQuery之前,我使用了约3年的Simple HTML DOM。phpQuery更快,不会递归地工作(您实际上可以将其转储),并且完全支持jQuery选择器和方法。


1
@Gordon 不是,它们是jQuery选择器。来自jQuery.com的描述:“借鉴了CSS 1-3,然后添加了自己的内容,jQuery提供了一组强大的工具,用于匹配文档中的一组元素。” - Kemo
嗯,好的。它们是在 CSS 选择器的基础上扩展的。那么我想这是一个有效的区别。抱歉。当人们谈论 jQuery 选择器时,我很少看到有人使用不在 CSS 选择器集合中的任何内容。他们让人觉得 jQuery 发明了它们。 - Gordon
1
@Gordon,是的,我也讨厌“好像我们发明了它们”的部分 :) 更多信息请参见sizzlejs.com。 - Kemo

2

这里有一个很棒的教程在这里,它结合了guzzlehttpsymfony/dom-crawler

如果链接丢失,你可以使用以下代码。

use Guzzle\Http\Client;
use Symfony\Component\DomCrawler\Crawler;
use RuntimeException;

// create http client instance
$client = new GuzzleHttp\ClientClient('http://download.cloud.com/releases');

// create a request
$response = $client->request('/3.0.6/api_3.0.6/TOC_Domain_Admin.html');

// get status code
$status = $response->getStatusCode();

// this is the response body from the requested page (usually html)
//$result = $response->getBody();

// crate crawler instance from body HTML code
$crawler = new Crawler($response->getBody(true));

// apply css selector filter
$filter = $crawler->filter('div.apismallbullet_box');
$result = array();

if (iterator_count($filter) > 1) {

    // iterate over filter results
    foreach ($filter as $i => $content) {

        // create crawler instance for result
        $cralwer = new Crawler($content);
        // extract the values needed
        $result[$i] = array(
            'topic' => $crawler->filter('h5')->text();
            'className' => trim(str_replace(' ', '', $result[$i]['topic'])) . 'Client'
        );
    }
} else {
    throw new RuntimeException('Got empty result processing the dataset!');
}

1

1

我知道这是一个有点陈旧的问题。自那时以来,许多有用的库已经出现了。

试试Crawlzone。它是一个快速、文档完整、异步网络爬行框架,具有许多强大的功能:

  • 可定制并发的异步爬取。
  • 根据您正在爬取的网站的负载自动调节爬取速度。
  • 如果配置,自动过滤掉被robots.txt排除标准禁止的请求。
  • 简单的中间件系统允许您附加标头、提取数据、过滤或插入任何自定义功能以处理请求和响应。
  • 丰富的过滤能力。
  • 设置爬行深度的能力
  • 通过事件钩子轻松扩展核心。
  • 随时关闭爬虫并重新开始而不会丢失进度。

还可以看看我写的文章:

https://www.codementor.io/zstate/this-is-how-i-crawl-n98s6myxm


-3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接