私は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
なぜ質問が下降投票され、近く投票されたのかというコメントが提供されるのは本当に便利です。私は、この特定のトピックについて異なる質問があることを知っていますが、この状況とシナリオは異なります。私にとって、このフォーラムの目的は、あなたとあなたの周りの人が理解できないことに対する答えを得ることです。私は明確にすべての努力と私が書いたコードを言及したので、私は適切な研究がなければ何かを求めているようでもない。 –
'formDataCollection.Add(" fmdate "、" 20160104 ")'とその下の行をチェックします。あなたが使った他のすべての日付は、異なる形式であるようです。 – Jeroen
@Jeroenご意見ありがとうございます。私はインスペクタで見つけたものと同じフォーマットを使用しています。親切に私の更新されたコメントをチェックしてください。 Chromeからコピーした生のフォームデータを追加しました。 –