0

8000 ページ x 1 ページあたり 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();

?>

ご覧のとおり、for ループに 10 秒のスリープ間隔を追加したので、リクエストでサーバーにストレスがかかりません。CSV のダウンロードを求めるプロンプトが表示されたら、その中に次の行があります。

警告: file_get_contents(url_to_scrape/?page=8846): ストリームを開くことができませんでした: HTTP 要求が失敗しました! HTTP/1.0 500 Internal Server Error Fatal error : D:\www\htdocs\ucmr\simple_html_dom.phpの1113行目の非オブジェクトに対するメンバー関数 find() の呼び出し

8846 ページは存在し、スクリプトの最後のページです。上記のエラーではページ番号が異なるため、たとえば 800 ページでエラーが発生することがあります。この状況で私が間違っていることを誰か教えてください。どんなアドバイスも役に立ちます。

4

1 に答える 1