Web Delphiから情報を抽出する最良の方法
-
27-10-2019 - |
質問
Webページから情報を抽出するより良い方法があるかどうかを知りたいと思います。 IE:「IMDB.com」から映画の評価を抽出する
現在、IndyHTTPコンポーネントを使用してページを取得しており、テキストを解析するためにStrutilsを使用していますが、コンテンツは限られています。
解決
優れたWebサイトを扱う際には、単純なシンプルなRegex-ESが非常に直感的でシンプルであることがわかりました。IMDBは優れたWebサイトです。
たとえば、IMDBの映画HTMLページの映画評価は <DIV>
と class="star-box-giga-star"
. 。これは、正規表現を使用して非常に簡単に抽出できます。次の正規表現では、RAW HTMLから映画の評価を抽出します。
star-box-giga-star[^>]*>([^<]*)<
きれいではありませんが、仕事をします。 Regexは「Star-Box-Giga-Star」クラスIDを探し、次に >
それは終了します DIV
, 、そして、次のまですべてをキャプチャします <
. 。このような新しいREGEXを作成するには、要素を検査できるようにするWebブラウザ(クロームやオペラなど)を使用する必要があります。 Chromeを使用すると、単にWebページを見ることができ、キャプチャして実行する要素を右クリックして行うことができます Inspect element
, 、次に、優れた正規表現を作成するために使用できる簡単に識別できる要素を探してください。この場合 "star-box-giga-star"
クラスは明らかに簡単に識別できます!優れたWebサイトではCSSとCSSが必要なため、良いWebサイトでそのような識別可能な要素を見つけるのに問題はありません ID
'sまたは class
'要素を適切にスタイリングできるようにします。
他のヒント
処理 RSSフィード もっと快適です。
投稿時点で、サイトで利用可能なRSSフィードのみは次のとおりです。
- この日に生まれました
- この日に亡くなりました
- 毎日の投票
それでも、あなたは、と連絡を取ることによって、新しいものを追加するための呼びかけをするかもしれません ヘルプデスク.
RSS飼料処理に関するリソース:
- 関連する 役職 ここで。
- スーパーオブジェクト
- ウィキペディア.
Webサイトを削るときは、情報の可用性に頼ることはできません。 IMDBはあなたのスクレイピングを検出してあなたをブロックしようとするかもしれません、またはそれらが頻繁に形式を変更してそれをより困難にすることがあります。
したがって、常にサポートされているAPIまたはRSSフィードを使用しようとするか、少なくともWebサイトからデータを集約し、条件に従っていることを確認する必要があります。多くの場合、このタイプのアクセスに対して支払う必要があります。許可なしにウェブサイトを削ると、いくつかの法的面(サービスの拒否と知的財産)で責任を負う可能性があります。
これがIMDBです 声明:
当社のウェブサイトでは、データマイニング、ロボット、スクリーンスクレイピング、または同様のオンラインデータ収集および抽出ツールを使用することはできません。
あなたの質問に答えるために、より良い方法は、ウェブサイトが提供する方法を使用することです。非営利目的のために、そしてあなたが彼らを守るなら 条項, 、 あなたはできる IMDBデータベースを直接ダウンロードしてください サイトを削る代わりに、そこからのデータを使用します。データベースを頻繁に更新するだけで、サイトを削るよりも優れたソリューションです。あなた自身のWeb APIをその周りにラップすることもできます。評価はスタンドアロンテーブルとして利用できます。
HTML Tidyを使用して、htmlを有効なXMLに変換し、XMLパーサーを使用してXPathを使用するか、独自のコードを開発します(これが私がしていることです)。
投稿されたすべての回答は、あなたの一般的な質問をよくカバーしています。私は通常、Cosminが詳述した戦略と同様の戦略に従います。私は、WininetとRegexを使用して、ほとんどのWeb抽出ニーズのニーズに対応しています。
しかし、IMDBの資格を抽出することで、特定のサブクエストで2セントを追加しましょう。 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.