@AnnaGrimes

Почему сервер не отдаёт файл по прямой ссылке?

Здравствуйте! Есть сайт который я пытаюсь парсить и у меня есть прямые ссылки на все файлы которые мне нужны с этого сайта и которые были собраны заранее (все файлы графические - jpg). На сайте какая-то защита, существует конкретное число файлов которые можно скачивать с него а если идёт превышение то по этим прямым ссылка открывается просто пустота. Как такое может быть если я обращаюсь по прямым ссылкам, что сейчас по этой ссылке графика, а потом пустота? Как обойти такое ограничение?

P.S. У меня нет нормальных прокси а всё что пробовала - очень тормозное но тем не менее через них всё работает какое-то время и каждый лимит нужно просто менять прокси но речь идёт про огромное количество файлов и такой способ просто не подходит.

Как обойти эту защиту? Помогите советом пожалуйста!

Спасибо!
  • Вопрос задан
  • 410 просмотров
Пригласить эксперта
Ответы на вопрос 1
mva
@mva
CEO, CTO, Lua/Gentoo/IPv6 Pioneer
Отвечая на изначальный вопрос — легко. И тысячи способов от Web Application Firewall до встроеггого в NginX lua-модуля.

Отвечая на раскрытый в комментариях вопрос:

function getContent($url, $referer = null, $proxies = array(null))
    {
        $proxies = (array) $proxies;
        $steps = count($proxies);
        $step = 0;
        $try = true;
        while($try){
            // create curl resource
            $ch = curl_init();
            $proxy = isset($proxies[$step]) ? $proxies[$step] : null;
 
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_REFERER, $referer);
            curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.9.168 Version/11.51");
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_PROXY, $proxy);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return the transfer as a string
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 
            $output = curl_exec($ch); // get content
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Получаем HTTP-код
 
            // close curl resource to free up system resources
            curl_close($ch);
 
            $step++;
            $try = (($step < $steps) && ($http_code != 200));
        }
        return $output;
    }


// оффтоп: вообще, у меня есть готовый парсер на Lua, который и User-Agent и прокси на каждый запрос меняет (и сразу парсинг html в массив с данными приделан для вытаскивания нужных элементов в цикле), и сохранение из этого csv... Но, как очевидно, его (парсер) нужно под вёрстку каждого сайт затачивать :)

P.S., а ещё вы промахнулись в тегах. Конечный ваш вопрос ведь о PHP, а не NginX. Разве нет? :)
Ответ написан
Ваш ответ на вопрос

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

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