Прямой парсинг сайтов.

Lasto's Abductor, Похититель буковок Lasto's Abductor, Похититель буковок

Прямой парсинг сайтов.

Является разновидностью варианта парсинга поисковика.
Но правило парсинга тут обычно гораздо проще, и пишется за минуту.

Давайте зададимся целью взять статьи с одного из разделов какого-нибудь сайта, и на этом примере рассмотрим алгоритм составления правила парсинга.

На что стоит обратить внимание.

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

Оно, конечно, можно настроить скрипт и на сканирование сайта целиком. Однако люди, занимающиеся подобными вещами, не понимают, что дублирование одного сайта в другом бесперспективно - весь этот устоявшийся контент давно известен поисковикам, и никакого трафика дубликат не получит. А получит фильтры и скорый бан.

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

Далее.

Поскольку правило парсинга ресурса привязано к его дизайну (через регулярное выражение для извлечения ссылок на новые статьи), необходимо стремиться либо сразу писать регулярку так, чтобы она была минимально чувствительна к возможным вариациям дизайна, либо парсить редко изменяемые документы.

Создание правила парсинга.

Для всяких новостийников представляют интерес ресурсы, публикующие взвешенные и осмысленные статьи. Так, новости о России можно черпать в том числе и с такого сайта, как "Русская служба BBC".

Однако, принимая во внимание вышеозначенные рекомендации, прежде, чем бросаться писать правила парсинга для морды этого раздела, стоит более тщательно исследовать сайт.

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

OK, этим разделом и воспользуемся.

  1. URL интересующего нас раздела выглядит так:
    http://www.bbc.co.uk/russian/mobile/russia/index.shtml

    Однако мы понимаем, что сегодня вебмастер сервера использует SSI, а завтра вебмастер сменится, и всё станет иначе. Чтоб каждый раз не переписывать правило парсинга ресурса под нового вебмастера, весьма рекомендуется абстрагироваться от конкретного расширения индексного файла раздела, и напрямую обращаться сразу к его директории. Записав URL ресурса в правиле парсинга так:

    [bbs.russia][serp][url]=http://www.bbc.co.uk/russian/mobile/russia/

  2. Далее смотрим в HTML код документа.
    И, видя пять сотен пустых строк, впечатляемся крутизной вебмастера :)

    Ну и попутно замечаем, что ссылки на статьи вовсе не абсолютные. И, стало быть, в полном соответствии с рассуждениями, изложенными в документе про парсинг поисковиков, которые мы тут повторять ещё раз не станем, нам понадобится в правиле парсинга такая строчка для преобразования относительных ссылок на статьи в абсолютные:

    [bbs.russia][snip][url]=http://www.bbc.co.uk/russian/mobile/russia/

<div id="top-stories">
   <div class="content">
      <div class="ts-image ts-144x81"><a href="/russian/mobile/russia/2013/01/130125_duma_gay_propaganda_law.shtml"><img alt="Полиция задерживает активистов " width="144" height="81" src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/01/25/130125085252_duma_lgbt_arrest_144x81_bbc_nocredit.jpg" /><br /><span class="title">Закон о "гей-пропаганде" прошел первое чтение в Госдуме</span></a><p class="clear"></p></div>
   </div>
   <div class="content">
      <div class="ts-text ts-headline"><a href="/russian/mobile/russia/2013/01/130125_duma_smoking_second_reading.shtml"><span class="title">Российский антитабачный закон останется жестким</span></a>
   </div>
...
  1. Сама же регулярка может выглядеть так:

    <div class=\"ts-[image|text][^>]*?\"><a href=\"(.+)\">

    Однако из общих соображений её можно чуть усложнить.
    Обезопасив себя от мелких редизайнов:

    <div class=\"ts-[image|text][^>]*?\">.*<a[^>]*?href=\"(.+)\".*>

Стало быть, правило парсинга раздела "Россия" Русской службы BBC выглядит так:

[bbs.russia][serp][url]=http://www.bbc.co.uk/russian/mobile/russia/
[bbs.russia][snip][url]=http://www.bbc.co.uk/russian/mobile/russia/
[bbs.russia][snip][tmpl]=<div class=\"ts-[image|text][^>]*?\">.*<a[^>]*?href=\"(.+)\".*>

Эти строчки тут же можно перенести в тулзу проверки правил парсинга сайтов.
Задание парсеру во втором поле формы может быть таким:

[bbs.russia][0][0]=

Если всё работает, и извлекает из нужного раздела ссылки на новости, тем самым цель достигнута. Можно прописывать правило в админке, в Правила поиска статей на донорских ресурсах.

Не желаете идти простым путём?

Хорошо. Можно не использовать мобильную версию сайта.
Сниппеты анонсов новостей на основном сайте немного разнообразнее:

