2011-03-16 67 views
0

我想从公司网站收集特定事件的数据:http://pipeline.kindermorgan.com/infoposting/notices.aspx?type=CRIT 我曾经工作过很多类似的网站,但到目前为止他们一直非常简单,它只是一个访问网站和使用响应流的问题。在这种情况下,网站要求您从第一个组合框(TSP/TSP名称)中选择一个值。如果没有任何信息被传递,URL将返回与列表中第一个项目关联的数据。我真的需要能够获取与列表中的任何项目相关的数据。WebRequest/POST关于从网站提取特定数据的问题

这是我一直使用至今的代码,但它无法与服务器错误500,所以我猜测,要么我没有正确形成POST或者是缺少在后数据中的某些数据):

对于我上面列出的页面,我只想从组合框(从Trailblazer开始)获得特定TSP通知表的响应流。我知道控件是“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

我还没有仔细看过这个 - 但是在很高的层面上,如果浏览器成功发布数据并获取所需的响应,那么您还应该在代码中发送相同的请求。这会增加你成功的机会。 – feroze 2011-03-17 18:25:53

+0

谢谢feroze。我最终确信,我在代码中构建的POST数据与我在使用FireBug时看到的完全一样,但仍然无效。然后在神圣的干预时刻,我想起了以前的努力,需要为请求设置用户代理。我做到了这一点,瞧,它像一个冠军。这里是我添加的代码(为了其他人的利益): myRequest.UserAgent =“Mozilla/4.0(compatible; MSIE 7.0; Windows NT 5.1)”; – 2011-03-19 00:56:04

回答

0

我其实解决这个问题,有一些东西我在,我将分享给别人谁可以看这个线程的利益过程中发现的。

首先,我必须完全按照它在POST中出现的浏览器(我使用Firebug查看POST数据)来构建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(); 

希望这可以帮助其他人。