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

Однажды подобная мысль посетила и меня. На тот момент, по какой-то непонятной причине, я ничего найти не смог: то ли я не умел гуглить, то ли гугл меня не взлюбил – этого я уже никогда не узнаю. Однако, спустя n-ое количество лет, задача всплыла вновь. Годы не прошли даром, вбивать в поиск нужные слова я уже научился, так что сегодня поделюсь решением с вами.

P.S. Да, всё настолько просто =)

Парсим буржуйский поисковик от Майкрософт =)

Получаемый результат:

Продолжаем парсить выдачи поисковиков, сегодня – Google.

Так как моя работа напрямую связана с поисковыми системами, мне часто приходится работать с выдачами разных поисковиков: яндекс, google, рамблер, youtube и т.п.
Этим постом я и начну публикацию серии функций для обработки СЕРПов разных поисковиков.
Первый на очереди – яндекс.

Пример результата этой функции:

Способов и путей развития этой функции – тьма тьмущая. Как минимум, реализовать разбор капчи, прикрутить antigate.com и многое другое. Но это уже совсем другая история =)

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

Для себя я этот вопрос закрыл лет 5–6 назад, написав небольшую функцию, которую и таскаю с собой из проекта в проект. Её функционал нельзя назвать широким или хотя бы полным, но базовым требованиям она удовлетворяет и поэтому, не смотря на свой почтенный возраст, она всё так же меня выручает =) Возможно, пригодится и вам.

Как обычно, привожу полный исходный код, а затем – необходимые разъяснения по коду.

А теперь разберем, где что происходит.

Определяем, по каким символам скрипт будет определять начало и конец использования кавычек. После пробела, открывающей скобки и любого другого отступа – начальная кавычка. После точки, запятой и закрывающей скобки – конечная.

Функция принимает аргумент $type, который может принимать значения “html” и “text” и в зависимости от этого в качестве типографики будут использоваться либо наборы символов, либо html-мнемоники.

Заменяем кавычки на спец. символ внутри тегов, чтобы не поломать html-код, если он есть.

Проставляем открывающие и закрывающие кавычки, используя определенные ранее символы.

Возвращаем на место кавычки внутри тегов.

Заменяем дефис на тире там, где это нужно.

Проставляем минус.

Проставляем символ двоеточия.

Words

В предыдущем посте я описывал функцию, которая разбивает текст на предложения. И там же я упомянул об отдельной функции для разбивки предложений на слова. Сегодня опишем и её =)
Зачем нужна отдельная функция, если вся задача укладывается в одну строку нативного php-кода?

В большинстве случаев такого решения вполне достаточно. Но, такой подход будет считать словами любые последовательности символов, разделенные пробелом. Это не совсем правильно.
Предлагаемая функция позволяет не учитывать последовательности символов, короче заданной величины. Разумеется, это тоже далеко не предел совершенства, но уже хоть что-то =)

Знаки препинания удаляются, чтобы не мешать правильно подсчитывать длину слов.

Разбивка текста на предложения.

Мне часто приходится работать с парсерами/краулерам/агрегаторами и прочей нечистью, поэтому обработка и анализ текстов – неотъемлемая часть моей работы. Задача разбивки текста на предложения для последующего анализа или обработки – одна из самых часто используемых. Конечно, можно не напрягать мозг и использовать нечто вроде:

И правда дешево, надежно… хоть и не очень практично. Например, в тексте могут встречаться числа с дробью, указанной через точку (к примеру, 3.14), в таком случае 3 и 14 будут распознаны как отдельные предложения. Либо же в тексте встетится доменное имя (к примеру, yandex.ru) и скрипт справедливо укажет, что “yandex” и “ru” – это два разных предложения.

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

Код привожу без комментариев. Специально для тех, кому просто нужен рабочий кусок кода – берите и пользуйтесь на здоровье. Для тех, кому интересно, как это всё работает и почему я сделал именно так, а не иначе, будет разбор кода по пунктам.

А теперь разберем поэтапно.

