PHP Dom очищает большой объем данных

Мне нужно собрать некоторые данные с более чем 8000 страниц x 25 записей на странице. Это около 200 000 записей. Проблема в том, что сервер отклоняет мои запросы через некоторое время. Хотя я слышал, что это довольно медленно, я использовал simple_html_dom в качестве библиотеки для очистки. Это пример данных:

<table>
<tr>
<td width="50%" valign="top" style="font-size:12px;border-bottom:1px dashed #a2a2a2;">Data1</td>
<td width="50%" valign="top" style="font-size:12px;border-bottom:1px dashed #a2a2a2;">Data2</td>
</tr>
<tr>
<td width="50%" valign="top" style="font-size:12px;border-bottom:1px dashed #a2a2a2;">Data3</td>
<td width="50%" valign="top" style="font-size:12px;border-bottom:1px dashed #a2a2a2;">Data4</td>
</tr>
</table>

И скрипт очистки php:

<?php

$fileName = 'output.csv';

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");

$fh = @fopen('php://output', 'w');


ini_set('max_execution_time', 300000000000);

include("simple_html_dom.php");

for ($i = 1; $i <= 8846; $i++) {

    scrapeThePage('url_to_scrape/?page=' . $i);
    if ($i % 2 == 0)
        sleep(10);

}

function scrapeThePage($page)
{

    global $theData;


    $html = new simple_html_dom();
    $html->load_file($page);

    foreach ($html->find('table tr') as $row) {
        $rowData = array();
        foreach ($row->find('td[style="font-size:12px;border-bottom:1px dashed #a2a2a2;"]') as $cell) {
            $rowData[] = $cell->innertext;

        }

        $theData[] = $rowData;
    }
}

foreach (array_filter($theData) as $fields) {
    fputcsv($fh, $fields);
}
fclose($fh);
exit();

?>

Как видите, я добавил 10-секундный интервал ожидания в цикле for, чтобы не нагружать сервер запросами. Когда он предлагает мне загрузить CSV, у меня внутри есть эти строки:

Предупреждение: file_get_contents(url_to_scrape/?page=8846): не удалось открыть поток: HTTP-запрос не выполнен! HTTP/1.0 500 Internal Server Error Неустранимая ошибка: вызов функции-члена find() для необъекта в D:\www\htdocs\ucmr\simple_html_dom.php на линии 1113

Страница 8846 существует, и это последняя страница скрипта. Номер страницы варьируется в приведенной выше ошибке, поэтому иногда я получаю сообщение об ошибке, например, на странице 800. Может кто-нибудь, пожалуйста, дайте мне представление о том, что я делаю неправильно в этой ситуации. Любые советы будут полезны.


person user1584704    schedule 10.07.2013    source источник


Ответы (1)


Fatal выбрасывается, вероятно, потому, что $html или $row не является объектом, он становится null. Вы всегда должны пытаться проверить, правильно ли создан объект. Возможно также, что метод $html->load_file($page); возвращает false, если загрузка страницы не удалась.

Также познакомьтесь с instanceof - иногда это очень помогает.

Другое редактирование: ваш код не имеет проверки данных ВООБЩЕ. Нет места, где вы проверяете неинициализированные переменные, выгруженные объекты или методы, выполненные с ошибками. Вы всегда должны использовать их в своем коде.

person ex3v    schedule 10.07.2013
comment
Я думаю, $html становится нулевым, потому что удаленный сервер каким-то образом отклоняет некоторые из моих запросов. Я провел некоторое тестирование с первыми пятью страницами, и он выводит CSV со всеми данными, содержащимися на первых пяти страницах. - person user1584704; 10.07.2013
comment
Тем не менее, вы должны проверять наличие нулей / ложных значений, обрабатывать их (например, записывать нечитаемые страницы в файл или базу данных, чтобы вы могли проверить их позже) и переходить к следующей странице без перерыва. - person ex3v; 10.07.2013