18th Ноябрь 2007, 04:33 пп
За прошедшие несколько месяцев парсинг, граббинг и сбор информации показали себя как достаточно актуальные и востребованные услуги на современном рынке IT-услуг.
В связи с этим я хочу еще более расширить список клиентов компании ParserPro и в качестве первого шага на этом нелегком пути я представляю партнерскую программу.
С сегодняшнего дня в нашей компании действует партнерская программа на следующих условиях:
- За каждого приведенного мне клиента участник партнерской программы получает 20% от стоимости заказа клиента.
- Если участник партнерской программы привел более 5 клиентов, то он получает 25% от стоимости заказа с каждого последующего заказа.
Для регистрации в партнерской программе вы должны отписать мне на ICQ, либо на емейл (смотрите контакты), либо оставить комментарий к данному посту. От вас требуются следующие данные: ФИО, контактные данные.
Вот так все просто. Вы приводите заказчиков для нашей компании и зарабатываете деньги!
17th Ноябрь 2007, 10:48 пп
На очередном заказе я поставил новый личный рекорд по количеству собранных данных (отдельно собранные ссылки, картинки и прочее в счет не берем):
230 000 записей!
База собиралась изначально в 2 потока, а потом в 5 в течении 3х дней. В процессе работы над этим заказом я понял:
- Что мне нужно купить новый компьютер
(что я уже удачно и сделал);
- Что для каждого проекта нужно писать контроллер процесса выполнения, чтобы случайная остановка сайта-источника на пару часов не останавливала процесс сбора информации и не привела к искривлению данных в базе;
- Что в php memory_limit нужно ставить в значение 64М и постоянно вести мониторинг ресурсов, а то кто бы что не говорил, но php “течет” и это факт, доказанный практикой;
- Что нужно проводить оптимизацию регулярных выражений (этому я думаю посвятить отдельную статью).
Думаю, что некоторые из этих мыслей могут быть полезны другим про в области сбора информации.
Особенно важным моментом является контроль процесса выполнения. В каждом конкретном случае его можно реализовать по разному и я вот сейчас работаю над созданием универсального класса. Как только будут первые наработки - я сразу же отпишу про это в очередной заметке.
10th Ноябрь 2007, 05:22 пп
В данной заметке я хочу затронуть вопрос нахождения и удаления дублирующихся записей в MySQL.
И это касается не только вопроса сбора информации. Предлагаемые методы будут очень полезны начинающих программистам, которые ищут оптимальное решение в данном вопросе.
Для того, чтобы было проще объяснять код я создам тестовую таблицу work с ней буду производить свои эксперименты.
Таблица work имеет следующую структуру:
CREATE TABLE work(
id mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
region varchar(255) NOT NULL,
job_mask varchar(255) NOT NULL,
job_group varchar(255) NOT NULL,
job_info text,
PRIMARY KEY(id));
Вдаваться в тонкости создания таблиц мы не будем, так как это не является целью данной статьи.
Предположим, что таблица work уже заполнена данными.
Теперь вам надо оставить в таблице только уникальные данные в поле job_info для каждого значения region, job_group, job_mask.
Первым делом вы должны определить есть ли у вас дублирующиеся данные и сколько их (ведь если их нет, то вам и делать ничего не надо). Для этого вам стоит выполнить следующий запрос:
SELECT COUNT(*) AS dub, region, job_group, job_mask, job_info
FROM work GROUP BY region, job_group, job_mask, job_info HAVING dub>1;
В результате выполнения запроса вы увидите таблицу с уже знакомыми вам полями и с дополнительным полем dub, которое будет содержать количество дублирующихся записей.
Далее удаление можно организовать следующими путями:
- Циклический обход-1.
Данный метод я называю “циклический обход-1″, потому что одну запись мы всегда оставляем не тронутой.
Реализуется данные метод следующим способом:
// соединение с БД
$query='SELECT COUNT(*) AS dub, region, job_group, job_mask, job_info
FROM work GROUP BY region, job_group, job_mask, job_info HAVING dub>1';
$res=$db->query($query);
if(!$res) {
echo $db->error();
} else {
while($row=$db->fetchAssoc($res)) {
$region=$row['region'];
$job_mask=$row['job_mask'];
$job_group=$row['job_group'];
$job_info=$row['job_info'];
$query="SELECT id FROM work
WHERE region='$region' AND job_mask='$job_mask'
AND job_group='$job_group' AND job_info='$job_info'";
$result=$db->query($query);
if(!$result) {
echo $db->error();
} else {
$i=1;
while ($subrow=$db->fetchArray($result)) {
if ($i==1) {
$i++;
continue;
}
$query="DELETE FROM work
WHERE id='{$subrow[0]}'";
$del_res=$db->query($query);
if(!$del_res) {
echo $db->error();
} else {
$deleted++;
}
$i++;
}
}
}
}
Методы объекта $db, которые используются по ходу выполнения скрипта, являются методами моего стандартного абстрактного класса для доступа к БД. Имена методов очень тесно переплетаются с именами стандартных функций для работы с MySQL, поэтому я не вижу смысла останавливаться на этом более детально.
В своих скриптах вы можете использовать привычные вам инструменты.
Главным преимуществом данного решения есть простота. Однако есть и очень большой недостаток - низкая скорость выполнения. На больших таблицах с большим количеством записей данный скрипт будет выполняться очень долго. Так что не забудьте поставить лимит времени и лимит памяти побольше.
- Использование запроса SELECT.
Второй вариант решения поставленной проблемы также достаточно распространен и предполагает некоторые знания в области SQL.Далее я приведу несколько запросов направленных на удаление дублирующихся записей и дам детальное их описание.
Выборка уникальных данных в отдельную таблицу. Реализуется данный метод следующим образом:
CREATE TABLE original
SELECT DISTINCT * FROM work ORDER BY id;
Данный запрос создаст таблицу original с оригинальными значениями, выбранными из таблицы work.
Также можно использовать следующую модификацию вышеуказанного выражения:
CREATE TABLE original
SELECT * FROM work GROUP BY region, job_group, job_mask, job_info
ORDER BY id;
Дополнительная информация:
P.S. Думаю, что для начала этого инструментария будет достаточно. Но я не оставляю данную тему и надеюсь в ближайшем будущем предоставить дополнительную информацию по обработке дублирующихся записей в MySQL.
6th Ноябрь 2007, 03:20 пп
Завершен очередной удачный проект, о котором я просто не мог не написать на этом блоге.
На этот раз мною был разработан парсер списка освобождающихся доменов. Источник сбора доменов я из личных соображений называть не буду.
Возможности парсера:
- парсинг CSV файла с параметрами доменов;
- проверка на наличие домена в Яндекс Каталоге, Каталоге Mail.RU, Каталоге DMOZ;
- проверка на дублирование доменных имен;
- почтовая рассылка доменов подпадающих под указанный пользователем фильтр.
30th Октябрь 2007, 03:21 пп
Статистика назойливо показывает, что на мой сайт каждый день приходят посетители по запросу “больше 1000 ссылок в Google” и ему подобным. Поэтому я решил вынести тему получения более 1000 ссылок в выдаче Google в отдельный пост.
Итак. Есть следующие основные пути получения в выдаче более 1000 сайтов:
- Использование дополнительного оператора (иногда еще называют модификатора) site.
Расскажу как можно это использовать на простом примере.Например вам надо собрать 5 000 ссылок по запросу “sex” (первое что пришло в голову).
Тогда вы можете составить следующий список запросов для выполнения своим парсером:
sex site:com
sex site:org
sex site:net
sex site:info
sex site:biz
Это соберет все сайт, в чьих доменных именах есть слово sex и которые принадлежат к зоне com, net, org, info и biz. Если же надо собрать все сайты, которые просто содержат это слово и принадлежат к вышеуказанным доменам, то надо выполнить следующие запросы (сделать небольшую перестановку):
site:com sex
site:org sex
site:net sex
site:info sex
site:biz sex
И в результате распарсив выдачу Гугла вы получите желанные 5 000 ссылок.
Также на некоторых форумах я видел новомодный метод сбора только доменных имен с “-” в имени. Для нашего запроса он будет имеет следующий вид:
sex site:com -site:*com
Данный запрос соберет все домены, у которых в имени есть слово sex и “-” (тире). Однако люди занимающиеся SEO знают, что домены с тире в имени попадают под некоторые определенные фильтры Гугла, что само по себе понижает их ценность. Но если уж слишком надо, то можно и таким запросом пользоваться.
Для получения всех сайтов, у которых в доменном имени есть тире и на которых упоминается про sex опять надо немного перекрутить запрос:
site:com -site:*com sex
При помощи подобных инструментов можно получить просто немерянно ссылок по практически любому запросу. Особенно ВЧ англоязычному.
Полный список доменных зон для подобных махинаций с запросами вы можете найти тут: ccTLD (региональные) | gTLD (general).
- Использование уточняющих слов.
Про это я уже детально рассказывал. Главное - просто добавляйте к своему запросу еще по уточняющему слову.
- Синонимизация.
Очень непростой и неоднозначный инструмент, которым, по моим наблюдениям, пользуются только некоторые профи.
Принцип действия данного метода достаточно простой. Собирается (или чаще всего покупается) база синонимов. Потом на основе этой базы делается замена слов в запросе на синонимы. Таким образом вы увеличивается массу собранных ссылок.
Хотя со своей стороны могу сказать, что я подобным методом не пользовался, так как при его использовании очень сложно контролировать качество выдачи. Понятное дело, если вам нужно насобирать базу каких-то досок или форумов для спама по определенной тематике, то вам абсолютно все равно какого качества идет выдача, но я, например, подобным не занимаюсь, а для статистических исследований качество выдачи имеет чуть-ли не главную роль.Поэтому советую оставить данный метод “про запас”.
- Танцы с бубном и прочими оператора (модификаторами) Гугла.
Это такой обобщенный метод. Используется в основном для сбора баз для спама, поэтому я расскажу о нем вкратце.Метод основан на использовании всевозможнейших операторов: inurl, intitle …
В основном спамеры используют запросы с inurl: script.php, что помогает им находить определенные движки, которые они умеют спамить. Но это совсем не интересно и не ко мне.
Дополнительная информация:
- ccTLD
- gTLD
- описание основных операторов (/модификаторов) запросов к Google
- Google Hacks (2nd Edition) (книга про всевозможнейшие трюки с запросами)
28th Октябрь 2007, 11:37 дп
Только сегодня заметил, что из-за кривого плагина статистики на блоге не работает RSS лента.
Плагин статистики удалил, а весь RSS траффик пустил через FeedBurner, так что теперь прошу всех моих подписчиков поменять адрес RSS сайта ParserPro на этот.
Спасибо.
26th Октябрь 2007, 09:55 пп
На этот раз я разработал парсер поиска по Яндекс.Директу.
Возможности разработки:
- парсинг количества результатов
- работа через прокси
- сохранение результатов в CSV
- отдельное хранилище для высокочастотных запросов (порог вхождения устанавливается пользователем)
- возможность установки таймаутов между запросами
- контроль процесса обработки запросов: возможность запуска парсера с точки остановки без необходимости перезапуска всего процесса
- контроль и просмотр результатов «на лету»: до окончания процесса парсинга возможен просмотр результатов и их обработка (по уже пропарсенным запросам)
- INBOX для хранения результатов парсинга всех групп запросов
… и множество других удобств, которые помогут заказчику достигать намеченных результатов в кратчайшие сроки и с максимальным удобством.
P.S. На носу еще парочка полезных инструментов, так что следите за новыми постами. Я уверен, что вы сможете найти что-то интересное для себя.
24th Октябрь 2007, 12:16 пп
Данную заметку я написал для людей, которые всерьез занимаются парсингом и сбором информации.
Я читаю очень много профильных изданий на тему парсинга и вижу, что профи в этой области беспокоятся лишь об одном - чтобы их скрипты не забанил источник информации.
Как по мне это совершенно неправильно, ведь помните как говорится - “Поступай с ближним так, как ты хочешь чтобы он поступал с тобой”. И исходя из этого изречения я постарался сформулировать несколько тезисов для профипарсеров:
- Перед началом работы проанализируйте статистику сайта-источника и выберите оптимальное для парсинга время.
В настоящее время сделать это достаточно просто, так как большинство интересных и стоящих сайтов участвуют во множестве рейтингов, где можно увидеть их посещаемость не только по дням, но и по часам, что особенно важно. Благодаря этому вы можете подобрать время, когда сервер максимально разгружен. Чаще всего это период между 3-7 часами утра.
Но это не значит, что вы должны в 3 часа утра сидеть перед компом. От вас требуется всего лишь нормально настроить свой компьютер, веб-сервер, поставить на компе будильник (есть такая опция в BIOS Setup) и правильно настроить крон для запуска скриптов.
А если вы используете сервер хостера, то и того проще - просто поставить скрипт на крон.
У этого совета есть еще и практически полезная сторона - в ненагруженные часы вы будете получать ответы от сервера-источника на порядок быстрее, чем в “час-пик”, что ускорить парсинг информации и поможет избежать перегрузок на второй стороне.
- Разбивайте процесс парсинга на максимальное количество независимых процессов.
Очень часто процесс парсинга является двухуровневым или даже трехуровневым (или еще лучше сказать двухпроходным или трехпроходным), то есть происходит в несколько этапов: сбор ссылок -> парсинг страницы или проход каталога -> сбор ссылок (или прочих параметров) -> парсинг конечных страниц.
И я в своей работе каждый этап стараюсь реализовать разными скриптами и запускать их в разные промежутки времени, чтобы снизить нагрузку на конечный сервер.
Это очень удобно и в практическом плане позволяет разделить логику работы скрипта, что несомненно улучшает контроль за процессом и позволяет сделать этапы сбора информации независимыми.
Конечно же минусом такого разбиения является увеличение времени разработки. Но поверьте, если проект крупный, то затраченное на этой стадии время окупится вам с лихвой.
- Ставьте паузы между запросами.
Это важный момент (и парсеры поисковиков знают о чем я говорю :)). И вам не стоит его игнорировать.
Если ваш парсинг предполагает обработку большого объема информации, то вам стоит добавить между запросами небольшие паузы, которые помогут разгрузить удаленный сервер. В противном случае вы можете забить пул запросов и сайт-источник может плавно умереть. И это поверьте мне это очень плохо, потому что тогда ваши действия могут трактовать как (D)DoS-атаку, а это уже уголовно наказуемо.
В своей работе работе я, в основном, использую паузы длиной 100-500 мск.
- Используйте весь возможный инструментарий для снижения объемов передаваемой информации.
При возможности (если это позволяет сервер-источник) используйте Content-Range в своих HTTP запросах (у curl для этого есть опция CURLOPT_RANGE). Это позволит вам сэкономить как свой траффик, так и траффик сервера-источника.
К моему удивлению, Яндекс чего-то не захотел обрабатывать данный HTTP запрос.
Это основные правила, которых, как я считаю, должен придерживаться каждый профи и в основе которых лежит уважение к работе других.
И на последок хочу напомнить, что ваш парсер/граббер в определенный промежуток времени создает нагрузку на порядок больше, чем броузер обычного пользователя. Ведь у парсера не тратится время на рендеринг, парсер не подгружает картинки (если вы ему этого не сказали) и поэтому парсер “листает” страницы сайта-источника на порядок быстрее, чем пользователь. Поэтому не стоит наращивать скорости, потому что вы можете просто “завалить” сервер-источник.
Дополнительные ссылки:
18th Октябрь 2007, 12:01 пп
На днях закончил выполнение очередного заказа. На этот раз мною были собраны 2 базы
- База предприятий Украины;
- База предприятий Киева.
Немного опишу эти базу для потенциальных покупателей.
- База предприятий Украины
Всего записей в базе: 9 977
Всего категорий: 17
Форматы: CSV | MySQL dump
Всего подкатегорий: 15 (подкатегории есть лишь у небольшого числа компаний, основной упор делается на категорию, которая есть у каждой компании)
Данные, представленные в базе: название, форма собственности, зкпо (пустое значение, оставлено для совместимости с другими базами), направление деятельности (внутренний рынок, экспорт, импорт…), вид деятельности (торговля, услуги, производство), рынки (Украина, Россия …), адрес, телефон (городской, мобильный), факс, e-mail, продукция, услуги.У каждой фирмы то или иное поле может быть пустым.
Стоимость базы: 30 $.
Просмотреть пример базы (10 записей | CSV)
- База предприятий Киева
Всего записей в базе: 6 722Данная база полностью повторяет структуру базы предприятий Украины, с тем отличием, что представлены исключительно киевские компании.
Данная база является частной выборкой из базы предприятий Украины.
Стоимость базы: 20 $.
Просмотреть пример базы (10 записей | CSV)
15th Октябрь 2007, 09:22 пп
Данная статья призвана помочь начинающим программистам (или даже их менеджерам), которые всерьез решили заняться сбором и обработкой информации.
Для работы над любым удачным проектом по сбору и обработке информации нужно:
- Определить все значимые параметры собираемой информации.
Это очень важный этап, который все непонятно почему пытаются пройти как можно быстрее (наверное хотят побыстрее заработать).
Пример.
Заказчик попросил вас собрать базу компаний и вы без особых размышлений кинулись в бой.
Но тут не стоит спешить. Надо уточнить:
- по какому региональному признаку отбирать компании?
- каким видом деятельности должны заниматься отбираемые компании?
- какой юридической формы собственности надо отбирать предприятия?
Нужно собрать как можно больше значимых признаков.
Тут я привел очень простой пример, но на практике даже небольшое уточнение поможет сделать вашу работу быстрее и лучше.
- Найти источник информации
На данном этапе следует произвести детальный поиск источника (источников) информации, который максимально удовлетворил бы всем значимым параметрам, которые вы определили в пункте 1. И поверьте мне, это не так уж и просто, как может показаться на первый взгляд. Поэтому я советую вам не концентрироваться на поиске какого-то одного идеального источника, а составить какую-то небольшую таблицу вариантов, из которых вы потом сможете выбрать самый лучший.
- Определить форму представления информации
Если вам надо собирать все подряд и как попало, то этот этап вы можете смело откинуть.
В противном случае стоит определить какие параметры вам стоит собирать, а какие не стоит.
Например, очень часто у меня появляются заказы на сбор базы данных людей. Например, IT специалистов. Источником для такой информации выступают сайты поиска работы и профессиональные сайты. Но на том же сайте поиска работы в IT специалисты попадают даже наборщики текстов, которые, понятное дело, не нужны моему заказчику. Поэтому на основе данных, полученных в пункте 1, я составляю список совпадений и исключений, который и использую при сборе и анализе информации.
- Выбрать средства для сбора информации
Для меня это очень просто – настроил парсер (хотя мне больше нравится слово паук) и в бой.
А если у вас нет соответствующих навыков, то вы можете заказать подобную услугу у профессионалов, либо прибегнуть к каким-то программным средствам, которые уже далеко не редкость.Тут главное подобрать что-то достаточно гибкое и быстрое. Скорости стоит уделить особое внимание, потому что порой приходится собирать базы в миллионы записей и промедления даже в доли секунды на таких объемах будут значимыми.
Вот и все. Надеюсь, что мне удалось дать вам понимание процесса качественного сбора и анализа информации.
Если у вас будут вопросы, заказы или предложения – свяжитесь со мной.
Удачи!