[转]如何用asp编写网站数据采集程序(一)

引:假如你想从网上自动采集数据,把它们写进本地数据库中,那就看看本文介绍的方法吧。笔者为了解决这个问题,花了三天的时间,终于大功告成,下面就是完整的ASP代码,能让你随心所欲地从网上采集数据入库,非常实用啊!
一、网站数据采集方法
目前网站数据采集方法主要有两种,一是使用现成的软件,二是自己编写采集程序。
1、使用现成的软件
很多软件(例如网络信息采集大师、BK通用信息采集系统等)都能采集网上数据,只要你到baidu、Google中,以“数据采集软件”为关键词搜一下,即可找到。如今这类软件数量繁多,都是别人用C、DEPHI或VB写成的,一般都提供了免费版让你下载试用。它们虽然也能采集网上数据,但是采集后的数据要么不能入库,要么只能入库前10条;如果你想突破这种限制,就必须花钱购买其正式版了。笔者试用了所有的数据采集软件,发现都是如此!
2、自己编写ASP采集程序
既然现成的软件不能免费使用,为了省钱,只能自己编写ASP网站数据采集程序了!下面就是该程序的代码,如果你想免费采集网站数据,运行之即可。
二、网站数据采集过程
编写ASP网站数据采集程序,首先需要抓取远程网页的源代码。微软serverXMLHTTP组件能帮你抓取远程页面的二进制代码,然后将该代码转换成字符,进行截取、替换处理,即可得到想要的数据;最后再将数据显示出来、或者写入数据库中,整个采集工作就完成了。
三、如何抓取远程网页?
抓取远程HTML的二进制代码主要语句如下:
Set Http = CreateObject(“MSXML2.XMLHTTP”) '创建serverXMLHTTP组件
Http.open “GET”,src_ ,false
Http.send() '开始抓取
if Http.readystate<>4 then
exit sub
end if
value_ = Http.responseBody '抓取到的网页二进制代码存放在value_中
下面我们写一个steal()子程序,只要你提供一个网址url,即可利用它抓取URL网页的二进制代码,存放在value_变量中。
public sub steal() '窃取目标URL地址的HTML代码
if src_<>“” then 'src_=目标URL地址
dim Http
set Http=server.createobject(“MSXML2.XMLHTTP”) '创建serverXMLHTTP组件
Http.open “GET”,src_ ,false
Http.send()
if Http.readystate<>4 then '判断是否准备好
exit sub
end if
value_= Http.responseBody '抓取到网页
if len(value_)<100 then response.write "获取远程文件 “&url&” 失败。”
response.end
end if
isGet_= True '已抓取过标志isGet_
set http=nothing
if err.number<>0 then err.Clear
else
response.Write(““)
end if
end sub
四、将网页二进制代码转换成字符
现在只要你提供一个远程网页URL,然后调用上面的steal(),即可抓到该网页(二进制代码形式);由于二进制代码无法显示,所以要显示抓到的网页、或者入库,还需要转换成字符,必须写一个转换函数BytesToBstr,将网页二进制代码转换成字符,代码如下:
private Function BytesToBstr(body,Cset) '二进制转换成字符
dim objstream
set objstream = Server.CreateObject(“adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
五、抓取网页实例
现在我们能真枪实弹地抓一个网页了!例如要抓取六安信息港网页(http://market.ah163.net/city/AllDisplay.php?page=1&cityid=13),可以写一个2hand-cj.asp文件,在该文件中定义一个clsThief类,类中含有上面的子程序和函数,代码如下:
<% Dim Html,myThief,url_tittle '====采集六安信息港帖子网址列表 set myThief=new clsThief GetUrl="http://market.ah163.net/city/AllDisplay.php?page=1&cityid=13" myThief.src=GetUrl myThief.steal '抓取远程GetUrl整个网页,并将该网页二进制代码转换成字符 url_tittle=myThief.value '抓取的网页存在url_tittle中 Html=""&url_tittle&"" '最后结果存在Html中 Response.write Html '显示结果 Response.write "

set myThief=nothing '释放对象
Class clsThief '定义一个clsThief类
Private value_ '窃取到的内容
Private src_ '要偷的目标URL地址
Private isGet_ '判断是否已经偷过
public property let src(str) '赋值—要偷的目标URL地址/属性
src_=str
end property
public property get value '返回值—最终窃取并应用类方法加工过的内容/属性
value=value_
end property
private sub class_initialize() '初始化clsThief类
value_=””
src_=””
isGet_= false
end sub
public sub steal() '窃取目标URL地址的HTML代码/方法
if src_<>“” then
dim Http
set Http=server.createobject(“MSXML2.XMLHTTP”)
Http.open “GET”,src_ ,false
Http.send()
if Http.readystate<>4 then
exit sub
end if
value_=BytesToBSTR(Http.responseBody,”GB2312″) '将网页二进制转换成字符
if len(value_)<100 then response.write "获取远程文件 “&url&” 失败。”
response.end
end if
isGet_= True
set http=nothing
if err.number<>0 then err.Clear
else
response.Write(““)
end if
end sub
private Function BytesToBstr(body,Cset) '二进制转换成字符
dim objstream
set objstream = Server.CreateObject(“adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
end class
%>
解释一下以上程序中几个关键的语句:
GetUrl=http://market.ah163.net/city/AllDisplay.php?page=1&cityid=13 '要采集的网址
myThief.src=GetUrl '网址赋予myThief.src
myThief.steal '调用steal方法抓取远程网页,并将该网页二进制代码转换成字符
url_tittle=myThief.value '抓取的网页存放在url_tittle中
Html=””&url_tittle&”” '最后结果存放在Html中
Response.write Html '使用response显示抓取的网页
运行上面的2hand-cj.asp可以成功地抓取网页,结果如下图1所示!
接下来对于抓取的网页,我们只想保留表格(如上图)、其他的数据全不要,该怎么办呢?这就需要对抓取的网页进行截取了

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