以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 网页数据抓取多次后,程序报错退出怎么处理 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=147242) |
-- 作者:zpsun2003 -- 发布时间:2020/3/12 15:17:00 -- 网页数据抓取多次后,程序报错退出怎么处理 以下代码是网页数据抓取的页面,我放在计划管理中,每天早上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
|
-- 作者:有点蓝 -- 发布时间:2020/3/12 15:29:00 -- 这种建议直接写数据库,不要使用datatable和table。 |
-- 作者:zpsun2003 -- 发布时间:2020/3/14 17:45:00 -- 这个我改一下,但是程序的崩溃主要是这个原因,还是不停的打开网页读取数据不能及时关闭呢? |
-- 作者:有点蓝 -- 发布时间:2020/3/15 20:06:00 -- 估计就是这个原因 |
-- 作者:zpsun2003 -- 发布时间:2020/4/22 11:34:00 -- 老师,之前咨询的这个铜铝价格更新程序还是会出现过几天就退出的问题,刚才我看了下任务管理器里面占用内存达到1407M了,是不是就是没有及时释放啊,有什么别的办法试一下吗?数据操作已经都改为通过SQl语句操作了 |
-- 作者:有点蓝 -- 发布时间:2020/4/22 11:40:00 -- 不要在内部表或者外部表添加数据,使用临时表,用完释放,可以看看:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100317&replyID=&skin=1 |