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

пятница, 31 июля 2009 г.

Особенности составления регулярных выражений для парсинга страниц некоторых сайтов

Привет всем!

Во-первых, поздравляю всех сисадминов с профессиональным праздником! ;)

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

На что еще следует обратить внимание при парсинге web-страниц. Регулярное выражение, составленное для содержимого страницы, полученного одним способом (например, через DownloadFile), может не подойти для поиска в содержимом страницы, полученном другим способом (например, через idHTTP.Get). Так что при составлении регулярного выражения используйте в качестве основы html-код, полученный тем же способом, каким вы планируете получать его в своем приложении. Или составляйте универсальное регулярное выражение. Это касается в большей степени разработки каких-нибудь многофункциональных универсальных приложений, в которых с ссылками приходится работать по несколько раз, хранить их в базе и т.д..

Приведу в качестве примера свое приложение для парсинга и автоматизации постинга сообщений на форумы. При скачивании страницы через idHTTP.Get в ссылках будет дописываться сессия (соответственно, с учетом этого все ссылки приходилось обрабатыввать, чтобы в базу сохранять "чистые" ссылки, удаляя "s=..."). Если бы мне потом взбрело в голову пытаться достать какие-нибудь данные из кода, скачанного с помощью DownloadFile, то ни в одной ссылке сессии не было бы и составленная для первого случая регулярка не подошла бы. А вот такая подошла бы в обоих случаях:

<a href="(showthread.php\?(?:|s=.*?&amp;)t=[0-9] )" id="thread_title_[0-9] ".*?>(.*?)</a>


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

/---

Чтобы научиться писать программы на персональном компьютере, нужно сначала этот самый персональный компьютер купить.

---/

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



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

  1. Привет! Нашёл Ваш блог, при поиске решения следующей проблемы:

    Произвожу парсинг ссылок на страницах сайтов. Многие сайты используют сессии, при просмотре страницы через браузер с подержкой cookies сессии не отображаются в адресах страниц (внутренних). К сожалению не научился, как это можно реализовать в случае IdHttp.
    Можно, конечно, поступать описанным Вами методом - убирать id сессии из адресов регуляркой, однако это не универсальное решение. Поскольку на различных сайтах используются различные SessionName ("sid","s"..."s_id")- то использовать метод, описанный в статье нерационально, в случае, если заранее не известен SessionName для каждого сайта.

    Начал копать в сторону подключения Cookies, но пока толкового вышло немного :)

    Как бы Вы решили данную проблему?

    ОтветитьУдалить
  2. Забыл ещё момент :)

    Грубое решение такое - подключили cookies и производим 2 запроса к странице: в первом запросе SessionID записывается в cookies, а для второго запроса - sessionID забирается из cookies и уже не подставляется в ссылки в тексте страницы, который получаем IdHttp.Get

    Но делать 2 запроса к каждой странице - это вообще бредово, особенно если нужно распарсить пару сотен страниц.

    Заранее благодарю, Семён.

    ОтветитьУдалить
  3. Семён, добрый день)
    Я не занимаюсь парсингом подряд всех сайтов без разбора, поэтому мне не составляет труда посмотреть для каждого сайта название параметра для сессии. Универсального решения этой проблемы не искала, так как не требовалось)

    ОтветитьУдалить
  4. Понятно, спасибо.

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

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

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

Поделиться