Google limits

Данную статью я назвал Google Limits, потому что в ней я хочу рассказать о некоторых ограничениях поиска в Гугл:

  1. Запрос не должен превышать 32х слов (раньше было 10);
  2. Количество запросов с одного IP не должно превышать 25 000 в сутки.

По поводу первого числа у меня нет сомнений, а вот по поводу второго они все-таки возникают. Хотя на практике еще не приходилось подходить к барьеру в 25 000 запросов.

Надо будет как-то на эксперименте проверить.

Яндекс ТИЦ

Иногда нам (веб-разработчикам и веб-оптимизаторам) нужно получить скриптом (потому что сервисов, которые это делаю за нас просто немеряно) такой параметр страницы как ТИЦ.

Введен этот чудный параметр был компанией Яндекс, поэтому все дружно его и называют Яндекс ТИЦ.

Для его нахождения я использую следующий простой скрипт:

function GetTCY($url) {		
   $url="http://bar-navig.yandex.ru/u?ver=2&show=32&url=".$url;
   $Result=file_get_contents($url);		
   return $Result ? (int) substr(strstr($Result, 'value="'), 7) : false;
}

Этой функции вы можете скармливать URL любого сайта, чей ТИЦ вы хотите узнать.

Данный метод основан на том же принципе, что и Яндекс.Бар.

Если вы уже очень любознательны, то в ответ на наш запрос Яндекс возвращает XML файл следующего вида:

<?xml version="1.0" encoding="windows-1251" ?>
<urlinfo>
 <url domain="www.net-safari.com"><![CDATA[/]]></url>
 <tcy rang="2" value="20"/>
 <topics>
 </topics>
 <textinfo>
 </textinfo>
</urlinfo>

Также вы можете скачать данный код в готовом виде отсюда.

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

Дополнительные сведения:

Выдача Google

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

Например, надо получить ссылки по запросу “собаки”. Тогда можно сформировать пакет запросов следующим образом:
“собаки красивые”
“собаки спасатели”
“собаки и приключения”
“собаки фото”

Думаю, что общая мысль понятна.

Парсинг выдачи Google. Практика.

Очень часто перед веб-мастерам встает задача парсинга выдачи поисковиков.

Это может быть нужно для того, чтобы:

  • автоматизировать процесс обработки какой-то статистической информации;
  • посчитать количество ссылающихся на ваш сайт ресурсов, определить их качество и прочие параметры;
  • найти урлы сайтов, которые натырили у вас контент (хотя тут лучше использовать что-то наподобии CopyScape, однако я заметил, что он иногда выдает бред);
  • определить частоту запросов.

И это лишь малый диапазон задач, в которых вам может понадобиться парсинг выдачи поисковиков. А точнее это то, что мне пришло в голову :)

А ведь еще у нас есть такие ребята как серые и черные оптимизаторы, которые при помощи поисковика ищут спамилки. Но это вообще отдельный разговор, который ничего общего с нашими благими целями не имеет :)

В данной статье я хотел бы рассказать как проще всего из выдачи Google доставать такие параметры как:

  • время генерации ответа (может понадобиться для статистики и расчета общего времени парсинга);
  • количество страниц, соответствующих вашему запросу (частота);
  • ну и собственно ссылки на конечные ресурсы.

Реализовывать механизм получения выдачи вы можете на чем угодно: curl, сокеты, fopen. Особой разницы для нас между ними нет. Предположим, что получать содержимое выдачи вы уже умеете (а если не умеете, то читать дальше вам просто незачем).

И вот тут начинаются вопросы.

1. Как достать из выдачи время генерации и количество страниц на данный запрос?

Я делаю это таким кодом (выдрано из тучи моих классов и гигантского ядра парсера, так что если найдете какую-то ошибку - напишите в комментах):

$blue_line_pcre = "(Результаты|Результати|Results)(.*)";
$parse_time_pcre= '\<b\>([\d\,\.]+)\<\/b\>\s[^\d]+$';
$parse_num_pcre	= '\<b\>([\d\,]+)\<\/b\>[^\d]+';
 
if(preg_match("/$blue_line_pcre/Ui",$Result,$matches)) {
    unset($matches[0]);
    if(!empty($matches[1])) {
        $BlueLine=preg_replace("/\&nbsp\;/",'',$matches[2]);
    } else {
        $BlueLine='';
    }
}
 
$find=$parse_num_pcre.$parse_time_pcre;
if(preg_match("/$find/Ui",$BlueLine,$matches)) {
    unset($matches[0]);
    $query_results_num=$matches[1];
    $query_time=$matches[2];
}

То есть, предполагается, что в переменной $Result хранится html код выдачи (и очено важно к этому коду не забыть применить

$Result=preg_replace("/[\n\r\t]/", '', $Result);

, чтобы потом не ломать голову почему половина регулярок не работают).
После выполнения моего скрипта в переменной $BlueLine будет html код синей полоски Гугла, в которой будет написано, что-то на подобии “Результаты 1 - 10 из примерно 87 300 000 для вакансии. (0,04 секунд)”.

В переменной query_results_num будет количество сайтов, подходящих под ваш запрос, а в переменной query_time - время генерации выдачи.

Из кода выше вы могли заметить, что регулярное выражение для нахождения кода “синей линии” имеет следующий непонятный вид:

(Результаты|Результати|Results)(.*)

Это сделано исключительно для того, чтобы с равной точностью парсить выдачу как google.com, так и google.ru и google.com.ua.

Заметка: результаты выдачи по одному и тому же запросу на разных локализованных версиях Google отличаются! Хоть иногда эту разницу тяжело обнаружить, но все же она есть. Можете на досуге поиграться с каким-то ВЧ запросом. Расскажете о результатах своих наблюдений.

