【问题标题】:Grabbing HTML from URL doesn't work - any tips?从 URL 抓取 HTML 不起作用 - 有什么提示吗?
【发布时间】:2012-02-03 20:56:32
【问题描述】:

我在 C# 中使用 webclient 和 webresponse 尝试了几种方法,它们都返回

<html><head><meta http-equiv=\"REFRESH\" content=\"0; URL=http://www.windowsphone.com/en-US/games?list=xbox\"><script type=\"text/javascript\">function OnBack(){}</script></head></html>"

而不是当你使用浏览器去http://www.windowsphone.com/en-US/games?list=xbox时实际呈现的页面

您将如何从该位置获取 HTML? http://www.windowsphone.com/en-US/games?list=xbox

谢谢!

/edit:添加示例:

试过了:

        string inputUrl = "http://www.windowsphone.com/en-US/games?list=xbox";
        string resultHTML = String.Empty;
        Uri inputUri = new Uri(inputUrl);
        WebRequest request = WebRequest.CreateDefault(inputUri);
        request.Method = "GET";

        WebResponse response;
        try
        {
            response = request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                resultHTML = reader.ReadToEnd();
            } 
        }
        catch { }

试过了:

        string inputUrl = "http://www.windowsphone.com/en-US/games?list=xbox";
        string resultHTML = String.Empty;
        WebClient webClient = new WebClient();

        try
        {
            resultHTML = webClient.DownloadString(inputUrl);
        }
        catch { }

试过了:

        string inputUrl = "http://www.windowsphone.com/en-US/games?list=xbox";
        string resultHTML = String.Empty;
        WebResponse objResponse;
        WebRequest objRequest = HttpWebRequest.Create(inputUrl);

        try
        {
            objResponse = objRequest.GetResponse();
            using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
            {
                resultHTML = sr.ReadToEnd();
                sr.Close();
            }
        }
        catch { }

【问题讨论】:

  • 您正在获取 HTML。 HTML 是 Web 服务器响应的标记代码。您是否正在寻找屏幕截图?您是否希望在不同的应用程序中嵌入网络浏览器?
  • 尼克,我想要 HTML。我使用提到的方法获得的 HTML 不返回我的 WebBrowser 返回的 HTML?
  • 尝试在请求中添加适当的 UserAgent,如果请求似乎不是来自合法的网络浏览器,有时这些站点不允许访问。
  • 嗨,他们使用元标记将用户重定向到页面。你得到的是来自服务器的正确响应。正如draw010所说,他们可能会尝试阻止屏幕抓取工具访问该网站。
  • 另外,如果您检索它的方式无法执行 Javascript,那么您仍然会不走运。看起来这可能是个问题。

标签: c#


【解决方案1】:

我检查了这个 URL,你需要解析 cookie。

当您第一次尝试访问该页面时,您会被重定向到 login.live.com 上的 https URL,然后被重定向回原始 URL。 https 页面为域 login.live.com 设置了一个名为 MSPRequ 的 cookie。如果您没有此 cookie,则无法访问该网站。

我尝试在浏览器中禁用 cookie,但它最终无限循环回 URL https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;checkda=1&amp;ct=1328303901&amp;rver=6.1.6195.0&amp;wp=MBI&amp;wreply=http:%2F%2Fwww.windowsphone.com%2Fen-US%2Fgames%3Flist%3Dxbox&amp;lc=1033&amp;id=268289。它已经持续了几分钟,而且似乎永远不会停止。

因此,您必须在设置时从 https 页面获取 cookie,并为您的后续请求保留该 cookie。

【讨论】:

  • 谢谢德鲁,这看起来是完全正确的。虽然这超出了我的范围:(
  • 我会尝试使用浏览器对象来抓取它。我不想这样做,因为我不需要所有花哨的图形,只需要纯 HTML,但它会完成工作..
  • 我发现了这个answer,它展示了如何扩展 webclient 以便它可以为您保留 cookie。这可能会有所帮助。
  • 再次感谢。尝试使用该类,但结果相同。
【解决方案2】:

这可能是因为您请求 HTML 的服务器会根据用户代理字符串返回不同的 HTML。你可以试试这样的

webClient.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

该特定标头可能不起作用,但您可以尝试其他模仿标准浏览器的标头。

【讨论】:

  • 谢谢尼克,我会尝试将标题添加到网络客户端。如果这个不起作用,我会尝试其他一些东西以及使用标题信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2021-12-19
  • 2018-02-12
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多