2016-02-04 31 views
7

私はHttpWebRequestを使用してそのデータを読み取ることができ、GETおよびPOSTリクエストを行うことができると確信していました。 GETリクエストは正常に動作しています。 POST要求もエラーは発生しませんが、投稿されたフォームデータは返された結果に影響を与えません。投稿されたフォームデータには、日付ごとにデータをフィルタリングするフィールドがありますが、必要なデータがすべて転記されても、返されるデータはフィルタリングされません。私はすべてのヘッダー、フォームデータを追加し、リクエストと共にクッキーを追加しました。投稿されたフォームデータがHtppWebRequestを使用していません

WebページのURLがhttp://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0

で、これは非常に一般的なウェブサイトのように思えるが、それはaspxページで、ViewStateのとイベントの検証を必要とするようので、これは非常に簡単ではないことが予想されました。

私の最初のステップは、Fiddlerを使用してサイトのGETとPOSTを分析することでした。これは、FiddlerがこのURLのトラフィックをキャプチャしていないために驚いています。私はチャールズを試みたが、それ自体はこのURLをキャプチャしていない。それ以外の場合、このURLのFiddlerとCharlesは、他のすべてをキャプチャしています。私は、HttpWebRequestを使ってコンソールアプリケーションからUrlを呼び出すと、FiddlerとCharlesの両方がそれを取得したが、Chrome、FireFox、Internet Explorer 11からキャプチャしていないことにも言及したい。

FireFoxの開発ツールで、ヘッダー、パラメータ、およびCookieを含むすべてが表示されました。 Chromeでは、クッキーは存在しませんでした。私はHttpWebRequestを作成してクッキーを検査し、応答を得たときにクッキーは存在しませんでした。だから、このウェブサイトでは何かが本当に不思議です。

私は何とか単純な関数を作成してリクエストを作成し、応答を得ました。私がやっていることは、まずGETリクエストを作成して、ウェブサイトの文字列を取得し、それからViewstate、EventValidationなどを抽出することです。私は、この情報を投稿である2番目のHttpWebRequestで使用するために使用します。今はすべて正常に動作し、私は応答を得るが期待どおりにはなりません。レコードを2つの日付の間に入れたいのですが、これらの日付をフォームデータに指定しましたが、依然としてPOSTリクエストはフィルタリングされたデータを返しません。私は以下で作成した関数について言及しましたが、なぜこれが起こっているのか、そしてこれをどう扱うべきかということについて、本当に感謝しています。私がこのシンプルなウェブサイトがなぜフィドラーに現れないのか理解できないので、これを理解することは私にとって挑戦になりました。 (これはJavascriptのポストバックを使用します)

コードは長くて怖いかもしれませんが、むしろ非常に単純で簡単です。

