以下代码是网页数据抓取的页面,我放在计划管理中,每天早上10点到下午2点每十分钟抓取一次,这个程序放在服务器上能够自动保存价格再往数据库中自动赋值保存,但一般几天后,这个程序就崩溃退出了,感觉应该是网页一直打开读取,好像没有关闭,最后导致程序出错退出了,麻烦老师看下要想程序长时间运行没有问题代码如何处理好一些?
Dim tody As Date = Date.Today
Dim todynow As Date = Date.Now
If todynow.Hour > 10 AndAlso todynow.Hour < 14 Then
Dim dr1 As DataRow = DataTables("铜材价格表").Find("发布日期 = '"& tody &"'")
If dr1 Is Nothing = True Then
If sjlycs1 = 0 Then
Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True '屏蔽脚注错误
web.Navigate("https://www.ccmn.cn/")
Do Until web.ReadyState = 4
Application.DoEvents
Loop
Dim elems As object = web.Document.GetElementsByTagName("table") '读取网页中的表格
For Each elem As object In elems
If elem.getattribute("classname") = "price_quo" Then '查找表格集合中class = "price_quo"的表格
Dim elems1 As object = elem.GetElementsByTagName("tr")
For i As Integer = 1 To elems1.count-1
Dim tds = elems1(i).getelementsbytagname("td")
Dim mm As String = Date.Today.Month
Dim dd As String = Date.Today.Day
If tds(0).InnerText.Contains("铜") AndAlso tds(5).InnerText.Contains(mm) AndAlso tds(5).InnerText.Contains(dd) Then
Tables("铜材价格表").AddNew()
Tables("铜材价格表").Current("序号") = Tables("铜材价格表").DataTable.Compute("Max(序号)")+1
Tables("铜材价格表").Current("录入时间") = Date.Now
Tables("铜材价格表").Current("品名") = tds(0).InnerText
Tables("铜材价格表").Current("价格区间") = tds(1).InnerText
Tables("铜材价格表").Current("均价") = tds(2).InnerText
Tables("铜材价格表").Current("涨跌") = tds(3).InnerText
Tables("铜材价格表").Current("单位") = tds(4).InnerText
Tables("铜材价格表").Current("发布日期") = tds(5).InnerText
Tables("铜材价格表").Current("数据来源") = "长江有色金属网"
If Tables("铜材价格表").Current.IsNull("价格区间") OrElse Tables("铜材价格表").Current.IsNull("均价") OrElse Tables("铜材价格表").Current.IsNull("涨跌") OrElse Tables("铜材价格表").Current.IsNull("发布日期") Then
PopMessage("读取到空值,已删除该数据!","读取错误提示",PopIconEnum.Error)
Tables("铜材价格表").Current.Delete()
Return
End If
If Tables("铜材价格表").Current.IsNull("价格区间") = False Then '必须要当价格区间列已经有值,才能执行以下代码
Dim s As String = Tables("铜材价格表").Current("价格区间")
Dim k As String = s.IndexOf(Chr(-24150)) '用Asc(s2)函数获得-的字符编码是-24150
Tables("铜材价格表").Current("最高价") = s.SubString(k+1)
Tables("铜材价格表").Current("最低价") = s.Remove(k)
End If
If Tables("铜材价格表").Rows.Count > 1 Then '大于一行
If Math.Abs(Tables("铜材价格表").Current("均价")-Tables("铜材价格表").Rows(Tables("铜材价格表").Current.Index-1)("均价")) >pctscs1 Then
Tables("铜材价格表").Current("备注") = Tables("铜材价格表").Current("发布日期") & "涨跌为:" & Tables("铜材价格表").Current("均价")-Tables("铜材价格表").Rows(Tables("铜材价格表").Current.Index-1)("均价") & "(设定偏差:" & pctscs1 & "),请注意!"
End If
End If
Tables("铜材价格表").Save() '保存
'简单判断偏差提示
End If
Next
End If
Next
'抓取铜价
ElseIf sjlycs1 = 1 Then
Dim web As New System.Windows.Forms.WebBrowser()
web.ScriptErrorsSuppressed = True '屏蔽脚注错误
web.Navigate("https://www.smm.cn/") '上海有色网
Do Until web.ReadyState = 4
Application.DoEvents
Loop
Dim elems As object = web.Document.GetElementsByTagName("div") '读取网页中的div
For Each elem As object In elems
If elem.getattribute("classname") = "box-body" Then '查找表格集合中class = "box-body"的表格
Dim elems1 As object = elem.GetElementsByTagName("tr")
For i As Integer = 1 To elems1.count-1
Dim tds = elems1(i).getelementsbytagname("td")
Dim mm As String = Date.Today.Month
Dim dd As String = Date.Today.Day
If tds(0).InnerText.Contains("电解铜") AndAlso tds(4).InnerText.Contains(mm) AndAlso tds(4).InnerText.Contains(dd) Then
Tables("铜材价格表").AddNew()
Tables("铜材价格表").Current("序号") = Tables("铜材价格表").DataTable.Compute("Max(序号)")+1
Tables("铜材价格表").Current("录入时间") = Date.Now
Tables("铜材价格表").Current("品名") = tds(0).InnerText
Tables("铜材价格表").Current("价格区间") = tds(1).InnerText
Tables("铜材价格表").Current("均价") = tds(2).InnerText
Tables("铜材价格表").Current("涨跌") = tds(3).InnerText
Tables("铜材价格表").Current("单位") = "元/吨"
Tables("铜材价格表").Current("发布日期") = tds(4).InnerText
Tables("铜材价格表").Current("数据来源") = "上海有色网"
If Tables("铜材价格表").Current.IsNull("价格区间") OrElse Tables("铜材价格表").Current.IsNull("均价") OrElse Tables("铜材价格表").Current.IsNull("涨跌") OrElse Tables("铜材价格表").Current.IsNull("发布日期") Then
PopMessage("读取到空值,已删除该数据!","读取错误提示",PopIconEnum.Error)
Tables("铜材价格表").Current.Delete()
Return
End If
If Tables("铜材价格表").Current.IsNull("价格区间") = False Then '必须要当价格区间列已经有值,才能执行以下代码
Dim s As String = Tables("铜材价格表").Current("价格区间")
Dim k As String = s.IndexOf("-") '用Asc(s2)函数获得-的字符编码是-24150
Tables("铜材价格表").Current("最高价") = s.SubString(k+1)
Tables("铜材价格表").Current("最低价") = s.Remove(k)
End If
If Tables("铜材价格表").Rows.Count > 1 Then '大于一行
If Math.Abs(Tables("铜材价格表").Current("均价")-Tables("铜材价格表").Rows(Tables("铜材价格表").Current.Index-1)("均价")) >pctscs1 Then
Tables("铜材价格表").Current("备注") = Tables("铜材价格表").Current("发布日期") & "涨跌为:" & Tables("铜材价格表").Current("均价")-Tables("铜材价格表").Rows(Tables("铜材价格表").Current.Index-1)("均价") & "(设定偏差:" & pctscs1 & "),请注意!"
End If
End If
Tables("铜材价格表").Save() '保存
'简单判断偏差提示
End If
Next
End If
Next
'抓取铜价和铝价
End If
End If
'价格已更新,不需要再执行
End If