doublench21
@doublench21

Почему crawler на 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)',
    // ...
    'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/10.00',
    'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.9.168 Version/11.51',
    'Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.10',
    'Opera/9.80 (X11; Linux x86_64; U; ru) Presto/2.2.15 Version/10.10',
    'StackRambler',
    'Yandex'
);
$links = array(
    '/.jar',
    '/.mclevel',
    '/.mclevel_(NBT)_Map_Format',
    '/.minecraft',
    '/.name',
    '//kill',
    '/0.0.1',
    // ...
    '/Vaht',
    '/Vandalism',
    '/Vehicle',
   // ...

); // все полученные ранее ссылки

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

        $link = $links[$i++];
        $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);

1) Начинает сохранять не с 1-го элемента массива ссылок.
2) Сохраняет страницы присваивая название других.
3) Иногда получаю это: The owner of this website (minecraft.gamepedia.com) has banned your access based on your browser's signature (18697c3f488206e8-ua31).

Где тут неладное кроется ?
  • Вопрос задан
  • 2262 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы