【问题标题】:How can be scraped using PHP curl a webpage with infinite scroll?如何使用 PHP curl 抓取无限滚动的网页?
【发布时间】:2013-01-03 06:56:17
【问题描述】:

我想知道如何在循环中抓取(第 1 页第 2 页等....)具有无限循环的网页(例如 imgur)...?

我尝试了下面的代码,但它只返回第一页。无限滚动模板如何触发下一页?

<?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;
?>

【问题讨论】:

    标签: php curl imgur


    【解决方案1】:

    由于类似的原因,页面抓取很少是最佳方法。 Imgur offers an API 完成了我假设您正在尝试的任务,而无需使用任何 hacky 抓取。

    如果您接受了抓取的想法,则必须进行一些研究。您需要注意 AJAX 请求使用的 API,而不是只抓取主页,您可以直接调用该 API 并继续抓取后续页面的数据。这种方法的细节超出了这个答案的范围,特别是考虑到有一个可用的 API。

    相关阅读

    【讨论】:

    • 好的,我知道操作 imgur API 既方便又容易,但是我们如何管理任何其他无限滚动的网站呢?我们应该只通过 AJAX 请求处理吗?
    • 如果没有提供公共 API,那么就是这样做的,正如另一位 Chris 在他的回答中更详细地描述的那样(我在这里提到)。
    【解决方案2】:

    cURL 通过获取网页的源代码来工作。您的代码将仅从原始网页收集 HTML。在 imgur 的情况下,它将包括约 40 张图像,以及页面布局的其余部分。

    当您向下滚动时,此原始源代码不会更改。但是,浏览器中的 HTML 可以。这是通过 AJAX 完成的。您正在查看的页面从第二个页面请求信息。

    如果您使用 FireBug(用于 FireFox)或 Google Chrome 的页面检查器,那么您可以通过转到“网络”或“网络”选项卡(分别)来监控这些请求。当您向下滚动时,该页面将再发出约 45 个请求(主要用于图像)。您还会看到它请求此页面:

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

    imgur 主页上的 JavaScript 将此 HTML 附加到主页底部。如果您想获取图像列表,您可能想查询此页面(或 API,如 the other Chris 所说)。您可以使用 URL 末尾的数字来获取更多图像。

    【讨论】:

    • 用 Firebug 检查的好主意!谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2020-02-18
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多