WebClient的替代品

时间:2009-12-20 08:25:55

标签: c# webclient

我刚看到我的计算机上正在运行一个网络抓取工具,它只需几分钟即可下载数千个元标记信息。

当我使用WebClient下载页面然后在本地解析它们时,为什么WebClient需要大约40秒来下载单个网页?有下载网页的替代方案吗?

感谢:)

5 个答案:

答案 0 :(得分:6)

需要考虑的一些事项:

  • 您一次下载多少页? Web爬虫往往以高度并行的方式工作。
  • 默认情况下,.NET框架会限制对单个站点的并行请求数。这通常是一件好事 - 您可能希望稍微提高限制,但理想情况下并行地定位不同的站点。 <connectionManagement>元素是您需要查看的元素。
  • 您是否使用WireShark查看网络级别的情况?如果该网站需要40秒才能为该页面提供服务,那么很难看出使用WebClient进行更改会有多大帮助。
  • 你能发布一些代码来准确显示你在做什么吗?

可能使用不同的API(可能只是WebRequest)会加快速度,但你真的需要先找到当前的瓶颈。

答案 1 :(得分:2)

几乎可以肯定,您的代码还有另一个问题,即您发布的信息无法轻易发现。

另一方面,在创建C#爬虫时,我们发现WebRequest / WebClient API在CPU使用率上非常沉重,并且最终不适合抓取。最后,我们使用Socket.XxxxAsync方法编写了自己的HTTP堆栈,这样可以将CPU负载减少大约20倍。请注意,追求这条道路的学习曲线非常陡峭。

答案 2 :(得分:1)

有几个原因导致你的表现不佳:

  • 不使用异步方法/线程
  • 糟糕的HTML解析算法
  • 使用WebClient下载的页面很慢

需要更多信息/源代码才能找到明确的答案。

答案 3 :(得分:1)

如果存在默认代理实例,则有一些与Webclient相关的帖子很慢。 MSDN Social有相同的详细信息。有几件事要做,以加快速度,包括使用Asyncronous连接,线程,如果你真的需要自己编写套接字代码的性能。市场上有一些图书馆声称可以提供超出默认框架库的优势,如果您愿意为它们支付额外费用,它们可能会有所帮助。

我有一些使用Webrequest(不是原生webclient)的程序,我看到近乎MB / s范围内的吞吐量,10-20MB范围内的资源来自世界各地。因此,本机框架肯定是可能的。

答案 4 :(得分:0)

如果您在抓取过程中遇到速度减慢,这些设置可能会有所帮助。

ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ServicePointManager.MaxServicePoints = int.MaxValue;
ServicePointManager.MaxServicePointIdleTime = 0;

此外,如果您将代码提升到某个级别,请不要忘记关闭HttpWebRequest。

HttpWebResponse.Close();
HttpWebResponse.GetResponseStream().Close();
HttpWebResponse.GetResponseStream().Dispose();

麦克