2013-07-24 10 views
5

この(imo)厄介な「無限スクロール」スタイルを使用するサイトはたくさんあります。 これは、tumblr、twitter、9gagなどのサイトです。C#で無限スクロールをシミュレートしてページのフルHTMLを取得する

私は最近、HtmlAgilityPackを使用してこれらのサイトからいくつかの写真をスクラップしました。

HtmlWeb web = new HtmlWeb(); 
HtmlDocument doc = web.Load(url); 
var primary = doc.DocumentNode.SelectNodes("//img[@class='badge-item-img']"); 
var picstring = primary.Select(r => r.GetAttributeValue("src", null)).FirstOrDefault(); 

これは正常に動作しますが、私は特定のサイトからHTMLをロードしようとしたとき、私は私だけ戻ってコンテンツの少量を得たことに気づいた(最初の10「ポスト」を言うことができますか。このような "pictures"など)。 これは、C#のページの「スクロールダウン」をシミュレートすることが可能かどうか疑問に思いました。

これは、私が単にtumblrのようなサイトに行くときに、プログラムでHTMLを読み込んだときだけではなく、Firebugや「ソースを表示」をチェックして、しかし、それの多くは隠されている/ javascriptで挿入されているようだ。実際に画面に表示されるコンテンツのみがHTMLソースに存在します。

私の質問は:無限にページをスクロールして、そのHTMLをC#(できれば)で読み込むことは可能ですか?

(私はtumblrのやTwitterのためのAPIを使用することができることを知っているが、私はちょうどHtmlAgilityPackと一緒に何かをハッキングいくつかの楽しみを持ってしようとしている)

答えて

4

確実にそのようなすべてのウェブサイトのためにこれを行う方法はありませんワンショットでは、Webブラウザ(通常はヘッドレス環境では動作しません)を埋め込むのには不足しています。

代わりに、ユーザーがスクロールダウンしたときにコンテンツを取得するために使用されるAJAXクエリを確認するために、サイトのJavaScriptを調べることを検討する必要があります。

また、ブラウザにWebデバッガ(Chromeに付属)を使用することもできます。これらのデバッガには通常、ページによって実行されるAJAXリクエストを検査するために使用できる「ネットワーク」枠があります。これらの要求を見ると、それらの要求をシミュレートするC#コードを書くのに十分な情報が得られるはずです。

これらのリクエストからの応答は、特定のAPIが提供するコンテンツの種類(JSONまたはXMLですが、HTMLはほとんどありません)として解析する必要があります。 (AJAX APIは、はるかに使いやすいはずのデータオブジェクトを提供するのに対し、ディスプレイ指向のHTMLを解析する必要がなくなるので、これはあなたにとってはもっと良いかもしれません)。

1

これらのサイトは非同期HTTP要求を使用して、後続のページの内容をロードします。 HTML敏捷性パックにはJavaScriptインタプリタがありません(天に感謝します)、あなたはそれらの要求を自分で作成する必要があります。たいていの場合、ほとんどのサイトでhtmlフラグメントが返されるのではなく、JSONが返されます。そのためには、HTMLアジリティパックではなく、JSONパーサーを使用する必要があります。

関連する問題