botaniQQQ
@botaniQQQ
Q

Чем осуществить парсер/граббер защищенного сайта?

Привет.

Есть сайт, который достаточно хорошо отслеживает ботов и соответственно вводит ограничение. Собственно нужен только механизм получение станицы сайта для сохранения, сам парсинг уже реализован.

Сайт моментально блокировал ботов, которые не принимают cookies, однако сейчас блокирует практически все запросы.

Решение было найдено в использовании PhantomJS, однако загрузка страницы можно достигать 1-2 сек, это довольно долго, с учетом того, что нужно сохранять миллионы страниц.

Есть еще варианты?
  • Вопрос задан
  • 4496 просмотров
Решения вопроса 3
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Ну если человек сидит с одного IP и его не банят, значит надо сделать так, как будто по сайту ходит "человек".

Для этого предлагаю вспомнить общеизвестную задачу "банерокрутилку". Имеется N банеров. Их надо прокрутить каждый по 1 разу и за K секунд.

В вашем случае в качестве банеров выступают URL-ы. K секунд делим на Т url-ов и получаем время на каждую ссылку. Но. Чтобы внести не детерменированность, то делаем это с разными промежутками времени перед между очередной итерацией парсинга.

Посмотрите внимательно на вывод:
site.ru/?page1
site.ru/?page2
...
site.ru/?pageN .

Видите?

В этом решение сразу проглядывается цикл и это может быть достаточным основанием для распознования парсинга.

Как правило люди пишут "влоб" потому что головою думать не хотят!

Надо сделать "прогулку" по сайту так: site.ru/?page15, site.ru/?page179, site.ru/?page1, ... Одну страничку за 5 сек посмотрели, а другую 1минуту и т.д. Понаблюдайте за собою, как вы ходите по сайтам? Вы разве за 1-2 сек успеваете прочесть статью? Уверяю вас вы хаотично бродите по сайту. То в личные сообщения, то в избранные, то в поиск заглянете, то из выдачи поиска по какой-то статье. Вот и в парсинг вносите хаотичность

Конечный вывод в том, что вам нужно выбирать между:
  • Если хотите быстрый парсинг, значит больше прокси
  • Если хотите с одного IP, то придется пожертвовать временем работы
Ответ написан
Jump
@Jump
Системный администратор со стажем.
Решение было найдено в использовании PhantomJS, однако загрузка страницы можно достигать 1-2 сек, это довольно долго, с учетом того, что нужно сохранять миллионы страниц.
Решение верное.
2секунды это долго, но если бот работает 24часа в сутки, то за сутки это 40тыс. страниц.
Соответственно 100ботов за сутки сделают 4млн страниц.
Ответ написан
@private_tm
JAVA dev
Yandex.API+индивидуальные прокси+мультиаканты+платный апи(смотрите что дешевле обойдеться). Ну я б рекомендовал платное апи.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 7
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Каждый день люди заходят на тостер и скидывают в ответах парсеры на миллионы страниц, да такие чтоб не банило.

Спарсить миллион страниц с сайта который ОЧЕНЬ не хочет этого это довольно таки сложная работа.
Либо не сложная, но долгая и/или дорогая.
Зачастую даже на этом можно построить бизнес, если вдруг сумеешь спарсить хоть что-то полезное и не забаниться.

Пока вы не понимаете адекватно сложность и объем этой работы и/или не можете её сделать - не стоит за это браться.

Короче используйте то что есть или платите деньги тем кто это умеет лучше.
Это не пара строк кода на тостере ответить.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Есть система парсинга "Round-Robin".
Допустим, есть 3 сайта и на них туча URL.
Создаётся список урлов, чтобы временной интервал между парсингом URL с одного сайта был не менее 30 секунд.
Т.е.: Сайт1->Сайт2->Сайт3->Сайт1->Сайт2->Сайт3 и т.д.
Если быстрее происходит - ЖДЁТЕ!
После парсинга каждых 5-6 урлов (сессию и user-агента - сохраняем на протяжении парсинга этого интервала) на одном сайте - меняем IP также по "Round-Robin".

В итоге - Вы не создаёте нагрузки и не мешаете удалённому сайту нормально функционировать.
Ответ написан
Комментировать
@antonecma
Nodejs backender
Общий концепт может быть таким :
1. Использовать phantomjs, через локальный прокси.
2. Локальный прокси обеспечивает сохранение всех запросов к требуемой странице в формате HAR.
3. Поиск общих последовательностей запросов и кук, на основании нескольких HAR.
4. Отделение кук и параметров устанавливаемых javascript.
5. Поиск скриптов на странице, которые занимаются установкой значений указанных в п.4, с целью дальнейшего их исполнения в виртуальной машине javascript.
На выходе имеем запросы которые необходимо выполнить, список очевидных заголовков, набор функций позволяющих при исполнении javascript, вычислить дополнительные заголовки. Теперь прогоняем весь этот набор через curl (или что то подобное) как и при обычном парсинга.
Главная суть это виртуальная машина javascript и возможность найти то место(функцию) которую ей надо передать.
Ответ написан
Комментировать
@cultura
Решение было найдено в использовании PhantomJS, однако загрузка страницы можно достигать 1-2 сек, это довольно долго, с учетом того, что нужно сохранять миллионы страниц.


Никаких хитрых антиботовых механизмов там нет.

У них там банальный расчет, что пользователь-человек не способен читать страницы даже со скоростью 1 страница в секунду.

Подделаться под бота Яндекса не получится - ваш IP должен из подсети Яндекса и резольвится по их DNS.

У Гугля аналогично.

А на остальных ботов они могут выставить банальное ограничение - не более 30 страниц в минуту, например.

А вообще - это не этично.
Вам же в явном виде отказали и закрыли перед носом дверь. А вы - через окно полезли.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
Яндекс знает паблик прокси, надо частные или как повезет

но если вы без кук его парсить начинали, думаю, еще есть куда расти перед масспрокси
Ответ написан
Комментировать
whiski80
@whiski80
Кратко о себе
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
Ответ написан
hOtRush
@hOtRush
phantomjs нужен только в одном случае - если сайт не работает без JS. во всех остальных случаях достаточно проксей, коих сейчас даже в открытом доступе или за малые деньги - десятки тысяч.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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