问题描述
我正在尝试从公共网页自动下载 Co2 数据。
该页面是一个 html 表单,带有两个日期选择器和一个下载按钮。
我想做的是在 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 (将#修改为@)