PHP Scraping with curl - Как мне отладить - PullRequest
3 голосов
/ 12 марта 2012

Я только что узнал, что такое утилизация и cUrl несколько часов назад, и с тех пор я играю с этим. Тем не менее, сейчас я сталкиваюсь с чем-то странным. Приведенный ниже код прекрасно работает с некоторыми сайтами, а не с другими (конечно, я изменил url и xpath ...). Обратите внимание, что при проверке правильности выполнения curl_exec у меня не возникает никаких ошибок. Так что проблема должна прийти откуда-то после. Вот некоторые мои вопросы:

  1. Как я могу проверить, правильно ли создан новый DOMDocument: if (??)
  2. Как я могу проверить, правильно ли заполнен новый DOMDocument html?
  3. ... если был создан новый объект DOMXPath?

Надеюсь, мне было ясно. Заранее благодарю за ваши ответы. Приветствия. Marc

Мой 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";
}

?>

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Используйте команду try / catch, чтобы проверить, был ли создан объект документа, а затем проверьте возвращаемое значение loadHTML (), чтобы определить, был ли HTML загружен в документ. Вы также можете использовать try / catch для объекта XPath.

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()
}
0 голосов
/ 13 марта 2012

Проблема решена.Ошибка произошла от Firebug, который дал неверный путь.Большое спасибо MrCode за поддержку ...

...