Try 

     ' First GET Request to obtain Viewstate, Eventvalidation etc 
     Dim objRequest2 As Net.HttpWebRequest = DirectCast(HttpWebRequest.Create("http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0"), HttpWebRequest) 
     objRequest2.Method = "GET" 
     objRequest2.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
     objRequest2.Headers.Add("Accept-Encoding", "gzip, deflate") 
     objRequest2.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ur;q=0.4") 
     objRequest2.KeepAlive = True 
     objRequest2.ContentType = "application/x-www-form-urlencoded" 
     objRequest2.Host = "www.bseindia.com" 
     objRequest2.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" 

     objRequest2.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip 

     Dim LoginRes2 As Net.HttpWebResponse 
     Dim sr2 As IO.StreamReader 
     LoginRes2 = objRequest2.GetResponse() 

     sr2 = New IO.StreamReader(LoginRes2.GetResponseStream) 
     Dim getString As String = sr2.ReadToEnd() 
     Dim getCookieCollection = objRequest2.CookieContainer 

     ' get the page ViewState     
     Dim viewStateFlag As String = "id=""__VIEWSTATE"" value=""" 
     Dim i As Integer = getString.IndexOf(viewStateFlag) + viewStateFlag.Length 
     Dim j As Integer = getString.IndexOf("""", i) 
     Dim viewState As String = getString.Substring(i, j - i) 

     ' get page EventValidation     
     Dim eventValidationFlag As String = "id=""__EVENTVALIDATION"" value=""" 
     i = getString.IndexOf(eventValidationFlag) + eventValidationFlag.Length 
     j = getString.IndexOf("""", i) 
     Dim eventValidation As String = getString.Substring(i, j - i) 

     ' get page EventValidation     
     Dim viewstateGeneratorFlag As String = "id=""__VIEWSTATEGENERATOR"" value=""" 
     i = getString.IndexOf(viewstateGeneratorFlag) + viewstateGeneratorFlag.Length 
     j = getString.IndexOf("""", i) 
     Dim viewStateGenerator As String = getString.Substring(i, j - i) 

     viewState = System.Web.HttpUtility.UrlEncode(viewState) 
     eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation) 

     Dim LoginRes As Net.HttpWebResponse 
     Dim sr As IO.StreamReader 
     Dim objRequest As Net.HttpWebRequest 

     ' Second POST request to post the form data along with cookies 
     objRequest = DirectCast(HttpWebRequest.Create("http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0"), HttpWebRequest) 

     Dim formDataCollection As New NameValueCollection 

     formDataCollection.Add("__EVENTTARGET", "") 
     formDataCollection.Add("__EVENTARGUMENT", "") 
     formDataCollection.Add("__VIEWSTATE", viewState) 
     formDataCollection.Add("__VIEWSTATEGENERATOR", viewStateGenerator) 
     formDataCollection.Add("__EVENTVALIDATION", eventValidation) 
     formDataCollection.Add("fmdate", "20160104") 
     formDataCollection.Add("eddate", "20160204") 
     formDataCollection.Add("hidCurrentDate", "2016/02/04") 
     formDataCollection.Add("ctl00_ContentPlaceHolder1_hdnCode", "") 
     formDataCollection.Add("txtDate", "04/01/2016") 
     formDataCollection.Add("ddlCalMonthDiv3", "1") 
     formDataCollection.Add("ddlCalYearDiv3", "2016") 
     formDataCollection.Add("txtTodate", "04/02/2016") 
     formDataCollection.Add("ddlCalMonthDiv4", "2") 
     formDataCollection.Add("ddlCalYearDiv4", "2016") 
     formDataCollection.Add("Hidden1", "") 
     formDataCollection.Add("ctl00_ContentPlaceHolder1_GetQuote1_smartSearch", "Enter Security Name/Code/ID") 
     formDataCollection.Add("btnSubmit.x", "44") 
     formDataCollection.Add("btnSubmit.y", "2") 

     Dim strFormdata As String = formDataCollection.ToString() 
     Dim encoding As New ASCIIEncoding 
     Dim postBytes As Byte() = encoding.GetBytes(strFormdata) 

     objRequest.Method = "POST" 
     objRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" 
     objRequest.Headers.Add("Accept-Encoding", "gzip, deflate") 
     objRequest.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ur;q=0.4") 
     objRequest.Headers.Add("Cache-Control", "private, max-age=60") 
     objRequest.KeepAlive = True 
     objRequest.ContentType = "application/x-www-form-urlencoded" 
     objRequest.Host = "www.bseindia.com" 
     objRequest.Headers.Add("Origin", "http://www.bseindia.com") 
     objRequest.Referer = "http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0" 
     objRequest.Headers.Add("Upgrade-Insecure-Requests", "1") 
     objRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" 

     objRequest.ContentType = "text/html; charset=utf-8" 
     objRequest.Date = "Thu, 04 Feb 2016 13:42:04 GMT" 
     objRequest.Headers.Add("Server", "Microsoft-IIS/8.0") 
     objRequest.Headers.Add("Vary", "Accept-Encoding") 
     objRequest.Headers.Add("X-AspNet-Version", "2.0.50727") 
     objRequest.Headers.Add("ASP.NET", "ASP.NET") 

     objRequest.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip 

     Dim gaCookies As New CookieContainer() 

     Dim cookie1 As New Cookie("__asc", "f673f0d5152a823bc335f575d34") 
     cookie1.Domain = ".bseindia.com" 
     cookie1.Path = "/" 
     gaCookies.Add(cookie1) 

     Dim cookie2 As New Cookie("__auc", "f673f0d5152a823bc335f575d34") 
     cookie2.Domain = ".bseindia.com" 
     cookie2.Path = "/" 
     gaCookies.Add(cookie2) 

     Dim cookie3 As New Cookie("__utma", "253454874.280640365.1454519857.1454519865.1454519865.1") 
     cookie3.Domain = ".bseindia.com" 
     cookie3.Path = "/" 
     gaCookies.Add(cookie3) 

     Dim cookie4 As New Cookie("__utmb", "253454874.1.10.1454519865") 
     cookie4.Domain = ".bseindia.com" 
     cookie4.Path = "/" 
     gaCookies.Add(cookie4) 

     Dim cookie5 As New Cookie("__utmc", "253454874") 
     cookie5.Domain = ".bseindia.com" 
     cookie5.Path = "/" 
     gaCookies.Add(cookie5) 

     Dim cookie6 As New Cookie("__utmt", "1") 
     cookie6.Domain = ".bseindia.com" 
     cookie6.Path = "/" 
     gaCookies.Add(cookie6) 

     Dim cookie7 As New Cookie("__utmz", "253454874.1454519865.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)") 
     cookie7.Domain = ".bseindia.com" 
     cookie7.Path = "/" 
     gaCookies.Add(cookie7) 

     Dim cookie8 As New Cookie("_ga", "GA1.2.280640365.1454519857") 
     cookie8.Domain = ".bseindia.com" 
     cookie8.Path = "/" 
     gaCookies.Add(cookie8) 

     Dim cookie9 As New Cookie("_gat", "1") 
     cookie9.Domain = ".bseindia.com" 
     cookie9.Path = "/" 
     gaCookies.Add(cookie9) 

     Dim postStream As Stream = objRequest.GetRequestStream() 
     postStream.Write(postBytes, 0, postBytes.Length) 
     postStream.Flush() 
     postStream.Close() 

     LoginRes = objRequest.GetResponse() 
     sr = New IO.StreamReader(LoginRes.GetResponseStream) 

     ReadWebsite = sr.ReadToEnd() 

     sr.Close() 
     sr = Nothing 
     LoginRes.Close() 
     LoginRes = Nothing 
     objRequest = Nothing 
     Exit Function 

    Catch ex As Exception 
     ReadWebsite = Nothing 
    End Try 

注:(ビューステートとeventvalidationことなく日付では生の形式のデータ)

fmdate:20160130 eddate:20160205 hidCurrentDate:2016年2月5日 ctl00_ContentPlaceHolder1_hdnCode: txtDate:2016年4月1日 ddlCalMonthDiv3:1 ddlCalYearDiv3:2016 txtTodate:2016年4月2日 ddlCalMonthDiv4:2 ddlCalYearDiv4:2016 Hidden1: ctl00_ContentPlaceHolder1_Ge tQuote1_smartSearch:セキュリティ名/コード/ ID btnSubmit.xを入力します:55 btnSubmit.y:13

+1

なぜ質問が下降投票され、近く投票されたのかというコメントが提供されるのは本当に便利です。私は、この特定のトピックについて異なる質問があることを知っていますが、この状況とシナリオは異なります。私にとって、このフォーラムの目的は、あなたとあなたの周りの人が理解できないことに対する答えを得ることです。私は明確にすべての努力と私が書いたコードを言及したので、私は適切な研究がなければ何かを求めているようでもない。 –

+0

'formDataCollection.Add(" fmdate "、" 20160104 ")'とその下の行をチェックします。あなたが使った他のすべての日付は、異なる形式であるようです。 – Jeroen

+0

@Jeroenご意見ありがとうございます。私はインスペクタで見つけたものと同じフォーマットを使用しています。親切に私の更新されたコメントをチェックしてください。 Chromeからコピーした生のフォームデータを追加しました。 –

答えて

2

ブラウザでサイトを運営して、代わりに直接GET/POSTリクエストを発行し、ブラウザを制御するためのツールの使用を検討できます。これは、あなたの現在のアプローチよりも簡単で、わずかに堅牢であるかもしれません。

など。 Selenium Web Driver http://www.seleniumhq.org/projects/webdriver/

フォームフィールドの値を設定して(CSSスタイルセレクタを使用して適切なフィールドを見つけてください)、ボタンをクリックします。あなたはこれをすべて自動化し、ページのソースを取得することができます(残念ながら、JavaScriptが実行された後、完全なHTMLを取得できるとは思いませんが、必要な要素を取得するためにAPIを使用する可能性があります)。

APIドキュメント:http://seleniumhq.github.io/selenium/docs/api/dotnet/

1

あなたは確かに隠されたものとクッキーに保存されているASPセッション識別子を含むフォームのすべてのフィールドを含める必要があります。そうすれば、ブラウザの要求を完全にエミュレートし、目標を達成できます。あなたが提出しなければならないものを表示するには - http://pastebin.com/AsSABgU6

関連する問題