0

C# を使用して Web ページの HTML をダウンロードしているのですが、Web ページの実際のコードとダウンロードしたコードを確認すると、まったく異なります。コードは次のとおりです。

public static string getSourceCode(string url) {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "GET";
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader sr = new StreamReader(resp.GetResponseStream());
        string soruceCode = sr.ReadToEnd();
        sr.Close();
        resp.Close();
        return soruceCode;

        using (StreamReader sRead = new StreamReader(resp.GetResponseStream(), Encoding.UTF8)) {

            // veriyi döndür
            return sRead.ReadToEnd();
        }

private void button1_Click(object sender, EventArgs e) {

        string url = "http://www.booking.com/hotel/tr/nena.en-gb.html?label=gog235jc-hotel-en-tr-mina-nobrand-tr-com-T002-1;sid=fcc1c6c78f188a42870dcbe1cabf2fb4;dcid=1;origin=disamb;srhash=3938286438;srpos=5";
        string sourceCode = Finder.getSourceCode(url);
        StreamWriter sw = new StreamWriter("HotelPrice.txt");//Here the code are completly different with web page code.
        sw.Write(sourceCode);
        sw.Close();

        #region //Get Score Value

        int StartIndex = sourceCode.IndexOf("<strong id=\"rsc_total\">") + 23;
        sourceCode = sourceCode.Substring(StartIndex, 3);

        #endregion
    }
4

2 に答える 2

0

HttpWebRequestを使用してページをクロールしようとしたときに同じ問題に遭遇し、そのページはajax目的のすべてのデータをロードしていました。呼び出しを発生させるために、 WebBrowserコントロールajaxに切り替えました。

この回答は、WinForms アプリの外部でコントロールを使用する方法の例を提供します。ページを解析する前に、ブラウザーのDocumentCompletedイベントに接続する必要があります。ページを解析する準備が整う前に、このイベントが複数回発生する可能性があることに注意してください。このようなものを追加したい場合があります

if(browser.ReadyState == WebBrowserReadyState.Complete)

イベント ハンドラーに渡して、ページの読み込みがいつ完了したかを確認します。

于 2013-03-09T05:06:40.013 に答える
0

ほとんどの場合、違いの原因は、ブラウザーを使用して同じページを要求するときに、WebRequest を使用して同じページを要求するときに確立されていないセッションの一部であることです。

URL を見ると、そのクエリ パラメータsidはセッション識別子または何らかのナンスのようです。ページはおそらく、実際のセッション ID に対してそれを検証し、それらが異なると判断すると、ある種の「おっと..間違ったシーション」のような応答を返します。

ブラウザのリクエストを模倣するには、次の 1 つ以上を含める必要がある場合がある適切なリクエストを生成する必要があります。

  • Cookie(以前にウェブサーバーから送信されたもの)
  • 有効な/適切なユーザー エージェント
  • いくつかの特定のクエリ パラメータ (これも、ページが何を期待しているかによって異なります)
  • リファラー URL の可能性
  • 認証資格情報

何が必要かを判断する最善の方法は、ブラウザーとそのページを提供する Web サーバーとの間の会話を最初から最後まで追跡し、どのページが要求され、どの順序で、どの情報がやり取りされるかを正確に確認することです。これは、WireShark または Fidler (どちらも無料のツール) を使用して実現できます。

于 2013-03-09T03:04:37.043 に答える