Answer the question
In order to leave comments, you need to log in
How to implement a parser / grabber of a secure site?
Hello.
There is a site that tracks bots quite well and introduces a restriction accordingly. Actually, only a mechanism is needed to get the site page for saving, the parsing itself has already been implemented.
The site instantly blocked bots that do not accept cookies, but now blocks almost all requests.
The solution was found in the use of PhantomJS, however, page loading can reach 1-2 seconds, which is quite a long time, given that millions of pages need to be saved.
Are there any other options?
Answer the question
In order to leave comments, you need to log in
Well, if a person sits from one IP and they don’t ban him, then you need to make it as if a “person” is walking around the site.
To do this, I propose to recall the well-known problem "baner roll". There are N banners. They must be scrolled each 1 time and in K seconds.
In your case, URLs act as banners. Divide K seconds by T url-s and get the time for each link. But. In order to introduce non-determinism, we do this at different time intervals before the next iteration of parsing.
Look closely at the output:
site.ru/?page1
site.ru/?page2
...
site.ru/?pageN .
See?
In this solution, a cycle is immediately visible and this may be sufficient reason for recognizing parsing.
As a rule, people write "vlob" because they don't want to think with their heads!
It is necessary to make a "walk" around the site like this: site.ru/?page15, site.ru/?page179, site.ru/?page1, ... One page was viewed in 5 seconds, and the other in 1 minute, etc. Watch yourself, how do you go to the sites? Do you manage to read an article in 1-2 seconds? I assure you you are randomly browsing the site. Either in personal messages, then in favorites, then look into the search, then from the search results for some article. So bring randomness into parsing.
The final conclusion is that you need to choose between:
- If you want fast parsing, then more proxies
- If you want from one IP, you will have to sacrifice work time
Каждый день люди заходят на тостер и скидывают в ответах парсеры на миллионы страниц, да такие чтоб не банило.
Спарсить миллион страниц с сайта который ОЧЕНЬ не хочет этого это довольно таки сложная работа.
Либо не сложная, но долгая и/или дорогая.
Зачастую даже на этом можно построить бизнес, если вдруг сумеешь спарсить хоть что-то полезное и не забаниться.
Пока вы не понимаете адекватно сложность и объем этой работы и/или не можете её сделать - не стоит за это браться.
Короче используйте то что есть или платите деньги тем кто это умеет лучше.
Это не пара строк кода на тостере ответить.
Есть система парсинга "Round-Robin".
Допустим, есть 3 сайта и на них туча URL.
Создаётся список урлов, чтобы временной интервал между парсингом URL с одного сайта был не менее 30 секунд.
Т.е.: Сайт1->Сайт2->Сайт3->Сайт1->Сайт2->Сайт3 и т.д.
Если быстрее происходит - ЖДЁТЕ!
После парсинга каждых 5-6 урлов (сессию и user-агента - сохраняем на протяжении парсинга этого интервала) на одном сайте - меняем IP также по "Round-Robin".
В итоге - Вы не создаёте нагрузки и не мешаете удалённому сайту нормально функционировать.
Общий концепт может быть таким :
1. Использовать phantomjs, через локальный прокси.
2. Локальный прокси обеспечивает сохранение всех запросов к требуемой странице в формате HAR.
3. Поиск общих последовательностей запросов и кук, на основании нескольких HAR.
4. Отделение кук и параметров устанавливаемых javascript.
5. Поиск скриптов на странице, которые занимаются установкой значений указанных в п.4, с целью дальнейшего их исполнения в виртуальной машине javascript.
На выходе имеем запросы которые необходимо выполнить, список очевидных заголовков, набор функций позволяющих при исполнении javascript, вычислить дополнительные заголовки. Теперь прогоняем весь этот набор через curl (или что то подобное) как и при обычном парсинга.
Главная суть это виртуальная машина javascript и возможность найти то место(функцию) которую ей надо передать.
Решение было найдено в использовании PhantomJS, однако загрузка страницы можно достигать 1-2 сек, это довольно долго, с учетом того, что нужно сохранять миллионы страниц.
Яндекс знает паблик прокси, надо частные или как повезет
но если вы без кук его парсить начинали, думаю, еще есть куда расти перед масспрокси
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;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question