<div class="ts-384emp teaser">
   <h2 class="link title"><a href="/russian/russia/2013/01/130125_duma_gay_propaganda_law.shtml">Закон о "гей-пропаганде" прошел первое чтение в Госдуме<img src="http://www.bbc.co.uk/worldservice/ic/384x216/worldservice/assets/images/2013/01/25/130125122514_duma_gays_640x360_evn_nocredit.jpg"
      width="384"
      height="216"
      alt="" /></a></h2>
   <div id="emp-22562963" class="emp emp-f-video"
        rel="http://www.bbc.co.uk/russian/meta/dps/2013/01/emp/130125_v_duma_gays_protest.emp.xml"><!-- v --></div>
   <div class="body">
      <p class="summary">Госдума приняла в первом чтении законопроект о запрете пропаганды гомосексуализма среди несовершеннолетних. Обсуждению в нижней палате предшествовала стычка "православных миссионеров" с ЛГБТ-активистами.</p>
      <ul class="associated">
         <li><a href="/russian/russia/2012/12/121209_lady_gaga_petersburg.shtml">Леди Гага на концерте в Петербурге поддержала ЛГБТ</a></li>
         <li><a href="/russian/russia/2012/10/121012_gays_in_russia.shtml">Гей-активисты: Россия - одно из худших мест в Европе</a></li>
      </ul>
   </div>
</div>
...
<div class="ts-144x81 teaser">
   <h2 class="link title"><a href="/russian/russia/2013/01/130125_duma_smoking_second_reading.shtml">Российский антитабачный закон останется жестким<img alt="сигарета - Госдума" width="144" height="81"
      src="http://wscdn.bbc.co.uk/worldservice/assets/images/2013/01/25/130125180723_cigarette_duma_144x81_bbc_nocredit.jpg" /></a></h2>
   <div class="body">
      <p class="summary">Российская Госдума провела второе, решающее для содержания чтение "антитабачного" закона и оставила в нем запреты на курение в ресторанах, подъездах и даже в поездах дальнего следования.</p>
      <div class="topics">
         <h3 class="label">Тэги</h3>
         <ul>
            <li class="primary-topic"><a href="http://www.bbc.co.uk/russian/topics/health" class="topic">Здоровье</a>,
            </li>
            <li><a href="http://www.bbc.co.uk/russian/topics/russia_authorities" class="topic">Власть в России</a>,
            </li>
            <li><a href="http://www.bbc.co.uk/russian/topics/editor_choice" class="topic">Выбор редактора</a></li>
         </ul>
      </div>
   </div>
</div>
...
<div class="g-block">
   <div class="g-container g-w10 g-first">
      <div class="ts-headline body-disabled teaser"><a href="/russian/business/2013/01/130124_russia_privatisation_plans_dvorkovich.shtml">Дворкович: доля государства в экономике снижается</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130125_missile_troops_cases.shtml">Командиров ракетных дивизий обвиняют во взятках</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130125_tsiskaridze_interrogation.shtml">Артистов допрашивают по делу о покушении на Филина</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130125_chechnya_insurgents_killed.shtml">Убиты боевики, напавшие на родное село Кадырова</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130124_smoking_ban_second_reading.shtml">Дума пощадит торговцев табаком, но не курильщиков</a></div>
   </div>
   <div class="g-container g-w10">
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130124_budanov_lawyer_case.shtml">Дело Буданова: подозрения в подкупе свидетеля</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130124_adoptions_echr_moskalenko.shtml">Семьи из США обжаловали запрет на усыновление в ЕС</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130124_vnukovo_crash_reverse.shtml">Ту-204 разбился во "Внуково" из-за отказа реверса</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/russia/2013/01/130124_just_russia_oppositioners_demand.shtml">Гудковым, Пономареву и Шеину предъявили ультиматум</a></div>
      <div class="ts-headline body-disabled teaser"><a href="/russian/international/2013/01/130124_norway_adagamov_investigation.shtml">Норвегия опровергла наличие дела против Адагамова</a></div>
   </div>
</div>

Однако регулярку написать всё равно получится. Хотя тут она должна захватывать как обычные текстовые ссылки, так и линки с картинками, и даже видео (сниппеты web-варианта сайта довольно разнообразны, и не статичны на уровне кода), тем не менее отпарсить всё это безобразие не составит особого труда.

Возможно такое регулярное выражение:

<div class=\"ts-[^>]*? teaser">.*<a[^>]*?href=\"(.+)\".*>

Правило парсинга, с учётом иного URL-а, станет таким:

[bbs.russia][serp][url]=http://www.bbc.co.uk/russian/russia/
[bbs.russia][snip][url]=http://www.bbc.co.uk/russian/russia/
[bbs.russia][snip][tmpl]=<div class=\"ts-[^>]*? teaser">.*<a[^>]*?href=\"(.+)\".*>