лучший способ извлечь информацию из сети delphi

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

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


person Gab    schedule 13.01.2012    source источник
comment
Веб-страница не обязательно является действительным документом XHTML, а Javascript может изменить DOM, поэтому я думаю, что вам следует исследовать DOM из встроенного веб-браузера, такого как TWebBrowser или Chromium Embedded.   -  person Henri Gourvest    schedule 13.01.2012
comment
Полагаться на DOM и TWebBrowser следует в крайнем случае, так как это будет медленно и подвержено ошибкам. Если данные для очистки поступают из JavaScript, их можно очистить непосредственно из JavaScript. Если он заполнен какой-либо формой Ajax, можно составить и получить URL-адрес Ajax напрямую. Что бы ни делал браузер, его можно эмулировать вручную.   -  person Cosmin Prund    schedule 13.01.2012


Ответы (6)


Я обнаружил, что простые простые регулярные выражения очень интуитивно понятны и просты при работе с хорошими веб-сайтами, а 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, чтобы иметь возможность правильно стилизовать элементы.

person Cosmin Prund    schedule 13.01.2012

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

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

  • Родился в этот день
  • Умер в этот день
  • Ежедневный опрос

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

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

person menjaraz    schedule 13.01.2012

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

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

Вот утверждение от IMDB:

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

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

person Marcus Adams    schedule 13.01.2012
comment
+1 за указание на опасность царапания экрана. Понижение необоснованно, кстати. ИМО, этот аспект обсуждения жизненно важен для любого нетривиального использования сторонних данных. - person Chris Thornton; 13.01.2012

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

person Misha    schedule 13.01.2012

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

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

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

program imdbrating;
{$apptype console}
uses htmlutils;

function ExtractJsonParm(parm,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.
person PA.    schedule 13.01.2012
comment
+1 за ответ, который сломается гораздо реже, чем очистка экрана. - person Chris Thornton; 13.01.2012

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

Ресурс:

person gorootde    schedule 13.01.2012
comment
Да, но это не тот SimpleXML, который известен из PHP. Посмотрите здесь: блог. spreendigital.de/2011/11/10/ - person gorootde; 13.01.2012
comment
Я также продвигаю SimpleXML: SimpleXML очень ограничен, но в некоторых случаях очень удобен. Несмотря на то, что ОП ищет альтернативу разбору, ваш ответ ценен. Если вы предоставите пример кода, использующего его, я поддержу его. Спасибо. - person menjaraz; 13.01.2012