首页 新闻 会员 周边 捐助

HttpWebRequest 出现的问题

0
[已解决问题] 解决于 2015-06-15 11:39

各位大侠:我用多线程+HttpWebRequest 实现蜘蛛爬虫,结果总是出现HttpWebRequest访问超时的情况,我排除了情况:刚开始将地址一次性初始化,让之前的抓取程序根据url一直抓取内容,不会出现访问超时的情况,抓取了一千条不会出现HttpWebRequest超时的情况,但一旦我一边抓取,一边存储抓取地址,访问超时的情况又出现了;问题转载至:http://ikyq.com

淡定的程序猿的主页 淡定的程序猿 | 初学一级 | 园豆:199
提问于:2015-05-28 15:18
< >
分享
最佳答案
0

多线程+HttpWebRequest   用信号量Semaphore控制一下多线程的数量吧, 不然很容易出错的或者超时的。

奖励园豆:5
请叫我头头哥 | 大侠五级 |园豆:9382 | 2015-05-28 15:48

这个已经控制了,我已经查询到,程序初始化时不运行,该进程里的线程数量是26条,当我启动线程去抓数据时候,也就是多出15-16条而已,这个数量都保持不变,按照我现在机子的配置,应该是可以支持15-16条线程运行的,我把线程数量设置为一条也会出现这种情况来的!所以这种情况我也排除了

淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 15:51
其他回答(1)
0

增加 

HttpWebRequest.Timeout

 

估计是存储速度不够快。

xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 15:32

应该不是,TimeOut的问题,超时时间都设置成300s了,存储速度不够快是什么意思呢?

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 15:33

@淡定的程序猿: 既然是超时,肯定是这几方面的问题:

1。超时设置的时间是否够。

2。既然你存储了数据,那么存储是不是瓶颈。

3。是获取数据超时,还是存储数据超时。

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 15:43

@xmodygetz: 它报的是WebException 异常 ,对于一二点应该可以排除,因为数据存储的量比较小,后面第三点有点疑问,获取或者存储数据超时会导致HttpWebRequest  WebException吗?

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 15:47

@淡定的程序猿: 如果你用的是begingetresponse方法,参见微软的说明

https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.begingetresponse(v=vs.110).aspx

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 15:49

@xmodygetz: 我没用异步,这个不好控制时间超时问题,我直接同步获取,还有,异步获取貌似也是从线程池中取出线程的吧,这样导致线程增多吧,所以,我都是用同步HttpWebRequest 抓取数据

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 15:52

超时设置再长一些试试看;

抓取有没有成功一部分;

异步可以设置超时,刚才帖的连接里就有例子

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 16:07

@xmodygetz: 是成功了几分钟后,就偶尔开始出现超时情况,一般访问超时都不会超过一分多钟吧,一分多钟应该算是比较长的访问了

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 16:09

@淡定的程序猿: 不一定,进程多了,不好说,尝试下延长超时时间

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 16:14

@xmodygetz: 同样的结果,即使将时间设置到三分钟,还是一样

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 16:24

@淡定的程序猿: 先解决同步的问题吧。我以前抓取百度1000个页面有几分钟的,而且有时候会被服务器拒绝(跟我没什么关系了那就)。

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 16:25

@淡定的程序猿: 我的意思是时间先设置到足够大,比如1小时,然后测试的数目不要太多,也是1000个连接,先看看极端情况下的结果。

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 16:29

@xmodygetz: 请问,你是也是用HttpWebRequest+同步?

支持(0) 反对(0) 淡定的程序猿 | 园豆:199 (初学一级) | 2015-05-28 16:29

@淡定的程序猿: 不是,但是随便怀疑工具的可靠性无助于解决问题,一步步进行测试才是最重要的。重写成异步一样会出现一些问题,时间上不划算。 

支持(0) 反对(0) xmodygetz | 园豆:575 (小虾三级) | 2015-05-28 16:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册