【问题标题】:PHP Scraping with curl - How can I debug使用 curl 进行 PHP 抓取 - 我如何调试
【发布时间】:2012-03-28 20:11:41
【问题描述】:

我几个小时前才知道什么是报废和 cUrl,从那时起我就开始玩了。尽管如此,我现在面临着一些奇怪的事情。下面的代码适用于某些网站而不适用于其他网站(当然我修改了 url 和 xpath ...)。请注意,当我测试 curl_exec 是否正确执行时,我没有出现错误。所以问题一定来自之后的某个地方。我的一些问题如下:

  1. 如何检查新的 DOMDocument 是否已正确创建:if(??)
  2. 如何检查新的 DOMDocument 是否已正确填充 html?
  3. ...是否已创建新的 DOMXPath 对象?

希望我很清楚。预先感谢您的回复。干杯。马克

我的 php:

<?php
$target_url = "http://www.somesite.com";
$userAgent = 'Googlebot/2.1 (http://www.googlebot.com/bot.html)';

// make the cURL request to $target_url
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html= curl_exec($ch);

if (!$html) {
    echo "<br />cURL error number:" .curl_errno($ch);
    echo "<br />cURL error:" . curl_error($ch);
    exit;
}

// parse the html into a DOMDocument
$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->query('somepath');

for ($i = 0; $i < $hrefs->length; $i++) {
    $href = $hrefs->item($i);
    $url = $href->getAttribute('href');
    echo "<br />Link: $url";
}

?>

【问题讨论】:

  • +1 不使用正则表达式“解析”HTML。为了检测错误,请检查DOMDocument::loadHTML()的相应返回值,并可能删除抑制运算符@
  • 你好莱纳斯。感谢您的帮助。你能帮我看看语法吗?应该是:if(DOMDocument::loadHTML($html) {}else{}) 吗?
  • 您还可以通过在成功的curl_exec() 之后探测 HTTP 响应代码(这是通过 curl_getinfo() 并使用 CURLINFO_HTTP_CODE 完成的)来扩展您的“did-curl-execute”检查。跨度>
  • 在我的代码正常工作和不工作的两个站点中,curl_getinfo() 返回代码 200,表示正常。所以问题出在其他地方。这开始让我发疯了....
  • @LinusKleen - 我在 curl_execution 后回显后检查了 html 源代码,似乎每行之间都有一个小“段落图标”(请参阅​​我在主帖中所做的编辑)你认为这可能是原因吗?

标签: php curl screen-scraping


【解决方案1】:

使用 try/catch 检查是否创建了文档对象,然后检查 loadHTML() 的返回值以确定 HTML 是否已加载到文档中。您也可以在 XPath 对象上使用 try/catch。

try
{
    $dom = new DOMDocument();

    $loaded = $dom->loadHTML($html);

    if($loaded)
    {
        // loaded OK
    }
    else
    {
        // could not load HTML
    }
}
catch(Exception $e)
{
    // document could not be created, see $e->getMessage()
}

【讨论】:

  • 你好 MrCode。谢谢您的帮助。我使用您的建议,但似乎对于我的代码不起作用的站点,DOM 已正确加载。你有什么想法,提示我应该在哪里寻找线索,为什么它在某些网站上不起作用?
  • 在将 HTML 加载到 DOMDocument 之前打印出 HTML,检查 HTML 看起来是否正确,并且它是您要查找的页面,其中包含正确的内容。如果服务器检测到它是机器人/脚本,您可能会被重定向或显示错误页面。不同的网站会有不同的 HTML 结构,因此您需要相应地更改您的查询,除非您正在寻找像 title 这样非常通用的东西。
  • 我在写这篇文章之前检查了这一点。如果我回显 $html 它会正确显示...当您说网站具有不同的 html 结构时,我需要寻找什么?
  • 我在 curl_execution 后回显后检查了 html 源代码,似乎每行之间都有一个小“段落图标”。 (见我在主帖中所做的编辑)你认为这可能是原因吗?
  • 你想从 HTML 中提取什么样的数据?
【解决方案2】:

问题解决了。错误来自给出错误路径的萤火虫。非常感谢 MrCode 的支持...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 2011-07-21
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多