0

ブログから 43 件のブログ投稿をスクレイピングして配列に保存しようとしていますが、配列を print_r すると、43 件すべてではなく最初の 5 件のみが返されます [残りは空です]。なぜですか? そして、どうすれば43個すべてを入手できますか?このスクリプトは、WAMP の cmd.exe [コマンド ライン] から実行します。

    <?php

require 'src/QueryPath/QueryPath.php';


$qp1 = htmlqp('http://myblog.com/blog');
$qp2 = htmlqp('http://myblog.com/blog/Page-2.html');
$qp3 = htmlqp('http://myblog.com/blog/Page-3.html');
$qp4 = htmlqp('http://myblog.com/blog/Page-4.html');

foreach ($qp1->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp2->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp3->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}

foreach ($qp4->find('ol>li a[href],.jbReadon') as $item) {
    $links[] = $item->attr('href');
}


print_r($links);



foreach ($links as $link) {
    $url = "http://myblog.com".$link;

    $content[] = htmlqp($url)->find('.jbIntroText p')->text();
}
print_r($content);




?>

配列のキー 5 以降では、すべての値が空です。[ラップトップまたは Web から画像をアップロードできなかったので、cmd.exe のスクリーンショットへのリンクを示します] http://img546.imageshack.us/img546/6092/cmdafter5arrayisempty.jpg

私は明らかに初心者なので、このコードをより簡潔にする方法や、スクレイピング プロトタイプをより適切に達成する方法についての提案をいただければ幸いです。すべての建設的な批判も歓迎します:-P

4

2 に答える 2

0

私は私の問題を解決しました!! どうやら、私が必要としたのは、各クエリ/スクレイピング間の時間遅延だけでした。これは、ブログが大量のスクレイピングなどから保護されていたためです。私がしなければならなかったのは、コードの 2 番目の部分を次のように書き直すことだけです。

foreach ($links as $link) {
    $url = "http://myblog.com".$link;
    $count = count($links);
    $interval = 2; // Every three times...
    $wait = 2; // Wait two seconds.
        for ($i = 0; $i < $count; ++$i) {
        $content[] = htmlqp($url)->find('.jbIntroText p')->text();
        print_r($content);
            if ($i > 0 && $i % $interval == 0) {
            sleep($wait);
            }

        }
}

ここでアイデアを提供してくれた Technosophos に感謝

また、スクレイピングしようとしているブログを RSS/Atom フィードに変換する必要があるというアイデアにも感謝します。多くの場合、ブログには独自の RSS フィードが生成されていないためです。

于 2013-02-26T16:07:46.507 に答える
0

これらの FOR ループの少なくとも 1 つにいくつかの print ステートメントを追加することができます。ここでいくつかのことが起こっている可能性があります。最も可能性が高いのは次の 2 つです。

  • フィルターは 5 つのアイテムのみに一致する場合があります。
  • HTML パーサーが一部のマークアップで窒息している可能性があります。この場合、できるだけ多くの HTML DOM をロードしようとします。

いくつかの print ステートメントを追加することで、反復回数を確認できる場合があります。

余談ですが、ブログの記事のリストを取得しようとしている場合は、RSS または Atom フィードを読む方が簡単かもしれません (ただし、必要な情報がすべて含まれているとは限りません)。

于 2013-02-25T17:05:16.513 に答える