【问题标题】:WebRequest is Retrieving different HTML than the BrowserWebRequest 正在检索与浏览器不同的 HTML
【发布时间】:2012-07-10 01:36:42
【问题描述】:

问题

我的 c# Web 请求检索到的 html 页面与我使用浏览器获得的不同。

详情

我正在尝试获取此 URL 引用的页面的 HTML:

https://sistemas.usp.br/jupiterweb/listarGradeCurricular?codcg=12&codcur=12012&codhab=1&tipo=N

我用于 WebRequest 的代码是这个:

public string HttpsGet (string url)
{
    string response = string.Empty;
    if (!string.IsNullOrEmpty(url))
    {
        HttpWebRequest WReq = (HttpWebRequest)WebRequest.Create("https://uspdigital.usp.br/jupiterweb/listarGradeCurricular?codcg=9&codcur=9012&codhab=100&tipo=N");
        WReq.Credentials = CredentialCache.DefaultCredentials;

        ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

        try
        {
            WReq.Proxy = new WebProxy();
            WReq.Method = "GET";
            WReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1";
            WReq.ServicePoint.ConnectionLimit = 800;
            WReq.Timeout = 80000;
            WReq.ContentType = "application/x-www-form-urlencoded";
            WReq.Referer = "";
            WReq.AllowAutoRedirect = true;

            HttpWebResponse resp = (HttpWebResponse)WReq.GetResponse();
            using (resp)
            {
                response = (new StreamReader(resp.GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))).ReadToEnd();
            }
        }
        catch (Exception exception)
        {
            Exception ex = exception;
        }
        return response;
    }
    else
    {
        throw new Exception("URL is empty or null");
    }
}

我是如何发现它们不同的

我将从代码中检索到的 html 和浏览器中的 html(在 chrome 上查看源代码)粘贴到 notepad++ 上。

在那之后,我设法“计数”(ctrl+f -> 计数)这个字符串“#CCCCCC”,它代表 某些表格行的背景颜色。

webrequest 的计数为 17,而浏览器的计数为 14。

此外,每个页面的“课程”都不同:网络请求课程是“Faculdade de Ciências Farmacêuticas”,而浏览器上的课程是“Faculdade de Economia, Administração e Contabilidade”(这些名称是葡萄牙语)。

TL:DR

不知道为什么,点击这个链接:https://uspdigital.usp.br/jupiterweb/listarGradeCurricular?codcg=12&codcur=12012&codhab=1&tipo=N 在 webrequest c# 中给了我一个不同的页面,与我复制并粘贴到浏览器时的结果相比。

更新

  1. 我尝试比较两个请求中的用户代理,它们匹配。

  2. 我发现通过 C# 的 Web 请求总是给我相同的页面,即“Faculdade de Ciências Farmacêuticas”课程的页面

我猜这与 HTTPS 的事情有关。

先谢谢了,很抱歉发了这么长的帖子

【问题讨论】:

  • 您指定的用户代理 - 它与您用于在浏览器中查看的用户代理相同吗?我猜 uspdigital.usp.br 的服务器会根据浏览器返回不同的视图?

标签: c# html webrequest


【解决方案1】:

找出您浏览器的用户代理字符串,然后将您的 WebRequest 上的用户代理字符串设置为匹配。许多网站提供基于 UA 的变体内容/标记/样式/脚本。

更新

如果您使用的是 HttpWebRequest,您可以通过 UserAgent 属性设置 UA。

【讨论】:

  • 我可以使用 Fiddler 调试请求并使用相同的用户代理吗?
  • 您还应该检查您网站上的 cookie。它们也会影响生成的内容。
  • 不确定 Fiddler 是什么,但如果它可靠地提供了 UA,那就去做吧。您还可以使用一点 javascript 检测它(并输出它)。
  • 好点,德米特里。我假设未经身份验证,并且没有考虑 3rd 方 cookie 等。
  • 我刚刚检查了 UA,并将其粘贴到我的 webrequest 上,这与我使用 btw 时的相同。关于 cookie,我存储了以前请求的所有 cookie,但它仍然无法正常工作。检索到的 COURSE 在浏览器和 WebRequest C# 上是不同的。不仅页面结构不同,内容也不同。
【解决方案2】:

将主机设置为uspdigital.usp.br 并将网址上的“sistemas”一词替换为“uspdigital”似乎对我有用。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多