Ошибка множественного цикла извлечения данных сканера веб-сайта PHP 404

Я хочу просканировать несколько веб-сайтов со списком концертов, чтобы составить окончательное руководство по листингу со ссылками на исходные веб-сайты.

Многие из этих веб-сайтов не имеют API, поэтому мне приходится использовать довольно грубо скомпонованный php-скрипт, который будет извлекать нужные мне данные. (например, дата, место проведения, страна и т. д.)

На большинстве сайтов есть довольно простой в использовании каталог концертов, но на некоторых сайтах требуется вручную вводить информацию, чтобы получать «релевантные» шоу.

Чтобы обойти это, я создал цикл, который работал на основе:

page.php?id=$counter+1

Таким образом, он находит последний вставленный концерт в базу данных и продолжает получать данные для следующих 100 или около того.

НО это работает только при условии, что концерты на сайте будут продолжаться точно в числовом отношении, и, конечно же, это не так из-за отмен и т. Д.

Это оставляет меня с прекрасным

Warning: file_get_contents(http://www.domain.com/show/page.php?id=123456) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in...

Как можно создать цикл, который сможет пропустить эти ошибки и продолжить работу, а не просто сидеть на них?

Ниже представлен весь код (Лимит +5 на данный момент для тестирования)

include_once('simple_html_dom.php');

$cntqry = mysql_query("SELECT * FROM `gigs_tbl` ORDER BY `counter` DESC LIMIT 1");
$cntnum = mysql_num_rows($cntqry);
if($cntnum!=0)
{
$cntget = mysql_fetch_assoc($cntqry); 
$start = $cntget['counter'];
}
else {
$start = 10767799;
}

$counter = 0;
$limit = $start +5;

for($start; $start < $limit; $start++) {
$counter = $start + 1;
$target_url = "http://www.domain.com/show/page.php?id=$counter";
$html = new simple_html_dom();
$html->load_file($target_url);
foreach($html->find('div[class=vevent]') as $showrow){
$artist = strip_tags($showrow->find('h2',0));
$genre = strip_tags($html->find('span[class=genre]',0));
$venue = strip_tags($showrow->find('span[class=location]',0));
$street = strip_tags($html->find('span[itemprop=streetAddress]',0));
$locality = strip_tags($html->find('span[itemprop=addressLocality]',0));
$postcode = strip_tags($html->find('span[itemprop=postalCode]',0));
$country = strip_tags($html->find('span[itemprop=addressRegion]',0));
$originalDate = strip_tags($html->find('meta[itemprop=startDate]',0)->content);
$newDate = date("U", strtotime($originalDate));
// INSERT
mysql_query("INSERT INTO `gigs_tbl` VALUES('','$counter','$newDate','$venue','$street','$locality','$postcode','$country','$gen    re','$artist','reverbnation')");
}
}

Десять виртуальных дайте пять любому, кто может догадаться, какой веб-сайт вызывает эту проблему;)


person smokeyhandgel    schedule 08.10.2013    source источник


Ответы (1)


find() возвращает NULL, если ничего не найдено ... Итак, способ сделать то, что вы хотите, - использовать это :)

Поскольку вы не предоставили настоящую ссылку, вот пример, объясняющий, как:

$start = 'u';

for($start; $start < 'x'; $start++) {

    // The only correct url is => http://sourceforge.net/p/mingw/bugs/
    $target_url = "http://sourceforge.net/p/ming".$start."/bugs/";

    echo "<br/> Link: $target_url";

    // @: supresses the errors when the page doesnt exist
    $data_string = @file_get_contents($target_url);

    $html = new simple_html_dom();
    // Load HTML from a string
    $html->load($data_string);

    // Find returns NULL if nothing found
    $search_elements = $html->find('#nav_menu_holder h1');

    if($search_elements) {
        echo "<br/> Page FOUND. Title => " . $search_elements[0]->plaintext;
    }
    else {
        echo "<br/> Page NOT FOUND !!";
    }

    echo "<hr>";

    // Clear DOM object
    $html->clear(); 
    unset($html);
}

PHP-Fiddle DEMO

person Enissay    schedule 08.10.2013
comment
Молодец! Спасибо за помощь :) - person smokeyhandgel; 09.10.2013