Я пытаюсь очистить страницы веб-сайта, чтобы получить определенный текстовый контент. Новые страницы всегда добавляются, поэтому я хочу иметь возможность просто увеличивать каждую страницу (используя URL-адрес фиксированного формата), пока не получу 404.
Страницы имеют следующий формат:
http://thesite.com/page-1.html
http://thesite.com/page-2.html
http://thesite.com/page-3.html
...так далее....
Все работает гладко, пока не достигает 36-й страницы, а затем просто умирает (даже не попадает в тестовый пример 404). Я знаю, что в этом примере существует около 100 страниц, и я без проблем могу просмотреть их все вручную. Также на 36-й странице нет ошибки.
Тестовый пример. Я пытался пройти через http://google.com 50 раз, и у меня не было проблем с рекурсией cURL. . Просто кажется, что это веб-сайт, который я действительно хочу использовать cURL, или что-то с моим сервером.
Кажется, это какое-то ограничение либо на удаленном сервере, либо на моем сервере, так как я могу запускать эту страницу снова и снова без задержки, и я всегда прочитываю 36 страниц, прежде чем она умрет.
Могут ли удаленные серверы устанавливать ограничение на количество запросов cURL? Есть ли другие тайм-ауты, которые мне нужно увеличить? Возможна ли проблема с памятью сервера?
**Функция рекурсивного извлечения: ** (Объект $curl создается при первом вызове метода, а затем просто передается по ссылке. Я читал, что это лучше, чем создавать и закрывать большое количество объектов cURL)
function scrapeSite(&$curl,$preURL,$postURL,$parameters,$currentPage){
//Format URL
$formattedURL = $preURL.$currentPage.$postURL;
echo "Formatted URL: ".$formattedURL."<br>";
echo "Count: ".$currentPage."<br>";
//Create CURL Object
curl_setopt($curl, CURLOPT_URL, $formattedURL);
//Set PHP Timeout
set_time_limit(0);// to infinity for example
//Check for 404
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if($httpCode == 404 || $currentPage == 50) {
curl_close($curl);
return 'PAGE NOT FOUND<br>';
}
//Set other CURL Options
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,0);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 400); //timeout in seconds
$content = curl_exec($curl);
$html = str_get_html($content);
echo "Parameter Check: ".is_array($html->find($parameters))."<br>";
if(is_array($html->find($parameters))>0){
foreach($html->find($parameters) as $element) {
echo "Text: ".$element->plaintext."<br>";
}
return scrapeSite($curl,$preURL,$postURL,$parameters,$currentPage+1);
}else{
echo "No Elements Found";
}
}