doublench21
@doublench21

Скачиваем странички при помощи Curl, недочёты ?

<?php
set_time_limit(0);
ini_set('error_reporting', E_ALL);
ini_set('log_errors', '1');
ini_set('display_errors', '1');

$allUseragents = array(
    'Googlebot',
    'MSNBot',
    'Mozilla/1.1 (compatible; MSPIE 2.0; Windows CE)',
    'Mozilla/1.10 [en] (Compatible; RISC OS 3.70; Oregano 1.10)',
    'Mozilla/1.22 (compatible; MSIE 1.5; Windows NT)',
    'Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)',
    'Mozilla/1.22 (compatible; MSIE 2.0d; Windows NT)',
    'Mozilla/1.22 (compatible; MSIE 5.01; PalmOS 3.0) EudoraWeb 2',
    'Mozilla/2.0 (compatible; MSIE 3.01; Windows 98)',
    'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)',
    'Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC) Opera 6.0 [en]',
    'Mozilla/4.0 (compatible; MSIE 5.0; SunOS 5.9 sun4u; X11)',
    'Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.03 [ru]',
    'Mozilla/4.0 (compatible; MSIE 5.17; Mac_PowerPC)',
    'Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)',
    'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)',
    'Mozilla/4.0 (compatible; MSIE 6.0; ; Linux armv5tejl; U) Opera 8.02 [en_US] Maemo browser 0.4.31 N770/SU-18',
   //...
   
);
$links = array(
    '/.jar',
    '/.mclevel',
    '/.mclevel_(NBT)_Map_Format',
    '/.minecraft',
    '/.name',
    '//kill',
   //...

);
reset($links);

$maxThreads = 10; // скачивать будем в десять потоков
$multicurlInit = curl_multi_init();
do {
    while (@$active <= $maxThreads) {
        @$active++;
        if (count($links) == 0) {
            break;
        }

        $k = key($links);
        $link = $links[$k];
        unset($k);
        next($links);
        $agent = $allUseragents[array_rand($allUseragents)];
        $newThread = curl_init();
        curl_setopt_array($newThread, array(
                CURLOPT_URL => 'http://minecraft.gamepedia.com' . $link,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CONNECTTIMEOUT => 10,
                CURLOPT_TIMEOUT => 100,
                CURLOPT_USERAGENT => $agent,
                CURLOPT_FAILONERROR => false,
            )
        );
        curl_multi_add_handle($multicurlInit, $newThread);
        unset($newThread);
    }
    $curlMultiResult = curl_multi_exec($multicurlInit, $active);
    do {
        $result = curl_multi_info_read($multicurlInit);
        if (!is_array($result)) {
            break;
        }
        $info = curl_getinfo($result['handle']);
        $html = curl_multi_getcontent($result['handle']);
        file_put_contents(ltrim($link, "/") . ".html", $html);

        // var_dump($html);
        // echo "<pre>";
        // print_r($info);
        // flush();
        // echo "</pre>";
        curl_multi_remove_handle($multicurlInit, $result['handle']);
        curl_close($result['handle']);
    } while (true);
    if (count($links) == 0 && $active == 0) {
        break;
    }
} while (true);


Хочу скачать страницы всех статей MinecraftWiki (9000+ статей).
И возникает два вопроса. Чем может быть ограничено число потоков ? И не выкинет ли меня сам сервер Вики по прошествии времени ?
  • Вопрос задан
  • 2232 просмотра
Пригласить эксперта
Ответы на вопрос 1
Сама идея запускать это в одном скрипте и ждать долго-долго плохая. Лучше написать в скрипте, допустим, 100 операций и запускать его по хрону. Не забыть, конечно, проверять, что процесс предыдущий уже завершился. Так мы снимаем с себя все проблемы с утечками памяти и прочими подобными проблемами. Правда, придется еще заморочится с тем, что бы запомнинать где мы остановились.
Еще меня смущает такой список юзер-агентов. Если они нужны для того, что бы скрыть от админов сайта твои действия, то таких мер явно недостаточно. Я бы смотрел как минимум постарался добавить более реалистичную частотность появления юзер-агенов.
Еще хочется добавить, что если ты не хочешь создавать проблем админам сайта, то стоит подумать над искусственными задержками. Твоя нагрузка может оказаться для них критичной.

PS Я не знаю, как предполагается дальше работать с этими данными, но я не могу представить себе ситуацию, когда записывать все в файлики лучше, чем складывать аккуратно частями в базу. Под частями я имею ввиду некоторое логическое разделение хотя бы на текст и заголовок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы