VB.net WebClient 自动将 CSV 从“发布”请求下载到 aspx 页面

问题描述

我正在尝试从公共网页自动下载 Co2 数据。

页面一个 html 表单,带有两个日期选择器和一个下载按钮。

在浏览器中点击下载时,浏览器会下载一个 CSV 文件

我想做的是在 VB.net 中写一些东西来帮助我每小时得到这个 CSV。

表单本身非常复杂,有很多隐藏文件,但我有 70% 的把握确保我已正确格式化提交所需的所有数据(手指交叉)

我通过首先向保存 HTML 页面发出 GET 请求并解析相关数据来实现此目的。

我想要的已经在下面的代码中完成,但我希望它在 VB.net 中而不是在 python 中。

    postdata = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'__EVENTVALIDATION': eventvalidation,'FromDatePicker_clientState': FromDatePicker_clientState,'ToDatePicker_clientState': ToDatePicker_clientState,'btnDownloadCSV': btnDownloadCSV,'_ig_def_dp_cal_clientState': ig_def_dp_cal_clientState,'_IG_CSS_LINKS_': IG_CSS_LINKS_
               }

    postheaders = {
                   'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Content-Type': 'application/x-www-form-urlencoded'
                  }

    datareq = s.post(url,headers=postheaders,data=postdata)

我使用的代码

    'put request
    Dim WebClient = New WebClient()
    WebClient.Headers(HttpRequestHeader.Accept) = "text/html,*/*;q=0.8"
    WebClient.Headers(HttpRequestHeader.UserAgent) = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0"
    WebClient.Headers(HttpRequestHeader.ContentType) = "application/x-www-form-urlencoded"

    Dim dataText As String = "{'__VIEWSTATE': " + VIEWSTATE.ToString + ",'__VIEWSTATEGENERATOR': " + VIEWSTATEGENERATOR.ToString + ",'__EVENTVALIDATION': " + EVENTVALIDATION.ToString + ",'FromDatePicker_clientState': " + FromDatePicker_clientState.ToString + ",'ToDatePicker_clientState': " + ToDatePicker_clientState.ToString + ",'btnDownloadCSV': " + btnDownloadCSV.ToString + ",'_ig_def_dp_cal_clientState': " + ig_def_dp_cal_clientState.ToString + ",'_IG_CSS_LINKS_': " + IG_CSS_LINKS_.ToString + "
                             }"


    'Dim byteArray As Byte() = Encoding.ASCII.GetBytes(dataText)

     Dim response = WebClient.UploadString(URL,dataText)

    'Dim responce = Encoding.ASCII.GetString(eirgridResponse)

从注释掉的部分可以看出,我也尝试将 WebClient.DownloadFile 与 Byte() 负载一起使用。

每次运行代码时,我只会得到原始 HTML 表单的响应,而不是所需的 CSV 数据。

感谢任何指点。

编辑:- 根据使用 HttpWebResponse 测试的建议如下,没有预期数据。

 Try
     Dim origResponse2 As HttpWebResponse
     Dim origRequest2 As HttpWebRequest = nothing
     origRequest2 = DirectCast(HttpWebRequest.Create(URL),HttpWebRequest)
     Dim dataText As String = "__VIEWSTATE=" + VIEWSTATE.ToString +
                              "&__VIEWSTATEGENERATOR=" + VIEWSTATEGENERATOR.ToString +
                              "&__EVENTVALIDATION=" + EVENTVALIDATION.ToString +
                              "&FromDatePicker_clientState=" + FromDatePicker_clientState.ToString +
                              "&ToDatePicker_clientState=" + ToDatePicker_clientState.ToString +
                              "&btnDownloadCSV=" + btnDownloadCSV.ToString +
                              "&_ig_def_dp_cal_clientState=" + ig_def_dp_cal_clientState.ToString +
                              "&_IG_CSS_LINKS_=" + IG_CSS_LINKS_.ToString
     With origRequest2
        .AllowAutoRedirect = True
        .Accept = "text/html,*/*;q=0.8"
        .Method = "Post"
        .UserAgent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0"
     End With
     Dim dataTextEncoded = WebUtility.UrlEncode(dataText)
     Dim Data As Byte() = Encoding.UTF8.GetBytes(dataTextEncoded)
                            origRequest2.ContentLength = Data.Length

     Dim stream As Stream = origRequest2.GetRequestStream()
     stream.Write(Data,Data.Length)
     stream.Close()

     origResponse2 = origRequest2.GetResponse()
     Dim status = origResponse2.StatusCode
     If status = 200 Then
          Dim statusdes = origResponse2.StatusDescription
     End If

     Dim reader2 As IO.StreamReader = New IO.StreamReader(origResponse2.GetResponseStream(),Encoding.Default)
     Dim content2 As String = reader2.ReadToEnd()
     
     'do stuff
     Dim one = 1

 Catch ex As Exception
     WriteLog(Now & " Get Co2 History " & GetExceptionInfo(ex))
 End Try

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)