Поиск по блогу

четверг, 24 декабря 2009 г.

Парсинг findarticles.com - part 2

Итак, следуя инструкциям в предыдущем посте, мы получили список ссылок на статьи. Теперь переходим к самому интересному на мой взгляд — к парсингу текста. Это интересно, но вместе с тем и трудоемко. Бывают ресурсы, на которых все легко и просто разбирается. А бывают и такие, на которых нужно быть внимательной и не полениться просмотреть выборку после первого запуска: вылазят некоторые неучтенные детали, которые нужно дополнительно обработать.

Ресурс findarticles.com как раз поможет мне продемонстрировать ход "изысканий" :)

Открываем любую статью и тщательно вглядываемся в код.

Как я уже писала, есть два основных способа "добычи" данных из html: применение регулярных выражений и разбор DOM-модели. Наверное, для практики стоит разобрать оба.

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



Для начала — алгоритм "с высоты птичьего полета", в общих чертах. В качестве входных данных будем использовать файл с ссылками, полученный в результате запуска скрипта, описанного в первой части инструкции. Нам понадобится в процессе работы еще один список, в котором мы будем хранить ссылки, по которым уже прошлись. Это надо для удобства: чтобы не делать повторно одну и ту же работу, когда процесс парсинга разбивается (преднамеренно или случайно) на несколько частей.

Итак, по очереди берем из списка ссылку, проверяем, не парсили ли ее. Если парсили — переходим к следующей. Если не парсили — парсим. Скачиваем содержимое, выдираем :) основное, чистим, записываем в файл. У меня запись проводилась так: создается папка по с заданным ключевиком в качестве названия, в ней создаются файлы с названиями, соответствующими названиям статей. В файл записываю данные в следующем виде:

[TITLE]
Заголовок
[/TITLE]

[CONTENT]
Текст
[/CONTENT]


Вот, в общем-то, и все. Теперь переходим к самой муторной части работы — к обработке данных.

В html-коде страницы наблюдаем наличие тегов распределения "веса значимости" контента для Google AdSense (google_ad_section_start, google_ad_section_end). Я поступлю следующим образом: в качестве основы для обработки возьму содержимое, расположенное внутри этих тегов.

Составляю регулярку, склеиваю части, получаю "черновой материал".

$text_pattern = '#<!--\sgoogle_ad_section_start.*?-->[\n\s]+(.*?)[\n\s]+<!--\sgoogle_ad_section_end.*?-->#ism';
if (preg_match_all($text_pattern,$html,$text_matches, PREG_SET_ORDER))
{
$res_text = '';
foreach($text_matches as $val)
{
$res_text = $res_text.$val[1];
}
}


Подчеркну, что для чистки кода необходима внимательность и несколько страниц для тестов. Бывает, когда парсинг делается впопыхах, остается незамеченным мусор, который мы можем потом видеть на сайтах. Как пример, легко нашла в гугле по строчке из кода сайт, наполняемый материалами с findarticles.com. На скрине видно допущенные программистом ляпы.


Итак, первоначальные данные надо почистить. Я не буду описывать все действия поштучно, все будет видно в листинге. В статье я листинг не привожу, скачивайте и смотрите, постаралась максимально подробно прокомментировать код. Вкратце отмечу, что пришлось "вычистить" лишние дивы, такие, как, например, этот:

отформатировать немного абзацы, убрать лишние пробелы.

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

Как я уже сказала, результатом будет набор файлов в папке с названием ключевика:


___

Пламенный привет и благодарность за обзоры авторам Блога SEO-отшельника и блога "Истина где-то рядом" :) Все никак не могу собраться и выложить новый конфиг RSSAdder-а, но в моих планах это записано.
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



2 комментария:

  1. Мария, шикарный парсер, очень все здорово! Но я знаю гораздо более шикарное место "бесплатных статей" - articlesbase.com судя по alexa rank посещаемость у него гораздо больше, и материала возможно больше. У этого сайта нет блокировки от большого числа запросов как у ezinearticles. Скажите сильно много надо переделать в вашем парсере под articlesbase.com, это реально сделать чайнигу самостоятельно?

    ОтветитьУдалить
  2. Анонимный, думаю, что проблем не должно возникнуть :) В крайнем случае - можно и подучиться, чтобы не быть совсем уж "чайником". Мне кажется, что в статьях я достаточно подробно все описываю...

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться