Данный текст является одним из выпусков моей рассылки "Автоматизация рутины - как это?". Все выпуски вы можете прочитать в каталоге выпусков. Чтобы ничего не пропустить - рекомендую подписаться:
Выпуск 7.
____
Некоторые ваши ответы на анкету
На какую вашу задачу вы хотели бы получить решение
1. Размещение объявлений на э/доски;
2. Просмотр объявлений и выбор по ключевым словам.
Начну со второго пункта.
Цепочка действий, понятно дело, простая: открыть (скачать) нужную веб-страницу - просмотреть на наличие искомых слов - сохранить объявление.
WWW - это вотчина серверов. Именно исходя из этого тезиса для решения следует воспользоваться предлагаемыми ими инструментами. Есть такая отличная вещь - Денвер. Это веб сервер + два языка программирования + база данных (Apache+Perl+PHP4+MySQL) в дистрибутиве весом чуть больше 2 МБ. Запускается и останавливается одним кликаньем мышки. Никаких проблем с установкой или настройкой. В общем, стоящая вещь.
Разумеется, локальный веб-сервер нужен не сам по себе, а, в данном случае, ради его языков. PHP и Perl - это языки для интернета. PHP - очень прост в изучении. Кто захочет, может это утверждение проверить. Я в этом убедился, а его возможностей достаточно для автоматизации работы со страницами в интернете. К тому же в инете имеется совершенно шикарная документация на русском "Учебник PHP".
Итак, сначала нужно определить что (какие страницы) нужно посетить. У всех досок объявлений за листание отвечают несколько передаваемых параметров (раздел 1 уровня, раздел 2 уровня, номер страницы и т.п.), которые обычно добавляются в адрес. Т.е. та или иная страница находится по адресу http://<адрес доски объявлений>?параметр1=__&параметр2=__ и т.п. Следовательно, первая задача - определить порядок просмотра, последовательность (цикл) открытия запрашиваемых страниц. Про ошибки,связанные с запросом несуществующих страниц, поговорим ниже.
Итак, последовательность открытия страниц определена. Теперь в организованном цикле делаем открытие страницы. На PHP я это делал так:
В чем разница. Первый случай можно использовать, когда имеется прямой доступ к запрашиваемой странице (скажем, через модем). Второй способ используется тогда, когда у вас доступ через прокси. Первым способом я организовывал скачивание дома по модему архивы понравившихся мне рассылок с Subscribe.Ru (все выпуски по годам, начиная с первого и по последний день), вторым способом делал скачивание на работе свежей нужной информации (нажал кнопочку - бац, нужные странички получены и сохранены).
Итак, нужная страница в формате html имеется. Для организации поиска по ключевым словам я вижу пару решений. Первый - через strpos("переменная, в которой находится страница", "ключевое слово"). Недостаток очевиден - можно искать только по одному ключевому слову, без шаблонов * и ?.
Второй способ - сохранить страницу в базу данных MySQL (она идет в комплекте в денвере), для которой уже работают запросы с шаблонами *,?,AND,OR и т.п. Этот способ, как мне кажется, более удобен, хотя и более трудоемок - перед этим нужно "разобрать" страницу на объявления. Это несложно - определяем принцип конструирования объявлений на странице, делаем цикл по поиску подстроки, с которой начинается каждое объявление (скажем, у меня нужные таблички начинались с символов "<td>Сообщение №"). Нашли нужную подстроку - ищем окончание подстроки (объявления) аналогичным образом (strpos позволяет искать вхождение с любого по счету символа страницы). После этого сохраняем в базе и переходим к следующему объявлению. Пробежались по всей странице, скачали новую, обработали и дальше. Потом один запрос к базе - и выводятся все искомые записи. Да, в денвере есть phpMyAdmin для работы с базой на уровне кликанья мышкой. Там же можно писать запрос на выборку данных.
Стоит еще отметить, что обработка всех страниц может занять несколько минут, поэтому нужно продлять время выполнения скрипта через set_time_limit(время продления в секундах) - это можно вставить после процесса скачивания каждой новой страницы.
Теперь несколько слов по поводу обработки ошибок.
Разумеется, более корректным способом будет для каждой страницы определять, есть ли следующая - пишется же "Страница x из xx". Через strpos найти эту фразу, сравнить x и xx, и только тогда принимать решение - скачивать следующую страницу раздела или же переходить к обработке другого раздела. Хотя, если у вас unlimited (пользование без ограничений), то можно и не проверять - в качестве ошибочной страница сервер пишет свою (обычно это всем известная надпись "Ошибка 404", но иногда это не так), которую можно скачать, но на которой объявлений не будет и, соответственно, она обработана тоже не будет.
После того, как я все это написал, в голову пришла еще одна мысль - на многих досках объявлений имеется встроенный поиск. Берем эту форму, смотрим html-исходник, сохраняем. А там, где идет описание формы ввода искомых данных (тег <form>) прописываем абсолютное значение action=<абсолютный адрес вместо относительного> (т.е. вместо action=/cgi-bin/send.cgi вписать action=http://<адрес сервера>/cgi-bin/send.cgi). После этого для поиска будет достаточно открыть этот сохраненный файл, вписать условия для поиска, нажать поиск - и запрос будет обработан как будто он был выпонен там. Разумеется, если не стоит защита на проверку адреса - тогда это не поможет.
Теперь по первому пункту.
Небольшая ремарка. Автоматизация в этой части редко бывает оправдана. Для того, чтобы на объявление обратили внимание, оно должно выделяться. Автоматизация в данном случае есть шаблонность.
Общий принцип множественной подачи объявления простой - посмотреть, какие поля в регистрационной форме заполняются, какие у них названия и какой адрес обрабатывающего скрипта (что прописано в action тега form). Затем делаете свою страничку с нужными вам полями (на разных досках объявлений используется разное число полей), а ваш скрипт регистрации будет достаточно простым - делаете запрос на открытие странички с адресом, который был указан в action, а к нему дописываете переменные, которые используется в этом скрипте.
Например. На доске объявлений используются три поля: contact - e_mail - text. Адрес обрабатывающего скрипта http://адрес/cgi-bin/add.cgi. В денвере вы создали новый каталог send_forms (новый виртуальный адрес), создали там свою форму в файле 1.html с полями contact - e_mail - header - text - phone, адрес обрабатывающего скрипта http://send_forms/send.php. Этот скрипт для регистрации выполнит:
$file=@fopen("http://адрес/cgi-bin/add.cgi?contact=$contact&e_mail=$e_mail&text=$text", "r");
if ($file) {echo "что-то сделано..."; fclose($file);}
И так для всех досок объявления, которые нужно обработать.
Еще один момент. Как правило, возможность автоматической регистрации объявлений довольно быстро отслеживают и прикрывают - чтобы не было искушения спамить. Что тут можно посоветовать... Пожалуй, вместо количества переходить к качеству, попробовать убедить админа сайта чтобы он разрешил автоматическую регистрацию (на каких-либо условиях) и т.п.
По этому вопросу вроде бы все. Вопросы, комментарии, предложения?
"ВАШЕ МНЕНИЕ"
Опрос работает в том случае, если у вас настроена почтовая программа (Outlook, The Bat! и пр.) При нажатии "Готово" просто создастся письмо с ответами, которое вам нужно разрешить отправить.
Пишите письма, доказывайте, опровергайте. Если вы явно не укажите на запрет (всего письма, вашего адреса), я буду публиковать письма в рассылке.