关于从网站中提取特定数据的WebRequest / POST问题

时间:2011-03-16 18:45:11

标签: post httpwebrequest

我正在尝试从公司网站收集有关特定事件的数据: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);

1 个答案:

答案 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();

希望这有助于其他人。