Также некоторые вопросы могут вызывать регулярные выражения для нахождения времени генерации и количества страниц:

$parse_time_pcre = '\<b\>([\d\,\.]+)\<\/b\>\s[^\d]+$';
$parse_num_pcre	= '\<b\>([\d\,]+)\<\/b\>[^\d]+';

Для чего я использую вот такие конструкции [\d\,\.]? Исключительно для совместимости. Делаю я это потому, что разделителем целой и дробной части в нашей стране является “.”, а в США - “,”. В регулярном выражении для количества страниц вы также можете видеть символ “\,” - это используется для того, чтобы правильно находить количество страниц, так как американцы разделяют тысячи этим знаком.

2. Как достать ссылки из выдачи?

Эта даже проще чем выдирать параметры. Я делаю это при помощи следующего кода:

$find = $parse_links_pcre = "<a\shref=\"([^\"]+)\".*sclass=l";
if(preg_match_all("/$find/Ui",$Result,$matches)) {
    unset($matches[0]);
    $links=$matches[1];
}

В массиве $links будут все ссылки, найденный на текущей странице. Недостатки у такой унификации тоже есть: в результирующем массиве вы получите все ссылки “Translate” и этот метод не очень-то и быстро работает из-за использования в регулярном выражении “.*”. Но это место всегда можно подрихтовать под ваши конкретные требования. В оригинальном виде я тоже не особо часто использую данное регулярное выражение. Но есть также и плюсы у этого кода: он не загребает ссылки с оплаченных объявлений, а они, как вы знаете, вылазят на каждой странице поиска и могут очень сильно нарушить ваши статистические исследования или сбор ссылок.

Спасибо, что дочитали до конца. Рад буду выслушать ваши предложения и дополнения.

Yahoo

Важная тонкость для людей, которые собираются грабить выдачу Yahoo - в сутки с одного IP нельзя делать больше 10 000 запросов.

В противном случае - бан.

Источник: наблюдения “серых” сеошников :)

Определение Google PR

Очень часто на разнообразных форумах я натыкаюсь на вопросы как на php реализовать скрипт подсчета Google PR (PageRank) сайта.

Работоспособный вариант вы можете скачать отсюда.

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

Данный метод основан на парсинге выдачи поисковика Google.

UPD. Заплатка для владельцев 64 разрядных машин.

Дополнительные ссылки:

Работа с cookies

Очень часто новички в области грабинга/парсинга сайтов задают один и тот же вопрос:
“Как максимально просто отлавливать и устанавливать cookie?”.

Используя curl работа с кукисами стает вообще максимально простой. Вам стоит всего лишь использовать следующий код:

if(is_writable($CookieFile)) {
curl_setopt($curl_handler, CURLOPT_COOKIEFILE, $CookieFile);
curl_setopt($curl_handler, CURLOPT_COOKIEJAR, $CookieFile);
} else {
die('Файл не является записываемым: '.$CookieFile);
}

Для вас может быть новой такая опция как CURLOPT_COOKIEJAR и это неудивительно. Например, в моей версии официальной документации к PHP она не описана.

Что же делает данный кусок кода?

Поэтапно:

  • Проверяет можно ли писать в указанный в переменной $CookieFile файл
  • Если нельзя - выводит ошибку
  • Если можно - устанавливает кукисы из файла $CookieFile и устанавливает запись кукисов в данный файл

Грубо говоря, при помощи данного кода вы сохраняете все кукисы в файл и потом их используете.

Это может быть полезно когда:

  • на сайте используется сессионная модель взаимодействия с посетителями
  • когда аутентификация основана на информации из кукисов
  • когда в кукисы записываются какие-либо переменные, необходимые для дальнейшей работы на сайте

Дополнительные ссылки:

Пример

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

Компания In.Site.
В своем портфолио они приводят работу для ГринКомБанк:

- Архивация страниц отчетности и возможность просматривать их.
- Парсинг новостей с сайта bankir.ru
- Калькулятор доходности вкладов

Это очень показательный пример. Особенно для сайтов банков. Практически все сайты крупных банков парсят курсы обмена с Центрального Банка своей страны.

Поэтому сейчас для упрощения сбора информации на сайтах Центральных Банков запускают всевозможнейшие веб-сервисы.

Вывод: без парсинга финансовая отрасль была бы неполной и потеряла бы свою динамику, так как всю информацию пришлось вводить руками.

Состояние рынка

Приступая к работе, я решил проанализировать состояние рынка услуг в сфере парсинга и грабинга информации.

Оказалось, что основными потребителями услуг в сфере парсинга (по мнению Гугла) являются оптимизаторы, которые используют данные инструменты в целях парсинга выдач поисковиков.

И соответственно отношение к подобным услугам в интернете сложилось “немного” негативное. Хотя я и не могу понять почему.

Для того, чтобы хоть как-то оправдать парсинг/грабинг приведу базовые концепции построение крупных проектов.

В основе построения крупных проектов могут лежать следующие 3 фундамента:

  • комьюнити: жж, форумы, социальные сети
  • команда: профессиональные журналисты, который постоянно пишут за деньги
  • грабинг/парсинг информации: новостные агрегаторы, порталы…

Очень часто используется смесь 2х или 3х этих инструментов.

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

Услуги

Один из потенциальных клиентов задал мне вопрос, “что же я предоставляю”.

Прошу извинить меня, если я где-то нечетко указал, что наша компания предоставляет УСЛУГИ парсинга/грабинга.

Проще говоря - услуги автоматизированного сбора информации под заданные вами параметры и с заданных вами сайтов.