1

我有大约一百万个指向公共 Web 服务器上的 HTML 页面的 URL,我想将它们保存到我的磁盘中。每一个的大小都差不多,大约 30 KB。我的 url 列表被平均分配在磁盘上的 20 个文件夹中,因此为简单起见,我为每个文件夹创建一个任务,并且在每个任务中我依次下载一个 URL 一个接一个。所以这随时给我大约 20 个并行请求。我使用的是一个相对糟糕的 DSL,5mbps 连接。

这代表了几 GB 的数据,因此我预计该过程需要几个小时,但我想知道是否可以使该方法更有效。我是否有可能充分利用我的联系?我该如何衡量呢?20 次并行下载是一个好数字还是我应该向上或向下拨号?

语言是 F#,我对每个 url 使用 WebClient.DownloadFile,每个任务一个 WebClient。

====================================

编辑:产生巨大差异的一件事是在请求中添加了某个标头:

let webClient = new WebClient()
webClient.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate")

这将下载大小从大约 32k 减少到 9k,从而极大地提高了速度并节省了磁盘空间。感谢 TerryE 提到它!

4

2 回答 2

2

如果您使用的是下载器 API,请确保它正在发出

接受编码:gzip,放气

请求标头,以便您正在抓取的网站知道返回压缩的 HTML。(如果客户端使用此请求标头让服务器知道它将接受压缩数据流,则大多数 Web 服务器将被配置为压缩 HTML 数据流。)

这将使传输的数据减少大约 4 倍。(例如,此页面是 40K 原始 HTML,但只有 10K 传输到我的浏览器(HTML 已压缩)。

于 2012-07-26T13:45:40.317 回答
1

我只会并行化,直到达到连接速度的极限。如果每个请求都使您的 DSL 连接饱和,那么并行运行它们不会为您带来任何好处,并且可能会阻止您。

首先使用http://wowrack.speedtest.net之类的工具衡量您的容量。然后并行化,直到您的吞吐量达到此值。有多种方法可以监控您当前的网络使用情况,最简单的方法是转到 Windows 任务管理器并点击网络选项卡。

还要确保您保持与服务器的连接打开,而不是为每个请求重新打开它。这将导致不必要的开销。

于 2012-07-25T20:55:10.450 回答