Вопрос

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

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

Это было полезно?

Решение

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

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

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

Это не красиво, но это делает работу. Пороча поиска идентификатора класса «Star-Box-Giga-Star», затем ищет > это завершает DIV, а затем захватывает все до следующего <. Анкет Чтобы создать новую репутацию, подобную этой, вы должны использовать веб -браузер, который позволяет осматривать элементы (например, Crame или Opera). С помощью Chrome вы можете просто посмотреть на веб-страницу, щелкните правой кнопкой мыши на элемент, который вы хотите захватить и сделать Inspect element, затем посмотрите на легко идентифицируемые элементы, которые можно использовать для создания хорошего регуляции. В этом случае "star-box-giga-star" Класс, очевидно, легко идентифицируется! Обычно у вас не будет проблем с поиском таких идентифицируемых элементов на хороших веб -сайтах, потому что хорошие веб -сайты используют CSS и CSS требуют IDs или class'ES, чтобы иметь возможность правильно стилизовать элементы.

Другие советы

Обработка Новостная лента удобнее.

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

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

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

Ресурсы при обработке кормов RSS:

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

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

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

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

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

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

Все ответы опубликовали обложку, ваш общий вопрос. Я обычно следую стратегии, подобной той, что подробно описана Космином. Я использую 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.

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

Ресурс:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top