Заменяем точки на спецсимволы в аббревиатурах. Чтобы “А.С. Пушкин” не было распознано скриптом как 3 псевод-предложения.

Решаем проблему с дробными числами, о которой я уже говорил.

Сохраняем точки внутри тегов.

Предотвращаем разбивку текста на предложения посреди URL или домена.

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

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

Если указано минимальное количество слов, при которых элемент считается предложением, мы проверяем достаточно ли в каждом элементе этих самых слов. Если недостаточно, элемент удаляется.
Здесь лучше использовать отдельную функцию для обработки слов.
Эту часть можно переделать, к примеру, таким образом, чтобы элемент не удалялся, а добавлялся к предшествующему. Но, в моем случае, нужен именно такой подход.

Проверяем, не удалили ли мы все элементы из массива =)

Возвращаем на место точки, которые мы заменили на спец. символ в начале функции.

Как ни странно, возвращаем результат =)
Надеюсь, скрипт вам пригодится.

who-is1

Уже довольно давно в работе постоянно приходится иметь дело с whois-запросами.
Объемы постоянно росли, доменные зоны менялись, поэтому менялись и методы работы.
Сперва скриптик был крайне простым. Нечто вроде:

А дальше уже парсинг ответа и раскладывание по полочкам нужных значений.

Однако со временем, объем запросов значительно вырос и возникла проблема с лимитами на запросы (RIPN ограничивает количество запросов с одного IP до 30 в минуту). Следовательно, возникла необходимость использовать proxy-сервера. Благо, есть возможность настроить себе сколько угодно proxy-серверов на dedicated-сервере (были бы IP-адреса =).
Скрипт научился работать с whois-серверами с помощью cURL:

Скрипт верой и правдой отработал несколько лет. Однако появилась необходимость расширить диапазон доменных зон. И тут я столкнулся с проблемой – на запросы через прокси, зарубежные whois-серверы отдавали невнятный ответ: “Neither object nor interpretation control keyword found”.
Как ни ковырял cURL, так и не смог заставить скрипт работать правильно. Скорее всего, cURL просто отправляет какие-то заголовки, которые не может интерпретировать whois-сервер. Задача ясна – нужна работа с прокси без использования cURL.
После довольно продолжительного гугления был найден замечательный класс для работы с socks5/socks4/socks4a прокси-серверами от Jinn.
В результате код получился таким:

Осталось только обрамить всё это благополучие в нормальный интерфейс или класс и можно пользоваться =)

anonymous-200213-1

У многих возникают ситуации, когда нужен большой пул прокси-серверов. Если случается это редко и нерегулярно, можно обойтись и бесплатными списками прокси-серверов. Найти их не составляет никакого труда, просто гуглим “бесплатные прокси” и получаем несколько весьма годных сервисов в первой же десятке поисковой выдачи.

Если же потребность в них возникает часто, можно попробовать использовать платные списки, либо пошаманить с настройками Tor / Privoxy, чтобы получить периодически меняющий ip-адрес прокси-сервер. Tor – это, конечно, очень здорово и удобно. Однако, если вопрос стоит не только в смене ip-адреса, но и в скорости работы, лучше подумать над альтернативой.

В моем случае альтернатива уже была. В наличии имелся выделенный сервер с N ip-адресов на нем. Осталось только настроить его так, чтобы можно было ходить в сеть через него, используя весь диапазон имеющихся адресов.

Есть замечательные легковесный и несложный в настройке proxy-сервер под названием 3proxy.

С его помощью можно настраивать http/socks/ftp прокси в считанные минуты – конфиг не сложный и понятный.

По-умолчанию, все запросы он будет отправлять с одного основного ip-адреса, однако можно поступить и по-другому:

Это пример моего конфига. Разумеется, 127.0.0.1 нужно заменить на свой ip-адрес и последние три строки конфига размножить на все свои адреса.

Таким образом, ip-адрес, по которому вы обращаетесь к прокси-серверу, будет использоваться им как исходящий. Т.е. получаем на одном сервере столько проксей, сколько нам нужно (или сколько есть ip-адресов в начилии =).