Foxtable(狐表)用户栏目专家坐堂 → 网页数据抓取多次后,程序报错退出怎么处理


  共有3108人关注过本帖树形打印复制链接

主题:网页数据抓取多次后,程序报错退出怎么处理

帅哥哟,离线,有人找我吗?
zpsun2003
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1256 威望:0 精华:0 注册:2018/4/19 21:34:00
网页数据抓取多次后,程序报错退出怎么处理  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/12 15:29:00 [只看该作者]

这种建议直接写数据库,不要使用datatable和table。


 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1256 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2020/3/14 17:45:00 [只看该作者]

这个我改一下,但是程序的崩溃主要是这个原因,还是不停的打开网页读取数据不能及时关闭呢?


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/15 20:06:00 [只看该作者]

估计就是这个原因

 回到顶部
帅哥哟,离线,有人找我吗?
zpsun2003
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:130 积分:1256 威望:0 精华:0 注册:2018/4/19 21:34:00
  发帖心情 Post By:2020/4/22 11:34:00 [只看该作者]

老师,之前咨询的这个铜铝价格更新程序还是会出现过几天就退出的问题,刚才我看了下任务管理器里面占用内存达到1407M了,是不是就是没有及时释放啊,有什么别的办法试一下吗?数据操作已经都改为通过SQl语句操作了


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109489 积分:557107 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/22 11:40:00 [只看该作者]

不要在内部表或者外部表添加数据,使用临时表,用完释放,可以看看:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100317&replyID=&skin=1

 回到顶部