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

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

Я вчера писал, что у меня возникли проблемы с использованием сервиса 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 адресов датацентров. Аналогичный механизм можно использовать для парсинга поисковых результатов гугла.

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

1 комментарий:

Анонимный комментирует...

Еще раз спасибо ;-)