我正在尝试从公司网站收集有关特定事件的数据:http://pipeline.kindermorgan.com/infoposting/notices.aspx?type=CRIT 我已经工作了很多类似的网站,但到目前为止它们非常简单,只需要访问网站并使用响应流即可。在这种情况下,网站要求您从第一个组合框(TSP / TSP名称)中选择一个值。如果没有传递任何信息,URL将返回与列表中第一个项目关联的数据。我真的需要能够获得与列表中的任何项目相关联的数据。
这是我到目前为止使用的代码,但它因服务器错误500而失败,所以我猜我要么没有正确构成POST,要么在帖子数据中遗漏了一些数据):
对于我上面列出的页面,我只想获得一个响应流,其中包含组合框中特定TSP的通知表(从Trailblazer开始)。我知道控件是“ctl00 $ ContentPlaceHolder1 $ ddlpipeline”,我要发送的值是24.当我通过IE浏览时,我还必须按下“检索”按钮。
当我使用FireBug查看POST请求时,我注意到还有很多其他目标/值。我不确定是否需要发送所有这些内容(之前从未进行过POST)我不知道如何格式化POST中的数据来做到这一点。
如果这个请求看起来很奇怪,请耐心等待。我更像是一个数据库人,我希望自动化我们每天需要手动查看的许多东西。任何帮助将不胜感激!
var encoding = new ASCIIEncoding();
var postData = "ctl00$ContentPlaceHolder1$ddlpipeline=24";
byte[] data = encoding.GetBytes(postData);
string RemoteURI = "http://pipeline.kindermorgan.com/infoposting/notices.aspx?type=CRIT";
var myRequest = (HttpWebRequest)WebRequest.Create(RemoteURI);
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
var newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
var response = myRequest.GetResponse();
var responseStream = response.GetResponseStream();
var responseReader = new StreamReader(responseStream);
答案 0 :(得分:0)
我实际上已经解决了这个问题,我在这个过程中发现了一些我将分享的东西,以便其他人可以看一下这个帖子。
首先,我必须完全按照浏览器中的POST显示来构建POST数据(我使用Firebug查看POST数据)。这意味着获取隐藏的参数(特别是VIEWSTATE和EVENTVALIDATION)。我能够通过下载页面的默认页面源来获得这些(顺便说一下,我在代码中执行此操作,因为它对于此站点不是静态的)并解析出隐藏字段的值。然后我用我可能有的任何更改来构建POST数据字符串(在我的情况下,更改日期很重要,但将来我可能会更改其他内容)。
现在真的让我难过的事情。我确认POST数据字符串与FireFox / FireBug通过字符比较发送的数据字符串完全相同,但它仍然不起作用。然后我记得在之前的一个抓包案例中我必须设置用户代理。
所以这是我最终得到的代码:
string postData = String.Format("__EVENTTARGET=&__EVENTARGUMENT=&__LASTFOCUS="
+ "&__VIEWSTATE={0}"
+ "&ctl00%24UltraWebTree1={1}"
+ "&ctl00%24ContentPlaceHolder1%24ddlNoticeCategory={2}"
+ "&ctl00%24ContentPlaceHolder1%24ddlpipeline={3}"
+ "&ctl00%24ContentPlaceHolder1%24Button1={4}"
+ "&ctl00%24ContentPlaceHolder1%24tbDate={5}"
+ "&ctl00%24ContentPlaceHolder1%24ddlNoticeType={6}"
+ "&ctl00%24ContentPlaceHolder1%24tbSubject={7}"
+ "&ctl00%24ContentPlaceHolder1%24ddlNoticeSubType={8}"
+ "&ctl00%24ContentPlaceHolder1%24ddlOrderBy={9}"
+ "&ctl00%24ContentPlaceHolder1%24hfmode={10}"
+ "&ctl00%24ContentPlaceHolder1%24hfODSCommand={11}&ctl00%24hfPipeline={12}"
+ "&__PREVIOUSPAGE={13}&__EVENTVALIDATION={14}",
viewstate, webtree, noticecategory, pplcode,
button1, todaydate, noticetype, subject,
noticesubtype, orderby, hfmode, hfODSCommand,
hfPipeline, previouspage, eventvalidation);
var encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(postData);
var myRequest = (HttpWebRequest)WebRequest.Create(RemoteURI);
myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" ;
myRequest.Method = "POST" ;
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
var newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
var myresponse = myRequest.GetResponse();
var responseStream = myresponse.GetResponseStream();
var responseReader = new StreamReader(responseStream);
string webpagesource = responseReader.ReadToEnd();
希望这有助于其他人。