0

我正在使用 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
    }
4

2 回答 2

0

我在尝试使用HttpWebRequest爬取页面时遇到了同样的问题,并且该页面用于ajax加载我所追求的所有数据。为了让ajax调用发生,我切换到WebBrowser控件。

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

if(browser.ReadyState == WebBrowserReadyState.Complete)

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

于 2013-03-09T05:06:40.013 回答
0

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

查看 URL,查询参数看起来像是sid会话标识符或某种随机数。该页面可能会根据实际会话 ID 验证这一点,并且当它确定它们不同时,它会给您某种“糟糕……错误的视野”类型的响应。

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

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

确定您需要什么的最佳方法是从头到尾跟踪您的浏览器和为该页面提供服务的 Web 服务器之间的对话,并准确查看请求的页面、顺序以及来回传递的信息。您可以使用 WireShark 或 Fidler 来完成此操作——这两种工具都是免费的!

于 2013-03-09T03:04:37.043 回答