Как можно с помощью PHP свернуть веб-страницу с бесконечной прокруткой?
Я хотел бы знать, как можно зациклить в цикле (страница 1 страница 2etc....) веб-страницу, которая имеет бесконечные циклы (например, 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;
?>
2 ответа
cURL
работает, получая исходный код веб-страницы. Ваш код будет собирать HTML только с оригинальной веб-страницы. В случае imgur, он будет содержать около 40 изображений плюс остальная часть макета страницы.
Этот оригинальный исходный код не изменяется при прокрутке вниз. Тем не менее, HTML внутри вашего браузера делает. Это сделано с AJAX. Страница, на которую вы смотрите, запрашивает информацию со второй страницы.
Если вы используете FireBug (для FireFox) или инспектор страниц Google Chrome, то вы можете отслеживать эти запросы, перейдя на вкладку Сеть или Сеть (соответственно). Когда вы прокручиваете страницу вниз, на странице будет еще около 45 запросов (в основном для изображений). Вы также увидите, что он запрашивает эту страницу:
https://imgur.com/gallery/hot/viral/day/page/0?scrolled&set=1
JavaScript на домашней странице imgur добавляет этот HTML-код в конец домашней страницы. Возможно, вы захотите запросить эту страницу (или API, как сказал Chris Baker), если вы хотите получить список изображений. Вы можете играть с числами в конце URL, чтобы получить больше изображений.
Очистка страниц редко является лучшим подходом по причинам, подобным этому. Imgur предлагает API, который решает задачи, которые, как я полагаю, вы пытаетесь выполнить, не прибегая к хакерской проверке.
Если вы женаты на идее перескакивать, вам придется провести некоторое исследование. Вместо того, чтобы очищать только главную страницу, вам нужно отметить API, используемый запросом AJAX, вы можете напрямую обратиться к нему и продолжить очистку последующих страниц данных. Специфика этого подхода выходит за рамки этого ответа, особенно учитывая, что существует установленный API.
Связанное Чтение
- Imgur API - http://api.imgur.com/
- Сомнительная законность несанкционированного удаления страниц - http://en.wikipedia.org/wiki/Web_scraping