常用的ASP采集程序代码,如果对方慢容易导致服务器CPU 100%,如何解决?

luok 2014-04-17 10:28:49
常用的ASP采集程序代码,如果对方慢容易导致服务器CPU 100%,如何解决?

下面是一个最常用的ASP采集程序代码

Set Http=Server.CreateObject("MSXML2.serverXMLHTTP")

Http.Open "GET",Url,False 'true为异步.false为同步,就是有返回消息后才去执行后面操作,
'如果被采集URL 这个地址服务器反应慢,比如10秒,采集他的机器IIS就得等他10秒,这就导致去抓取他的机器CPU 达100%,类似ASP里面的死循环效果,如何解决?
'有人测试过,这个参数使用True么,

Http.Send()
If Http.ReadyState<>4 Then '4表示文档已经解析完毕,客户端可以接受返回消息
GetHtml=""
End If
GetHtml=BytesToBSTR(Http.ResponseBody,charset)
Set Http=Nothing

常用的ASP采集程序代码,如果对方慢容易导致服务器CPU 100%,
关键是Http.Open "GET",Url,False 这里的 FALSE

不知道大家是 如何解决这个问题。
...全文
1316 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
luok 2014-06-15
  • 打赏
  • 举报
回复
引用 11 楼 showbo 的回复:
[quote=引用 7 楼 luok 的回复:] [quote=引用 6 楼 showbo 的回复:] 不过感觉你代码有问题吧。。我这里测试就算同步的也没用出现cpu100%的情况
感谢版主给的代码!! 1、没出现100%,是因为请求的人少吧,如果每秒请求抓500页,每个抓取都要10秒左右,普通机器就100%了,我目前只能用小型机硬扛,普通服务器撑不了 2、xmlServerHttp.waitForResponse 这样的方式,我试了,能抓到数据,效果跟同步方式一样,CPU 在等待期间并没有闲置。在普通机器上测试,CPU占用率 完全一样的。[/quote] 机器不行就没办法了,访问量大肯定会加重cpu负担的,要不就不会存在cc攻击了[/quote] 机器其实也还可以,毕竟也是百万级的, 访问量并不大,算上蜘蛛的,估计几百万PV这样。 这个问题却只能从软件方面解决,看来ASP是无解了,
Go 旅城通票 2014-04-28
  • 打赏
  • 举报
回复
引用 7 楼 luok 的回复:
[quote=引用 6 楼 showbo 的回复:] 不过感觉你代码有问题吧。。我这里测试就算同步的也没用出现cpu100%的情况
感谢版主给的代码!! 1、没出现100%,是因为请求的人少吧,如果每秒请求抓500页,每个抓取都要10秒左右,普通机器就100%了,我目前只能用小型机硬扛,普通服务器撑不了 2、xmlServerHttp.waitForResponse 这样的方式,我试了,能抓到数据,效果跟同步方式一样,CPU 在等待期间并没有闲置。在普通机器上测试,CPU占用率 完全一样的。[/quote] 机器不行就没办法了,访问量大肯定会加重cpu负担的,要不就不会存在cc攻击了
  • 打赏
  • 举报
回复
我的电脑以前试过,1000线程都不会卡
小伙真帅 2014-04-27
  • 打赏
  • 举报
回复
大数据采集的时候,不建议在服务器上操作。至少,不应该交给WEB来执行。而是用CS来执行。
luok 2014-04-26
  • 打赏
  • 举报
回复
嗯,楼上的采集,确实是很好的思路。 我这个跟你有点点不同,高峰时每秒500个,是同时的,每一个可能持续6-10秒才能成功,也就是说,服务器可能同时正在处理5000个。是小偷程序,请求是搜索引擎蜘蛛或用户访问发起的,你懂的
scscms太阳光 2014-04-25
  • 打赏
  • 举报
回复
不管怎么采,在asp里最好用js一次次请求。
也就是说首先ASP采集到所有要采集的页面地址,比如100个就有100个url
然后一个个去采,成功一个再发送第二个,假如出错就记录下来,继续第二个,如此才不致于卡机。
luok 2014-04-24
  • 打赏
  • 举报
回复
引用 6 楼 showbo 的回复:
不过感觉你代码有问题吧。。我这里测试就算同步的也没用出现cpu100%的情况
感谢版主给的代码!! 1、没出现100%,是因为请求的人少吧,如果每秒请求抓500页,每个抓取都要10秒左右,普通机器就100%了,我目前只能用小型机硬扛,普通服务器撑不了 2、xmlServerHttp.waitForResponse 这样的方式,我试了,能抓到数据,效果跟同步方式一样,CPU 在等待期间并没有闲置。在普通机器上测试,CPU占用率 完全一样的。
Go 旅城通票 2014-04-23
  • 打赏
  • 举报
回复
不过感觉你代码有问题吧。。我这里测试就算同步的也没用出现cpu100%的情况
Go 旅城通票 2014-04-23
  • 打赏
  • 举报
回复
MSXML2.ServerXMLHTTP异步的试试
if request.QueryString("dc")="1" then'xhr请求则输出当前时间并停止继续执行
  response.Write now
  response.End
end if
Dim xmlServerHttp
set xmlserverhttp = server.createobject("MSXML2.ServerXMLHTTP")
xmlServerHttp.open "GET", "url地址", true'发起异步请求
xmlServerHttp.send
 
While xmlServerHttp.readyState <> 4'注意这里要判断xhr对象的状态,如果不为4则等待1000ms,要不最下面那句会报上面贴出来的错误
    xmlServerHttp.waitForResponse 1000
Wend
 
response.contenttype = "text/html"
response.write "Receiver Page: " & xmlServerHttp.responseText & "<br/>"
renliquan 2014-04-22
  • 打赏
  • 举报
回复
换个抓取代码? 这个慢说不清楚,有可能是代码影起的。 你可以试一下少抓几个字段,看看情况。。。。确实还是持续升高。可能代码本身有问题了。
滴水海洋 2014-04-21
  • 打赏
  • 举报
回复
登录且参与回复,每天可增加10分可用分;
luok 2014-04-21
  • 打赏
  • 举报
回复
引用 1 楼 hookee 的回复:
要么设置Timeout, 采集的程序一定要用ASP写吗?
是的,一定要用ASP,原来的系统就是ASP的, 设置TIMEOUT 应该也不能解决cpu 100%的问题,在timeout等待期间应该也是 CPU 100%的 感觉用那个异步方式有可能能解决 但用异步方式,然后用延迟执行组件,延迟20秒去 If Http.ReadyState<>4 Then 仍然抓不到数据。
hookee 2014-04-18
  • 打赏
  • 举报
回复
要么设置Timeout, 采集的程序一定要用ASP写吗?

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