лучший способ извлечь информацию из сети Delphi - PullRequest
4 голосов
/ 13 января 2012

Я хочу знать, есть ли лучший способ извлечения информации с веб-страницы, чем анализ HTML для того, что я ищу. Например: извлечение рейтинга фильма из 'imdb.com'

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

Ответы [ 6 ]

7 голосов
/ 13 января 2012

Я нашел простые простые выражения очень интуитивно понятными и простыми при работе с хорошими веб-сайтами, а IMDB - хороший веб-сайт.

Например, рейтинг фильма на странице HTML фильма IMDB находится в <DIV> с class="star-box-giga-star". Это ОЧЕНЬ легко извлечь с помощью регулярного выражения. Следующее регулярное выражение извлечет рейтинг фильма из необработанного HTML-кода в группу захвата 1:

star-box-giga-star[^>]*>([^<]*)<

Это не красиво, но это делает работу. Регулярное выражение ищет идентификатор класса «star-box-giga-star», затем ищет >, который завершает DIV, а затем захватывает все до следующего <. Чтобы создать новое регулярное выражение, подобное этому, вы должны использовать веб-браузер, который позволяет проверять элементы (например, Crome или Opera). С помощью Chrome вы можете просто просмотреть веб-страницу, щелкнуть правой кнопкой мыши по элементу, который вы хотите захватить, и набрать Inspect element, а затем поискать легко различимые элементы, которые можно использовать для создания хорошего регулярного выражения. В этом случае класс "star-box-giga-star", очевидно, легко идентифицируем! У вас обычно не будет проблем с поиском таких идентифицируемых элементов на хороших веб-сайтах, потому что хорошие веб-сайты используют CSS, а для CSS требуется ID или class, чтобы иметь возможность правильно стилизовать элементы.

3 голосов
/ 13 января 2012

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

Следовательно, вы всегда должны пытаться использовать поддерживаемый API или RSS-канал или, по крайней мере, получать разрешение от веб-сайта для агрегирования их данных и обеспечения соблюдения их условий. Зачастую вам придется платить за этот тип доступа. Очистка веб-сайта без разрешения может привести к возникновению ответственности по нескольким юридическим аспектам (отказ в обслуживании и интеллектуальная собственность).

Вот заявление IMDB :

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

Чтобы ответить на ваш вопрос, лучше использовать метод, предоставленный веб-сайтом. Для некоммерческого использования, и если вы соблюдаете их условия , вы можете загрузить базу данных IMDB напрямую и использовать данные оттуда вместо очистки своего сайта. Просто обновляйте свою базу данных часто, и это лучшее решение, чем очистка сайта. Вы можете даже обернуть свой собственный веб-API вокруг него. Рейтинги доступны в виде отдельной таблицы.

3 голосов
/ 13 января 2012

Обработка RSS лента удобнее.

На момент публикации на сайте доступны только RSS-каналы:

  • родился в эту дату
  • умер в эту дату
  • Ежедневный опрос

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

Ресурсы по обработке RSS-каналов:

2 голосов
/ 13 января 2012

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

Но позвольте мне добавить два моих цента в конкретный подвопрос по извлечению квалификации imdb. IMDBAPI.COM предоставляет интерфейс запросов, возвращающий код json, который очень удобен для поиска такого типа.

Так что очень простая программа командной строки для получения рейтинга imdb была бы ...

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm:string;h:string):string;
 var r:integer;
 begin
  r:=pos('"'+Parm+'":',h);
  if r<>0 then 
    result:=copy(h,r+length(Parm)+4,pos(',',copy(h,r+length(Parm)+4,length(h)))-2)
  else
    result:='N/A';
 end;

var h:string;
begin
  h:=HttpGet('http://www.imdbapi.com/?t=' + UrlEncode(ParamStr(1)));
  writeln(ExtractJsonParm('Rating',h));
end.
2 голосов
/ 13 января 2012

Используйте HTML Tidy, чтобы преобразовать любой HTML в действительный XML, а затем использовать синтаксический анализатор XML, возможно, с использованием XPATH или разработки собственного кода (что я и делаю).

0 голосов
/ 13 января 2012

Если страница, которую вы сканируете, является допустимым XML, я использую SimpleXML для извлечения информации.Работает довольно хорошо.

Ресурс:

...