Roe*_*oey 20 c# performance web-crawler httpwebresponse streamreader
我正在尝试使用HttpWebResponse.GetResponse()和Streamreader.ReadToEnd()在C#中实现有限的Web爬虫(仅限几百个站点),也尝试使用StreamReader.Read()和循环来构建我的HTML字符串.
我只下载大约5-10K的页面.
这一切都很慢!例如,平均GetResponse()时间约为半秒,而平均StreamREader.ReadToEnd()时间约为5秒!
所有站点都应该非常快,因为它们非常靠近我的位置,并且具有快速的服务器.(在资源管理器中几乎没有任何东西到D/L)并且我没有使用任何代理.
我的Crawler有大约20个线程同时从同一个站点读取.这会导致问题吗?
如何减少StreamReader.ReadToEnd DRASTICALLY?
kgr*_*ffs 15
HttpWebRequest可能需要一段时间来检测您的代理设置.尝试将此添加到您的应用程序配置:
<system.net>
<defaultProxy enabled="false">
<proxy/>
<bypasslist/>
<module/>
</defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)
您还可以通过缓冲读取来减少对底层操作系统套接字的调用次数,从而获得轻微的性能提升:
using (BufferedStream buffer = new BufferedStream(stream))
{
using (StreamReader reader = new StreamReader(buffer))
{
pageContent = reader.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
WebClient的DownloadString是HttpWebRequest的一个简单包装器,您是否可以暂时尝试使用它并查看速度是否提高?如果事情变得更快,你可以分享你的代码,这样我们可以看看它可能有什么问题吗?
编辑:
似乎HttpWebRequest遵守IE的"最大并发连接数"设置,这些URL是否在同一个域中?您可以尝试增加连接限制,看看是否有帮助?我发现这篇文章是关于这个问题的:
默认情况下,您不能执行超过2-3个异步HttpWebRequest(取决于操作系统).为了覆盖它(最简单的方法,恕我直言),不要忘记在应用程序的配置文件中添加此部分:
<system.net>
<connectionManagement>
<add address="*" maxconnection="65000" />
</connectionManagement>
</system.net>
Run Code Online (Sandbox Code Playgroud)