我刚看到我的计算机上正在运行一个网络抓取工具,它只需几分钟即可下载数千个元标记信息。
当我使用WebClient下载页面然后在本地解析它们时,为什么WebClient需要大约40秒来下载单个网页?有下载网页的替代方案吗?
感谢:)
答案 0 :(得分:6)
需要考虑的一些事项:
<connectionManagement>
元素是您需要查看的元素。 可能使用不同的API(可能只是WebRequest
)会加快速度,但你真的需要先找到当前的瓶颈。
答案 1 :(得分:2)
几乎可以肯定,您的代码还有另一个问题,即您发布的信息无法轻易发现。
另一方面,在创建C#爬虫时,我们发现WebRequest / WebClient API在CPU使用率上非常沉重,并且最终不适合抓取。最后,我们使用Socket.XxxxAsync方法编写了自己的HTTP堆栈,这样可以将CPU负载减少大约20倍。请注意,追求这条道路的学习曲线非常陡峭。
答案 2 :(得分:1)
有几个原因导致你的表现不佳:
需要更多信息/源代码才能找到明确的答案。
答案 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();
麦克