11

问题
无法完全理解 Goutte 网络爬虫。

请求
有人可以帮助我理解或提供代码来帮助我更好地理解如何使用 Goutte 网络爬虫吗?我已经阅读了 README.md。我正在寻找比提供的信息更多的信息,例如 Goutte 中可用的选项以及如何编写这些选项,或者当您查看表单时,您是否搜索表单的 name= 或 id=?

试图被抓取的网页布局
第 1 步
网页有一个表单,有一个单选按钮来选择要填写的表单类型(即名称或许可证)。它默认为带有名字和姓氏文本框的名称以及状态下拉菜单选择列表。如果您选择 Radio,则 jQuery 或 JavaScript 会使 First Name 和 Last Name 文本框消失,并出现 License 文本框。

第 2 步
成功提交表单后,它会将您带到一个包含多个链接的页面。我们可以进入其中两个来获取我们需要的信息。

第 3 步
成功单击链接后,我们希望第三页包含我们正在寻找的数据,并且我们希望将该数据存储到 php 变量中。

提交错误信息
如果提交错误信息,则 jQuery/Javascript 将返回“未找到记录”消息。在与提交相同的页面上。

注意
首选方法是选择许可证单选按钮,填写许可证号,选择州,然后提交表格。我已经阅读了大量关于 Goutte 的帖子和博客以及其他项目,但我无处可找到 Goutte 可用的选项、如何找到此信息或如何使用此信息(如果确实存在)。

4

2 回答 2

18

您要查看的文档是Symfony2 DomCrawler

Goutte 是基于Guzzle构建的客户端,每次请求/提交时都会返回 Crawlers:

use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://www.symfony-project.org/');

使用这个爬虫,你可以做一些事情,比如获取正文中的所有 P 标签:

$nodeValues = $crawler->filter('body > p')->each(function (Crawler $node, $i) {
    return $node->text();
});
print_r($nodeValues);

填写并提交表格:

$form = $crawler->selectButton('sign in')->form(); 
$crawler = $client->submit($form, array(
        'username' => 'username', 
        'password' => 'xxxxxx'
));

在 Crawler 上可以使用 selectButton() 方法,该方法返回另一个与给定文本匹配的按钮(input[type=submit]、input[type=image] 或 button)的 Crawler。[ 1 ]

您单击链接或设置选项,选择复选框等,请参阅表单和链接支持

要从爬虫获取数据,请使用htmlortext方法

echo $crawler->html();
echo $crawler->text();
于 2013-10-08T20:35:06.300 回答
0

经过多次试验和错误,我发现有一个比 goutte 更容易、有据可查、更好的帮助(如果需要)和更有效的刮刀。如果您遇到 goutte 问题,请尝试以下操作:

  1. 简单的 HTML Dom:http ://simplehtmldom.sourceforge.net/

如果您的情况与我相同,您尝试抓取的页面需要来自他们自己网站的引荐来源网址,那么您可以使用 CURL 和 Simple HTML DOM 的组合,因为 Simple HTML DOM 似乎没有能力发送推荐人。如果您不需要引荐来源网址,则可以使用 Simple HTML DOM 来抓取页面。

$url="http://www.example.com/sub-page-needs-referer/";
$referer="http://www.example.com/";
$html=new simple_html_dom(); // Create a new object for SIMPLE HTML DOM
/** cURL Initialization  **/
$ch = curl_init($url);

/** Set the cURL options **/
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER,$referer);
$output = curl_exec($ch);

if($output === FALSE) {
  echo "cURL Error: ".curl_error($ch); // do something here if we couldn't scrape the page
}
else {
  $info = curl_getinfo($ch);
  echo "Took ".$info['total_time']." seconds for url: ".$info['url'];
  $html->load($output); // Transfer CURL to SIMPLE HTML DOM
}

/** Free up cURL **/
curl_close($ch);

// Do something with SIMPLE HTML DOM.  It is well documented and very easy to use.  They have a lot of examples.
于 2013-03-29T01:08:04.800 回答