我有一个网络抓取工具,用于从 wp7 中的不同来源抓取新闻。 我目前的做法是:
- 从 xml 文件加载报纸信息。
- 转到指定部分并获取新闻条目的网址。
- 转到每个网址并获取标题、图片、发布商。
- 使用Windows Phone的MVVM架构进行显示。
整个事情是异步发生的...意味着一旦从报纸的某个部分获取 url,它就会被添加到队列中,并且由获取标题、图像等组成的第二阶段开始...并且一旦即使是一篇文章也会获取此信息并显示。稍后,随着获取更多文章,它们将被添加到列表中。
出于获取目的,我使用适用于 Windows Phone 的 SmartThreadPool( http://www.codeproject.com/Articles/7933/Smart-Thread-Pool )。
我的问题是...即使从 9 个出版物中获取大约 80 个项目(总共),也需要一分钟多的时间。 我怎样才能加快这个过程?
注意:我采用两阶段方法,因为很多时候图像不包含标题,只能在文章中找到。
最佳答案
发出 80 个网络请求并获得 80 个响应需要超过一分钟的时间,这并不奇怪。即使在有线连接上,请求和响应之间通常也需要至少 500 毫秒的时间。根据服务器和您的连接,请求和响应之间有一整秒的延迟并非不合理。这还不包括下载内容所需的时间。
您的 3 Mbps 链路是每秒 3 兆*位*,或每秒不到 400 KB,并且将与使用同一塔或连接点的其他人共享。
我对SmartThreadPool不熟悉,也不知道你是如何使用它的。不过,它很可能限制了并发线程的数量,并且您每个请求使用一个线程。因此,如果它限制您最多 4 个并发线程,那么您最多只能每秒下载 4 次。
如果您使用单个线程发出多个异步 Web 请求,则可以有 15 个(可能更多)并发请求。由于发出 Web 请求的大部分时间都花在等待服务器的响应上,因此与其他方法相比,这将大大提高性能。假设您下载的新闻文章不是很大,限制因素是带宽。
根据您的描述,我想说您不需要执行任何显式多线程处理。只需使用异步网络请求即可。
当然,所有这些都是猜测,因为您没有显示任何代码或以详细描述的方式提供太多内容。但如果我要写一个像你描述的那样的新闻爬虫,这就是我会采取的方法。
关于c# - 优化新闻获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640658/