検索対象のHTMLを解析するよりも、Webページから情報を抽出するためのより良い方法があるかどうかを知りたいです。すなわち:「imdb.com」から映画の評価を抽出する
現在、ページを取得するためにIndyHttpコンポーネントを使用しており、テキストを解析するためにstrUtilsを使用していますが、コンテンツは制限されています。
検索対象のHTMLを解析するよりも、Webページから情報を抽出するためのより良い方法があるかどうかを知りたいです。すなわち:「imdb.com」から映画の評価を抽出する
現在、ページを取得するためにIndyHttpコンポーネントを使用しており、テキストを解析するためにstrUtilsを使用していますが、コンテンツは制限されています。
単純な正規表現は、優れたWebサイトを扱うときに非常に直感的で単純であることがわかりました。また、IMDBは優れたWebサイトです。
たとえば、IMDBの映画HTMLページの映画の評価は<DIV>
withにありclass="star-box-giga-star"
ます。これは、正規表現を使用して非常に簡単に抽出できます。次の正規表現は、生のHTMLからキャプチャグループ1に映画の評価を抽出します。
star-box-giga-star[^>]*>([^<]*)<
それはきれいではありませんが、それは仕事をします。正規表現は「star-box-giga-star」クラスIDを探し、次に、>
を終了するを探しDIV
、次のまですべてをキャプチャします<
。このような新しい正規表現を作成するには、要素(CromeやOperaなど)を検査できるWebブラウザを使用する必要があります。Chromeを使用すると、Webページを確認し、キャプチャして実行する要素を右クリックしてInspect element
、適切な正規表現を作成するために使用できる簡単に識別できる要素を探し回ることができます。この場合、"star-box-giga-star"
クラスは明らかに簡単に識別できます。優れたWebサイトはCSSを使用し、CSSは要素を適切にスタイル設定できるようにするためにID
「s」または「es」を必要とするため、通常、優れたWebサイトでそのような識別可能な要素を見つけるのに問題はありません。class
Webサイトをスクレイピングする場合、情報の可用性に依存することはできません。IMDBは、スクレイピングを検出してブロックしようとする場合があります。または、フォーマットを頻繁に変更して、より困難にする場合があります。
したがって、常にサポートされているAPIまたはRSSフィードを使用するか、少なくともWebサイトからデータを集約する許可を取得し、それらの条件を遵守していることを確認する必要があります。多くの場合、このタイプのアクセスには料金を支払う必要があります。許可なくウェブサイトをスクレイピングすると、いくつかの法的な面(サービス拒否と知的財産)で責任を問われる可能性があります。
IMDBの声明は次のとおりです。
当社のウェブサイトでは、データマイニング、ロボット、スクリーンスクレイピング、または同様のオンラインデータ収集および抽出ツールを使用することはできません。
あなたの質問に答えるために、より良い方法はウェブサイトによって提供される方法を使うことです。非営利目的で、それらの条件を順守する場合は、IMDBデータベースを直接ダウンロードして、サイトをスクレイピングする代わりにそこからデータを使用できます。データベースを頻繁に更新するだけで、サイトをスクレイピングするよりも優れたソリューションです。独自のWebAPIをラップすることもできます。評価はスタンドアロンテーブルとして利用できます。
RSS フィードの処理がより快適になりました。
投稿時点で、サイトで利用できる RSS フィードは次のとおりです。
ただし、ヘルプデスクに連絡して、新しいものを追加するように電話をかけることができます。
RSS フィード処理に関するリソース:
投稿されたすべての回答は、一般的な質問をよくカバーしています。私は通常、Cosmin によって詳述されたものと同様の戦略に従います。私はほとんどの Web 抽出のニーズに wininet と regex を使用しています。
ただし、imdb 資格の抽出に関する特定のサブ質問に 2 セント追加させてください。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.
HTML Tidy を使用して HTML を有効な XML に変換し、XML パーサーを使用します。おそらく XPATH を使用するか、独自のコードを開発します (これは私が行っていることです)。