/ / PHP Scraping z curl - Jak mogę debugować - php, curl, screen-scraping

Skrobanie PHP z curl - Jak mogę debugować - php, curl, screen-scraping

Właśnie dowiedziałem się, co to jest złomowanie i cUrlgodziny temu i od tego czasu gram z tym. Niemniej jednak stoję teraz przed czymś dziwnym. Poniższy kod działa poprawnie z niektórymi witrynami, a nie z innymi (oczywiście zmodyfikowałem adres URL i ścieżkę xpath ...). Zauważ, że nie wystąpił żaden błąd podczas testowania, czy curl_exec został wykonany poprawnie. Więc problem musi pochodzić z jakiegoś miejsca. Niektóre moje pytania są następujące:

  1. Jak mogę sprawdzić, czy nowy DOMDocument został prawidłowo utworzony: if (??)
  2. Jak mogę sprawdzić, czy nowy DOMDocument został poprawnie wypełniony HTML?
  3. ... jeśli został utworzony nowy obiekt DOMXPath?

Mam nadzieję, że byłam jasna. Z góry dziękuję za odpowiedzi. Twoje zdrowie. Marc

Mój 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";
}

?>

Odpowiedzi:

2 dla odpowiedzi № 1

Użyj try / catch, aby sprawdzić, czy obiekt dokumentuzostał utworzony, a następnie sprawdź wartość zwracaną przez loadHTML (), aby określić, czy HTML został załadowany do dokumentu. Możesz także użyć try / catch w obiekcie 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 dla odpowiedzi nr 2

Problem rozwiązany. Błąd pochodzi od firebuga, który podał niewłaściwą ścieżkę. Wielkie dzięki dla MrCode za jego wsparcie ...