【问题标题】:Can't download html page source无法下载html页面源
【发布时间】:2012-08-17 09:37:05
【问题描述】:
using (var client = new WebClient())
        {
          client.DownloadFile(new Uri(@"http://www.bilyoner.com/iddaa/iddaa-liste"),path);

        }
    }

我正在尝试下载 html 源代码,但我收到“底层连接已关闭:连接已意外关闭。”例外。 我尝试了不同的 url ,效果很好。

【问题讨论】:

  • 也许服务器只允许标准浏览器访问它的内容。设置标准浏览器的用户代理可能会起作用。

标签: c# webclient web-scraping


【解决方案1】:

接受压缩流就可以了。

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.bilyoner.com/iddaa/iddaa-liste");
req.UserAgent = "MOZILLA/5.0 (WINDOWS NT 6.1; WOW64) APPLEWEBKIT/537.1 (KHTML, LIKE GECKO) CHROME/21.0.1180.75 SAFARI/537.1";
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add("Accept-Encoding", "gzip,deflate");

GZipStream zip = new GZipStream(req.GetResponse().GetResponseStream(),
                                                      CompressionMode.Decompress);
var reader = new StreamReader(zip);
var page = reader.ReadToEnd();

【讨论】:

  • 您是说服务器以压缩格式提供文件,而WebClient().DownloadFile() 不处理压缩格式?
【解决方案2】:

参考所使用的​​编程语言在这里会有所帮助。
你确定@in

new Uri(@"http://www.bilyoner.com/iddaa/iddaa-liste")

对吗?
对于开发期间的调试,创建对所有连接的引用总是有用的。即

myConnection =  new Uri(@"http://www.bilyoner.com/iddaa/iddaa-liste");
client.DownloadFile(myConnection, path);

【讨论】:

  • @ 只是使其成为文字字符串(您的字符串可以是多行的,您不再需要转义特殊字符)。但在这个例子中,这是不必要的。不过没有错:)
  • 感谢投反对票。虽然我怀疑使用我提供的代码会对 OP 有所帮助,因为它可能会在不同的行上失败 - 例如,如果按照“nunespascal”和“L.B”的建议,它可能是用户代理或压缩问题。
  • 我没有投反对票。当我发表评论时,你是 0。我同意使用额外的变量进行调试。在确认代码正确后,我确实倾向于删除它们。
  • 我知道这是个人喜好问题,我通常保留它们,因为(从我的角度来看)它们使代码更具可读性(和可调试性)并且它不会引入任何开销 - 这些对象是创建的无论如何,只是在代码中添加一个本地(适当范围的)引用不会改变任何东西。 (顺便说一句:感谢投反对票的人是投反对票的人,我不是指你)
  • 嗯,我明白你的意思了。这完全取决于您最终需要维护代码的程度。我倾向于创建库以供以后使用,然后我倾向于清理类似的东西,因为可读性并不优于轻微的性能提升。这是一个很小的性能提升,但如果你将它转换 100 次,它就会变得很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2021-04-28
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多