3

たとえば、無限ループ(imgurなど)を持つWebページをループ(ページ1ページ2など)でスクレイピングする方法を知りたいです...?

以下のコードを試しましたが、最初のページしか返されません。無限スクロール テンプレートのために次のページをトリガーするにはどうすればよいですか?

<?php
    $mr = $maxredirect === null ? 10 : intval($maxredirect);
    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
        curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    } else {
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

        if ($mr > 0) {
            $original_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
            $newurl = $original_url;
            $rch = curl_copy_handle($ch);

            curl_setopt($rch, CURLOPT_HEADER, true);
            curl_setopt($rch, CURLOPT_NOBODY, true);
            curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
            do {
                curl_setopt($rch, CURLOPT_URL, $newurl);
                $header = curl_exec($rch);
                if (curl_errno($rch)) {
                    $code = 0;
                } else {
                    $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
                    if ($code == 301 || $code == 302) {
                        preg_match('/Location:(.*?)\n/', $header, $matches);
                        $newurl = trim(array_pop($matches));

                        // if no scheme is present then the new url is a
                        // relative path and thus needs some extra care
                        if(!preg_match("/^https?:/i", $newurl)){
                            $newurl = $original_url . $newurl;
                        }
                    } else {
                        $code = 0;
                    }
                }
            } while ($code && --$mr);
            curl_close($rch);
            if (!$mr) {
                if ($maxredirect === null)
                    trigger_error('Too many redirects.', E_USER_WARNING);
                else
                    $maxredirect = 0;
                return false;
            }
            curl_setopt($ch, CURLOPT_URL, $newurl);
        }
    }
    return curl_exec($ch);
}

$ch = curl_init('http://www.imgur.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec_follow($ch);
curl_close($ch);

echo $data;
?>
4

2 に答える 2

2

cURLウェブページのソースコードを取得することで機能します。コードは元の Web ページからのみ HTML を収集します。imgur の場合、約 40 枚の画像と残りのページ レイアウトが含まれます。

この元のソース コードは、下にスクロールしても変わりません。ただし、ブラウザ内の HTML はそうです。これは AJAX で行われます。あなたが見ているページは、2 番目のページからの情報を要求しています。

FireBug (FireFox の場合) または Google Chrome のページ インスペクターを使用している場合は、[ネット] タブまたは [ネットワーク] タブ (それぞれ) に移動して、これらの要求を監視できます。下にスクロールすると、ページは別の約 45 件のリクエストを行います (主に画像用)。また、このページをリクエストしていることもわかります。

http://imgur.com/gallery/hot/viral/day/page/0?scrolled&set=1

imgur ホームページの JavaScript は、この HTML をホームページの下部に追加します。画像のリストを取得したい場合は、おそらくこのページ (または他の Chris が言ったように API) にクエリを実行することをお勧めします。URL の末尾にある数字をいじって、さらに多くの画像を取得できます。

于 2013-01-24T20:03:51.967 に答える
0

まさにこのような理由から、ページのスクレイピングが最善のアプローチになることはめったにありません。Imgur は、ハッキーなスクレイピングを使用せずに試行していると思われるタスクを実行する API を提供します。

スクレイピングのアイデアに結婚している場合は、いくつかの調査を行う必要があります. メイン ページのみをスクレイピングする代わりに、AJAX リクエストで使用される API に注意する必要があります。それを直接呼び出して、後続のページのデータをスクレイピングし続けることができます。このアプローチの詳細は、特に利用可能な確立された API があることを考えると、この回答の範囲を超えています。

関連資料

于 2013-01-24T19:53:22.317 に答える