Доброго времени суток, на форумах сейчас куча предложений по покупке и продаже различных парсеров. Некоторые — достойные, а некоторые скажем так УГ которое пишется за пару минут на коленке, а цена не особо то и маленькая. Собственно, про написание простейших парсеров мы сейчас и поговорим. Зачем платить за то, что можно написать самому приложив минимум усилий? я придерживаюсь такой политике.
Прежде всего, что такое парсер — это программа или скрипт, которая выполняет ряд простых функций, таких как сбор той или иной информации с, как правило, страниц какого либо сайта. Как пример — мой парсер кинопоиск. Для написания парсера требуется минимум знаний, знание стандартных функций delphi, на делфи мы собственно и будем писать парсер.
Прежде всего, давайте определимся, что мы будем парсить, я выбрал сайт blograte.ru . Это обычный рейтинг блогов, который имеет в своём наличии кучу сайтов различных тематик. Так же отоброжает колличество подписчиков по feedburner и alexa rank. Эти данные мы и будем парсить с сайта, не знаю, зачем выбрал этот рейтинг сайтов, но больше нечего в голову не пришло.
Перед написанием парсера давайте рассмотрим ряд функций, которые помогут организовать нам нужный функционал.
Функции для парсинга
Функция ‘pos‘ служит для определения вхождения нужной нам подстроки, другими словами — ищет нужный нам текст и выдаёт его позицию, например:
data:='Пишем парсер на delphi'; index:=pos('парсер', data);
после этих манипуляций index будет равнятся 7 . Функция ‘pos’ принимает всего два параметра, такие как
искомая строка и текст, где непосредственно производится поиск искомой строки.
Функция ‘posex‘ аналогична функции ‘pos’ с тем лишь различием, что в качестве 3 параметра может принимать
смещение, после которого необходимо производить поиск, например:
data:='Пишем парсер сайта, парсер за 5 минут'; index:=pos('парсер', data, 15);
вернёт нам позицию (21) не первого слова ‘парсер’ а второго, так как в качестве третьего параметра мы указали смещение, откуда и будет производиться поиск. К слову, для того что бы использовать эту функцию, нам необходимо в uses подключить strutils, т.е.:
uses windows, messages, ......., strutils;
это что касается поиска позиций, помимо этого нам также потребуется:
функция ‘copy‘ — производит копирование текста. Функция принимает 3 параметра, первый параметр это откуда копировать, второй параметр, это с какой позиции копировать и третий параметр — сколько копировать символов, пример:
data:='Полезная функция copy' text:=copy(data, 10, 7);
после выполнения этих комманд, переменная text будет содержать слово ‘функция’.
На этом всё, это три основные функции которые позволят нам спарсить что угодно откуда только мы пожелаем
Написание парсера на delphi
Собственно запускаем delphi, кидаем на форму idhttp, батон и идём на blograte, открываем исходный код и ищем там первый никнейм т.е. кто на первом месте — это то, откуда мы будем начинать парсить. Затем смотрим, в какие теги заключён ник и пишем процедуру парсинга, у меня получилось следующее:
name:=trim(copy(data, pos('"_blank">',data)+9, posex('</a>', data, pos('"_blank">', data)+9) - pos('"_blank">', data)-9));
Тут мы вызываем функцию копирования, в первом параметре передаём переменную ‘data’ типа ‘string’, в ‘data’ содержится исходный код страницы, который получается я думаю известным всем способом:
data:=idhttp1.get('blograte.ru');
после чего в качестве второго параметра передаём позицию, откуда начинать копировать, в свою очередь эту позицию ищем функцией ‘pos’+9 символов (длина искомой строки ‘»_blank»>’). Ну а в третий параметр передаём сколько символов необходимо копировать. Эту цифру получаем функцией posex которую я чуть выше описывал. После выполненного кода, в переменной name будет имя первого человека в рейтинге.
После чего аналогичным кодом ищем число подписчиков:
feed:=trim(copy(data, pos('<td class="limit">',data)+18, posex('</td>', data, pos('<td class="limit">', data)+18) - pos('<td class="limit">', data)-18));
и удаляем всё это дело из переменной (дабы не производить лишних телодвижений с сохранением позиций):
delete(data,1, pos('<td class="limit">',data));
после чего ищем Alexa Rank, кот такой же, как и выше:
alexa:=trim(copy(data, pos('<td class="limit">',data)+18, posex('</td>', data, pos('<td class="limit">', data)+18) - pos('<td class="limit">', data)-18));
Затем необходимо удалить все эти данные и перейти к парсингу второго места, удаление производим всё той же функцией delete:
delete(data,1, pos('<tr class="line',data));
не забываем показать спарсенные данные:
showmessage('Имя: '+utf8toansi(name)+#13#10'Подписчиков: '+utf8toansi(feed)+#13#10'Alexa: '+utf8toansi(alexa));
всё это дело необходимо делать в цикле, т.к. на странице выводится по 30 мест то, полный код примет вид:
var data, name, feed, alexa:string; i:integer; begin data:=memo1.lines.Text; delete(data,1, pos('<tbody>',data)); for i:=0 to 4 do begin // Имя name:=trim(copy(data, pos('"_blank">',data)+9, posex('</a>', data, pos('"_blank">', data)+9) - pos('"_blank">', data)-9)); // Подписчики feed:=trim(copy(data, pos('<td class="limit">',data)+18, posex('</td>', data, pos('<td class="limit">', data)+18) - pos('<td class="limit">', data)-18)); delete(data,1, pos('<td class="limit">',data)); // Алекса alexa:=trim(copy(data, pos('<td class="limit">',data)+18, posex('</td>', data, pos('<td class="limit">', data)+18) - pos('<td class="limit">', data)-18)); showmessage('Имя: '+utf8toansi(name)+#13#10'Подписчиков: '+utf8toansi(feed)+#13#10'Alexa: '+utf8toansi(alexa)); delete(data,1, pos('<tr class="line',data)); end;
в начале кода так же фигурирует функция delete, которая удаляет всё лишнее до основной информации которую нам необходимо спарсить и присутствует функция utf8toansi которая переводит кодировку из utf8 в ansi. Вот наш парсер и готов. К слову, я уже писал что у меня барахлит компьютер, если с вашим ПК так же приключилось не счастье, например не включается при запуске или атакуют вирусы и нужно срочно установить антивирусное ПО, то советую обратится к center-it-pomoshi.ru — сервисный компьютерный, где высококвалифицированные специалисты произведут срочные работы над восстановлением работы вашего компьютера с приездом на дом в Москве. На этом у меня всё, удачи..