下载网站的HTML会返回完全不同的内容

时间:2013-03-09 02:59:42

标签: c#

我正在使用C#下载网页的HTML,但是当我检查网页的实际代码和我下载的代码时,它们完全不同。这是代码:

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
    }

2 个答案:

答案 0 :(得分:0)

差异的原因很可能是当您使用浏览器请求同一页面时,它是您使用WebRequest请求同一页面时未建立的会话的一部分。

查看URL看起来查询参数sid是会话标识符或某种类型的随机数。该页面可能会根据实际会话ID进行验证,并且当它确定它们不同时,它会为您提供某种“Ooopss ...错误的视觉”类型的响应。

为了模仿浏览器的请求,您必须确保生成可能需要包含以下一项或多项的正确请求:

  • cookies(先前由网络服务器发送给您)
  • 有效/适当的用户代理
  • 一些特定的查询参数(同样取决于页面的预期)
  • 可能是引荐来源网址
  • 身份验证凭据

确定所需内容的最佳方法是在浏览器和从头到尾服务该网页的网络服务器之间按照对话查看确切要求的页面,订单和信息是来回传递的。你可以使用WireShark或Fidler完成这个 - 两个免费工具!

答案 1 :(得分:0)

我在尝试使用HttpWebRequest抓取页面时遇到了同样的问题,并且页面使用ajax来加载我之后的所有数据。为了实现ajax次调用,我切换到WebBrowser控件。

This answer提供了一个如何在WinForms应用程序之外使用控件的示例。在解析页面之前,您需要连接到浏览器的DocumentCompleted事件。请注意,在准备好解析页面之前,此事件可能会多次触发。你可能想要添加这样的东西

if(browser.ReadyState == WebBrowserReadyState.Complete)

到您的事件处理程序,以了解页面何时完成加载。