【问题标题】:Use Webclient to get page resource in C#C#中使用Webclient获取页面资源
【发布时间】:2020-01-06 05:16:46
【问题描述】:

我使用以下代码获取页面源,但它不返回属性数据:

string url = "http://www.tsetmc.com/Loader.aspx?ParTree=15131F";
            WebClient client = new WebClient();
            client.Headers["Accept-Encoding"] = "gzip";
            string pageSource = client.DownloadString(url);

网站的Content-Encoding是gzip

【问题讨论】:

  • 该页面是由脚本动态生成的。您无法通过下载流获得其构建的结果,您需要一个 WebBrowser 来解释和执行脚本。因此,使用无头浏览器导航到页面并获取呈现的页面。
  • @Jimi 我是用 CefSharp 做的,但我需要在类库中做(需要定期编写 windows 服务)而不是图形形式(如 windows 窗体),因此我试图用 WebClient 来做
  • 您不需要图形界面。这就是为什么要编写headless browser。您需要一个 WebBrowser 类,而不是 UI 控件。尝试使用标准的 WebBrowser 类并处理 DocumentCompleted 事件。当心 IFrame。阅读此处的注释How to get an HtmlElement value inside Frames/IFrames?
  • 这也可能派上用场:WebBrowser Control in a new thread(需要小心处理)。另一个实现也是:Close Application after WebBrowser print(一个更具体的用例,它还显示了本机 ActiveX 的使用)
  • 如果您还没有将这些修改应用于 WB 兼容模式:How can I get the WebBrowser control to show modern contents?

标签: c# .net winforms webclient


【解决方案1】:

通过设置client.Headers["Accept-Encoding"] = "gzip";,您要求服务器发送压缩响应。但是,您没有解压缩它。这导致了不正确的响应。

根据https://stackoverflow.com/a/4914874/23633,您可以通过修改它创建的HttpWebRequest 来让WebClient 自动解压缩响应:

class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = (HttpWebRequest) base.GetWebRequest(address);
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        return request;
    }
}

string url = "http://www.tsetmc.com/Loader.aspx?ParTree=15131F";
WebClient client = new MyWebClient();
// don't set the Accept-Encoding header here; it will be done automatically
string pageSource = client.DownloadString(url);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多