C#HttpWebRequestを使用して、Webページのデータを取得しています。問題は、ページがロードされた後にjavascript/ajaxを使用して一部のデータが更新され、応答文字列にデータが含まれないことです。ページ内のすべてのスクリプトの実行が完了するまでwebrequestを待機させる方法はありますか?
ありがとう
アミット
私があなたの質問を正しく解釈した場合、あなたの問題に対する簡単な解決策はありません。
サーバーからHTMLをスクレイピングしていて、C#コードは実際のWebブラウザーではないため、クライアントスクリプトを実行しません。
このようにして、フェッチしたHTMLに含まれていない情報にアクセスすることはできません。
編集:これらのAJAX元のWebサイトからの呼び出しがどれほど複雑かはわかりませんが、FirebugまたはFiddlerを使用してIEこれらを呼び出すためにリクエストがどのように行われるかを確認するAJAX C#アプリケーションでも呼び出す。したがって、必要な情報を追加できます。ただし、これは理論上のものにすぎません。解決。
単なるアイデアですが、.netにブラウザにあるかのようにWebページをロードさせる方法があります。System.Windows.Formsを使用します。
webページをWebBrowserコントロールにロードできます
WebBrowser wb = new WebBrowser();
wb.ScrollBarsEnabled = false;
wb.ScriptErrorsSuppressed = true;
wb.Navigate(url);
while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
wb.Document.DomDocument.ToString()
これにより、おそらくpre ajax DOMが提供されますが、最初にajaxを実行させる方法があるかもしれません。
HttpWebRequestを使用してページをダウンロードし、プログラムでソースコードから関連するajax情報を検索してから、新しいHttpWebRequestを使用してそのデータをプルダウンします。
WebブラウザでWebページを開くと、JavaScriptを実行し、ページで使用される追加のリソース(画像、スクリプトなど)をダウンロードするのはブラウザです。 HttpWebRequest自体はこれを実行せず、要求したページのhtmlのみをダウンロードします。 javascript/ajaxコードを単独で実行することはありません。
HttpWebRequestは、Webブラウザーをエミュレートするのではなく、指定したリソースをダウンロードするだけです。これは、JavaScriptファイルを実行したりダウンロードしたりしないことを意味します。
JavaScriptを介してプルされるデータのURLを取得するには、FireBugのようなものを使用し、それにHttpWebRequestを指定する必要があります。
HttpWebRequest
を使用してページをダウンロードします。ソースコードで関連するAJAX情報を検索し、新しいHttpWebRequest
を使用してそのデータをプルダウンします。
PhantomJs を使用できます。私はこれを持っていました 問題 、しかし私の問題の解決策が見つかりませんでした。私の意見では、最善の解決策は This です。
私の解決策は次のようになります:
var page = require('webpage').create();
page.open("https://sample.com", function(){
page.evaluate(function(){
var i = 0,
oJson = jsonData,
sKey;
localStorage.clear();
for (; sKey = Object.keys(oJson)[i]; i++) {
localStorage.setItem(sKey,oJson[sKey])
}
});
page.open("https://sample.com", function(){
setTimeout(function(){
page.render("screenshoot.png")
// Where you want to save it
console.log(page.content); //page source
// You can access its content using jQuery
var fbcomments = page.evaluate(function(){
return $("body").contents().find(".content")
})
phantom.exit();
},10000)
});
});