2011-03-16 138 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(); 

希望這可以幫助其他人。