一步一步教会你,怎样采集网上数据
小生有礼
见习点评
UID16043 帖子3212 精华63 积分12119 金钱12119 元 众彩币771 金 阅读权限50 在线时间10 小时
注册时间2006-12-25 最后登录2009-1-20 个人空间 发短消息 加为好友 当前离线 1# 大 中 小 发表于 2008-1-7
16:39 只看该作者
一步一步教会你,怎样采集网上赔率数据
【菜鸟编程】一步一步教会你,怎样采集网上赔率数据:(内附VB源码)
本教程将以VB+Access展开说明,怎样采集新浪网提供的历史波胆赔率数据,顺便把比分数据也采集下载,供后续统计分析预测研究用途。
提示:假如你是一个菜鸟级程序设计者,已经掌握了基本的VB程序设计方法以及基本的数据库程序设计方
法,懂一点Access数据库,但是对于如何采集网上数据仍不甚了解或一知半解,又想亲自动手写自己的采集程序,以提高分析设计灵活性,那么本教程将会适合你。
经过翻查新浪体育提供的澳彩赔率数据网页,发现该网提供的澳彩各种赔率数据还算比较完整,值得采集下来进行统计分析研究。
一、分析数据格式,设计数据库:
由于本教程我们的主要目标是要采集澳彩的历史波胆赔率数据,因此我们需要知道新浪提供数据的网址和显示格式。
经过查,我们到了历史波胆赔率数据的网址为:odds.sports.sina/o ...
.php?times=20071208 (表示2007年12月8日的历史波胆赔率数据)
我们打开这个网页,分析它的数据显示格式,以确定数据库的设计格式。
经过分析,我们发现,数据显示格式还是比较工整的,其格式为:
比赛时间、对阵、以及各种比分对应的赔率,包括:1:0 2:0 2:1 3:0 3:1 3:2 4:0 4:1 4:2 4:3 0:0 1:1 2:2
3:3 4:4 其它比数
因此,我们就在Access数据库里面设计一个数据表data,包含有这些字段:
dat,cls,hst,gst,scr,h10,h20,h21,h30,h31,h32,h40,h41,h42,h43,g10,g20,g21,g30,g31,g32,g40,g41,g42,g43,d00,d11,d22,d33,d44,ddd
这里,dat用于保存比赛日期时间,cls用于保存比赛类型,hst用于保存主队名称,gst用于保存客队名称,scr用于保存比分,其他字段分别用于保存主队取胜的各种比分对应的赔率、客队取胜的各种比分对应的赔率、以及平局各种比分对应的赔率、还有其他比分对应的赔率ddd
为求简便,所有字段都使用默认属性格式设计。设计好数据库结构之后,下面我们就可以开始研究怎样采集网页数据了。
二、设计程序窗口界面:
新浪提供的历史数据是以日为单位呈现给我们的,因此,我们在设计程序时,可以设计一个
日期范围,用于循环采集指定日期范围内的所有数据。
那么,我们就在窗体上面摆放两个文本框,分别表示采集开始日期和结束日期。另外,再搞三个按钮,
一个用于下载波胆赔率数据、一个用于下载比分数据(我们希望后面还可以把比分采集功能加进来)、一个用于查最小波胆赔率(我们希望后面还可以把这个简单查统计功能加进来)
再加一个列表框,用于暂时保存下载下来的数据
要下载网页数据,还要添加一个WebBrowser控件
设计界面如图一所示。
三、程序代码设计:
我们希望在点击按钮一的时候,程序就进行指定数据下载,那么,我们就双击按钮一,在里面编写一个循环过程,以便程序循环逐日下载数据。程序代码如下:
Private Sub Command1_Click()
Dim i As Long
Dim dat As Date
Dim t As String
Dim strMacURL As String
Dim arr() As String
Dim brr() As String
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
vb编程基础知识菜鸟Command1.Enabled = False
cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" + App.Path +
"\fbbddata.mdb"
dat = CDate(Trim(Text1))
Do While DateDiff("d", CDate(Trim(Text2)), dat) <= 0
List1.Clear
Me.Caption = "正在下载赔率...(" + Format(dat, "yyyy-MM-dd") + ")"
DoEvents
strMacURL =
"odds.sports.sina/odds/correntscore.php?times=" +
Format(dat, "yyyyMMdd")
DownPage strMacURL
GetData Format(dat, "yyyy-MM-dd"), 0
For i = 0 To List1.ListCount - 2 Step 2
arr = Split(List1.List(i), ",")
brr = Split(List1.List(i + 1), ",")
rs.Open "select * from data where dat=’" + arr(0) + " " + arr(1) +
"’ and hst=’" + arr(2) + "’", cn, adOpenKeyset, adLockOptimistic,
adCmdText
If rs.EOF Then
rs.AddNew
rs("cls") = "待定"
rs("scr") = "待定"
End If
rs("dat") = arr(0) + " " + arr(1): rs("hst") = arr(2): rs("gst") =
brr(2)
rs("h10") = arr(3): rs("h20") = arr(4): rs("h21") = arr(5):
rs("h30") = arr(6): rs("h31") = arr(7): rs("h32") = arr(8): rs("h40") =
arr(9): rs("h41") = arr(10): rs("h42") = arr(11): rs("h43") = arr(12)
rs("g10") = brr(3): rs("g20") = brr(4): rs("g21") = brr(5):
rs("g30") = brr(6): rs("g31") = brr(7): rs("g32") = brr(8): rs("g40") =
brr(9): rs("g41") = brr(10): rs("g42") = brr(11): rs("g43") = brr(12)
rs("d00") = arr(13): rs("d11") = arr(14): rs("d22") = arr(15):
rs("d33") = arr(16): rs("d44") = arr(17): rs("ddd") = arr(18)
rs.Update
rs.Close
Next i
dat = DateAdd("d"
, 1, dat)
Loop
Me.Caption = "下载完毕!"
Set rs = Nothing
Set cn = Nothing
Command1.Enabled = True
DoEvents
End Sub
以上这段代码,我们写了一个Do While循环,从Text1表示的日期开始,逐日采集数据,一直到Text2表示的日期为止,采集结束。
本教程我们利用WebBrowser控件进行网页下载,由于“下载网页”这个功能相对比较通用,可供“波胆赔率下载”和“比分下载”两个功能共同使用,将来其他程序还可以借用这个功能,因此,我们把这个功能进行模块化,单独拿出来另外做成一子个过程DownPage,这样更能提高程序阅读的清晰度。另外,也把“数据提取”功能单独做成一个子过程GetData,供“波胆赔率下载”和“比分下载”两个功能共同使用。
在这个Do While循环里面还有一个For循环,用于把采集下来的某一天的数据(已经整理好,暂时放在列表框里)逐一保存到数据库里。
※两个共用功能模块:DownPage和GetData
下面简单讲讲DownPage这个子过程。本过程的功能是:利用WebBrowser控件下载指定网址的网页,只下载不分析。具体代码如下:
Private Sub DownPage(ByVal strURL As String)
Dim i As Long
Dim arr() As String
ClearHistoryURL strURL
DoEvents
WebBrowser1.Silent = True ’使webbrowser控件不跳出脚本错误的对话框
DoEvents
WebBrowser1.Navigate "about:blank"
DoEvents
WebBrowser1.Navigate strURL
DoEvents
Do
DoEvents
If WebBrowser1.Busy = False Then
If Not (WebBrowser1.Document.body Is Nothing) Then
Exit Do
End If
End If
Loop
End Sub
这里,用到了一个调用API的函数ClearHistoryURL,意思就是:在下载某网页之前,先清空IE浏览器的缓存,防止程序后续代码读到的不是最新的数据。
这里还用到了一个小技巧,就是:程序使用了一个Do循环,用于判断网页是否已经下载完毕,当检查到网页文档中已经有body对象存在,则认为网页已经下载完毕,可以返回到调用它的过程了,否则继续循环等待,直到网页下载完毕。
下面再简单讲讲GetData这个子过程。本过程的功能是:分析下载下来的网页代码,从中提取有用的信息。
其实,说起来,数据采集程序设计最困难的地方就在这里了,原因是互联网上的各个网站提供的网页数据格式千变万化,很不通用,有的甚至很不规范,因此,给数据采集造成了很大的麻烦。即使程序写好了,将来网站提供的网页格式改变了,我们的这个“数据分析提取”模块也要跟着修改才行。好
彩,我们选择的这个新浪体育的网页数据格式还算比较工整,这就为我们采集数据提供了很大的便利。
为求简便,我们利用VB提供的IHTMLDocument2类对网页里的table对象按行提取数据,然后再根据需要提取有用信息的行。
具体代码如下:
Private Sub GetData(ByVal dat As String, ByVal flg As Integer)
Dim i As Long
Dim arr() As String
Dim brr() As String
Dim t As String
Dim doc As IHTMLDocument2
Dim tbs As IHTMLElementCollection
Dim tb As IHTMLElement
Dim tr As IHTMLElement
Dim td As IHTMLElement
Set doc = WebBrowser1.Document
Set tbs = doc.All.tags("TABLE")
For Each tb In tbs
For Each tr In tb.All.tags("TR")
t = ""
For Each td In tr.All.tags("TD")
If t = "" Then
t = Trim(Replace(Replace(td.innerText, Chr$(10), " "), Chr$(13),
" "))
Else
t = t + "," + Trim(Replace(Replace(td.innerText, Chr$(10), " "),
Chr$(13), " "))
End If
Next
Do While InStr(1, t, " ") > 0 Or InStr(1, t, " ") > 0
t = Trim(Replace(Replace(t, " ", " "), " ", " "))
Loop
arr = Split(t, ",")
If flg = 0 Then ’波胆
If UBound(arr) = 17 And InStr(1, t, ":") > 0 And InStr(1, t,
"比赛时间") = 0 Then
List1.AddItem dat + "," + t
End If
ElseIf flg = 1 Then ’比分
If UBound(arr) = 7 And InStr(1, t, "-") > 0 And InStr(1, t, ":") >
0 Then
List1.AddItem dat + "," + t
End If
End If
Next
Next
End Sub
因为这个子程序模块设计为“波胆下载”和“比分下载”所共用,这两种数据采集格式有点区别,因此,有必要设计一个参数,用于区别当前采集的数据是波胆还是比分,这个参数就是flg,其值0代表处理波胆数据,1代表比分数据。另外,还设计了一个参数dat,用于表示当前下载的数据是哪一天的,以便于在保存数据时把这个日期加进去。
由于新浪体育提供的网页数据格式比较规范,所以这个模块也不是很难编写。提取数据的步骤就是(以采集波胆数据为例):先把采集下来的网页数据的table里面的所有单元格里面的文本数据提取出来(逗号分隔),以table里的每一个tr的所有td的文本内容作为一行(table、tr、td为网页表格代码术语),提取出来,然后再经过分析,知道含有波胆赔率的有用信息行包含有17个单元格内容,因此我们对提取出来的行进行过滤,只将那些含有17个单元格、并且含有代表时间标志的冒号、并且没有“比赛时间”字
样的行保留下来,暂时保存到ListBox列表框里。再返回到调用它的按钮一的过程里,执行后续数据库保存操作时,再把奇数行和偶数行相关数据一一对应整理成一条条完整的赛事数据即可保存。(保存比分数据就没那么麻烦,一行就表示一条赛事数据,保存时只要把比赛时间和主队名称对应起来更新数据就可以了)
在这里,在“采集波胆赔率数据”时,由于比赛类型不方便提取,因此我们把比赛类型的提取工作改在“采集比分数据”里进行。
至此,在前面两个帖子已经把“采集网上数据”的具体方法全部讲完。
假如你看到这里还是“云里雾里”,那么还需继续落力,仔细研究,细细体会。
正所谓“熟能生巧”,把采集程序的设计方法和步骤摸透了,能亲自动手设计出第一第二个自己的采集程序了,以后再编写其他类似的采集程序就“轻车路熟”了,再去设计开发其他更为复杂的采集分析系统就难不倒你了。
慢慢来,稳
【后续工作和遗留问题】
本程序主要意在讲解如何去编写一个基本的网页数据采集程序,因此,程序还显得有些粗糙,还不够完善。例如,在采集比分之后,把比分对应更新到数据库中时就遇到这样一个问题:有些赛事的比分数据没法更新。这是由于新浪体育的球队命名不规范造成的,波胆网页和比分网页里的球队名称有差异,不统一,所以在更新比分数据时,有些赛事就不到,没法更新。后续解决办法,个人认为只能先分别手工提取波胆网页和比分网页里面的球队名称,然后设计一个名称对照表,然后在更新比分时,通过这个对照表来对应球队名称了。球队名称繁多,可以在用到哪一天的名称时再提取哪一天的也行。这个工作不难,只是比较费时费劲,自己就不提供这方面的代码了,就等有心的你来完成。
只要有恒心,棍子都练成金
。。。。。。(教程全文完)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论