Примитивный PHP парсер e-mail адресов из поисковой выдачи
Появилась необходимость парсить поисковую выдачу на предмет e-mail адресов, и сохранять результат в файл. Это мой первый парсер, поэтому он примитивен и работает в полуавтоматическом режиме, но зато парсит прямо с локальной машины и просто облегчает рутинный труд. В дальнейшем по мере прокачивания скила разработчика, я буду усовершенствовать код, и может, когда-нибудь он станет идеальным.
Изучаем пациента
Для начала посмотрим как строится GET запрос яндекса. Для этого вбиваем в поисковую строку какой-нибудь запрос, например, "ремонт кондиционеров". В расширенных настройках поиска выбираем регион, например СПб, и количество результатов на одной странице (чем больше тем лучше), но у яндекса стоит ограничение в 50 результатов на одной странице. В итоге получается 20 страниц выдачи по 50 результатов на каждой странице = 1000 сайтов для парсинга, для одного ключевого запроса. Но нам нужны не просто главные страницы сайтов, нам нужны страницы с контактами откуда мы будем выдирать e-mail адреса, поэтому наш запрос будет выглядеть так - "ремонт кондиционеров e-mail". Смотрим в адресную строку http://yandex.ru/yandsearch?p=1&text=ремонт%20кондиционеров%20e-mail&numdoc=50&lr=2
, что здесь видим:
- "p=1" - это номер страницы выдачи (всего их 20ть)
- "text=ремонт%20кондиционеров%20e-mail" - это сам ключ запроса
- "numdoc=50" - количество результатов на странице
- "lr=2" - регион
Автоматизируем рутинный труд средствами PHP
В нашем скрипте мы не будем представляться браузером, имитировать действия пользователя, поэтому ранее я писал, что парсер примитивен, но при желании можно прикрутить всю эту лабуду. Создаем на локальной машине файл yandex.php, в него пишем следующее:
<?php
// Создаем человекопонятный поисковый запрос
$query = "Автомобильный салон";
// Задаем переменную с номером страницы
$i = 6;
// Задаем переменную с кодом региона
// регион 2-Спб 213-Москва 65-Новосибирск 54-ЕКБ
$region = 2;
// Все части запроса в отдельных переменных, в дальнейшем их будет удобно изменять
// Преобразуем ключевое слова под формат GET запроса
$query = str_replace(" ", "+", $query);
// Присоединяем к поиску "e-mail"
$query .= '"e-mail%3A"';
// Получаем готовый url
$url = "htt p://yandex.ru/yandsearch?p={$i}&text={$query}&numdoc=50&lr={$region}";
// Запрашиваем страницу по сформированному url, сохраняем в $str
$str = file_get_contents($url, false, $context);
// Выводим страницу для просмотра в браузере
print $str;
// С помощью регулярного выражения из загруженной страницы ищем "@"
// и заносим сам e-mail в массив
preg_match_all("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$str,$matches);
$urls[] = $matches[0];
// Пишем результат в файл
$fb = fopen('email-yandex.txt', 'write');
// Делаем разделителем запятую
fwrite($fb, implode(",",$urls[0]));
?>
Вот и все. Запускаем денвер. В браузере запрашиваем наш файл localhost/yandex.php, после запуска в файле email-yandex.txt записываются все e-mail'ы со страницы, в коде меняем переменную $i на единицу больше (листаем страницу вперед), обновляем localhost/yandex.ru, забираем новые адреса.
Конечно можно было бы сделать изменение $i через цикл for, но тогда яша нас быстро палит и дает капчу, поэтому я написал, что парсер полуавтоматический.