Показаны сообщения с ярлыком парсинг. Показать все сообщения
Показаны сообщения с ярлыком парсинг. Показать все сообщения

вторник, мая 29, 2007

Маскируем скрипт - прикидываемся браузером

В PHP есть супермощный класс CURL - который позволяет полностью эмулировать соединения с различными параметрами. С помощью небольшого тюнинга можно добиться, что наш скрипт будет неотличим от браузера управляемым человеком.

Зачем это нужно? Опыт показывает, что, например, поисковые системы - скрипту эмулирующему браузер перекрывают кислород намного позже.

Чем браузер отличается от скрипта? Он передаёт строку юзер-агента, сохраняет и отдаёт куки, передаёт сточку реферера (адрес страницы откуда пришли) - мы будем делать то же самое.

Простейший способ использования CURL:

$url = "http://www.site.com";
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$str = curl_exec($ch);

curl_close($ch);


Текст страницы оказывается в переменной $str - с ним потом можно делать всё что угодно.

Теперь тюнингуем наш простейший скрипт.

1. Добавляем сточку юзер-агента

$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);


Строчку юзер-агента можно вставить любого популярного браузера. Это - для Microsoft Outlook 6.0. Также браузер часто передаёт версию ОС и некоторые параметры - например тут версию .NET.

2. Если вызываем несколько страниц на сайте, сохраняем и отдаём куки


$cookie_file = " ..тут вставляем путь к файлу ..";
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);


Многие сервисы "отсеивают" скрипты - устанавливая, а затем запрашивая переменную в куки. Путь к куки файлу должен быть полный. При запуске скрипта - желательно удалить файл куки, оставшийся от предыдущей работы скрипта. Также для файла сохраняющего куки, или для папки куда он сохраняется - должны стоять права на запись.

3. Передаём реферера.

Реферер - это адрес страницы, указывающий откуда пришёл пользователь, т.е. адрес страницы на которой была ссылка или форма, действие которой привело на текущую страницу.

curl_setopt($ch, CURLOPT_REFERER, "http://site.com");

Для чего это нужно? Некоторые сервисы могут его проверять и делать определённые выводы. Например, для парсинга страниц результатов поиска Google - можно установить реферер http://google.com - т.е. мы показываем наш эмулятор браузера - "пришёл" на страницу с результатами поиска с главной страницы.

4. Делаем небольшую паузу между запросами

Юзер не кликает страницы друг за другом, а просматривает их через определённое время, поэтому, в случае, если запрашиваем много страниц циклом - нужно обязательно вставить небольшую паузу.

sleep(5);

Также можно сделать случайную паузу, например от 2 до 10 секунд.

sleep( rand(2,10) );

5. Использование прокси

Чтобы совсем замаскировать следы - можно использовать прокси.

curl_setopt($ch, CURLOPT_PROXY, "111.222.333.444:5555");

Нужно удалять файл куки перед сменой прокси.


Инструкции для эмуляции браузера с использованием CURL получаются следующие:

$url = "http://www.site.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)";
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

$cookie_file = " ..тут вставляем путь к файлу ..";
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

curl_setopt($ch, CURLOPT_REFERER, "http://site.com");
curl_setopt($ch, CURLOPT_PROXY, "111.222.333.444:5555"); //Прокси - если необходимо

$str = curl_exec($ch);
curl_close($ch);

...

sleep( rand(2,10) );

Как Обхитрить Гугл

Я вчера писал, что у меня возникли проблемы с использованием сервиса Google Translate. Я просто стал слишком много его использовать, ему это не понравилось. Как быть? Проект должен работать, проблему нужно решать быстро.

Решений такой проблемы может несколько. Самое первое, что приходит на ум - это использовать прокси. Но для этого нужно писать сборщик прокси, который ещё будет их ещё чекать (хоть такой скрипт у меня уже давно есть). Я решил сделать проще. Для этого воспользуемся знаниями о том, как устроен гугл. Гугл - это множество датацентров в разных частях света, в зависимости от того, где мы находимся, гугл эффективно манипулирует DNS - и мы получаем доступ к ближайшему или быстрейшему. Датацентры - это система в себе, которая содержит полностью поисковый кэш и все сервисы гугла.

Нам ничего не мешает обращаться к разным датацентрам. Для этого возьмём список датацентов, в каком-нибудь сервисе, которые показывают pr на разных датацентрах. (Например: http://digpagerank.com/). Вместо обращения к google.com - будем обращаться к случайному ip датацентра.

Получается вот такая PHP функция:

function RusEnTranslate($text) {

$text = iconv("windows-1251", "UTF-8", $text);

$ips = array("59.151.21.100", "64.233.161.18", "64.233.161.81", "64.233.161.84");
shuffle( $ips );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://".$ips[0]."/translate_t");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'hl=en&ie=UTF8&langpair=ru|en&text='.$text.'&submit=Translate');
$str = curl_exec($ch);
curl_close($ch);

preg_match('/<div id="result_box" dir="ltr">([^<]*)<\/div>/isU', $str, $matches); return $matches[0]; } //func

Массив $ips - может содержать любое количество ip адресов датацентров. Аналогичный механизм можно использовать для парсинга поисковых результатов гугла.

Следующий пост напишу о том, как скрипту прикинуться пользователем и максимально эмулировать действия браузера управляемого человеком.