2016-02-04 6 views
7

पर प्रभाव नहीं डालता है, मैं ऐसी वेबसाइट पर आया जो इतना आसान लगता है कि मुझे पूरा भरोसा था कि मैं HttpWebRequest का उपयोग करके अपना डेटा पढ़ सकूंगा और जीईटी और POST अनुरोध करने में सक्षम होगा। जीईटी अनुरोध ठीक काम कर रहे हैं। POST अनुरोध भी कोई त्रुटि उत्पन्न नहीं करता है लेकिन फिर भी पोस्ट फॉर्म डेटा का परिणाम लौटाए गए परिणामों पर कोई प्रभाव नहीं पड़ता है। पोस्ट किए गए फॉर्म डेटा में डेटा को तारीखों के अनुसार डेटा फ़िल्टर करने के लिए फ़ील्ड होते हैं, लेकिन इस तथ्य के बावजूद कि प्रत्येक आवश्यक डेटा पोस्ट किया गया डेटा वापस फ़िल्टर नहीं किया जाता है। मैंने प्रत्येक हेडर, फॉर्म डेटा जोड़ा है और अनुरोध के साथ कुकीज़ भी जोड़े हैं।HtppWebRequest का उपयोग करके पोस्ट किया गया फॉर्म डेटा

वेबपेज के लिए यूआरएल http://www.bseindia.com/corporates/Insider_Trading_new.aspx?expandable=0

यह एक बहुत ही साधारण वेबसाइट की तरह लगता है है, लेकिन के रूप में यह एक aspx पृष्ठ है और ViewState शामिल है और घटना मान्यता इसलिए यह उम्मीद थी बहुत आसान नहीं।

मेरा पहला कदम फिडलर का उपयोग करके साइट के जीईटी और पोस्ट का विश्लेषण करना था और यह मुझे आश्चर्यचकित करता है क्योंकि फिडलर इस यूआरएल के लिए किसी भी ट्रैफिक को कैप्चर नहीं कर रहा है। मैंने चार्ल्स की कोशिश की है लेकिन वह खुद ही इस यूआरएल को कैप्चर नहीं कर रहा है। अन्य तो यह यूआरएल फिडलर और चार्ल्स दोनों अन्य सभी को पकड़ रहे हैं। मैं यह भी उल्लेख करना चाहता हूं कि जब मैंने एचटीपीवेबआरक्वेट का उपयोग करके कंसोल एप्लिकेशन से यूआरएल को बुलाया तो फिडलर और चार्ल्स दोनों ने इसे कब्जा कर लिया लेकिन वे इसे क्रोम, फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर 11 से कैप्चर नहीं कर रहे हैं।

तो मैंने नेटवर्क गतिविधि का उपयोग करके विश्लेषण किया फ़ायरफ़ॉक्स में डेवलपर टूल और सब कुछ दिखाई दे रहा था जिसमें हेडर, पैरामीटर और कुकीज़ शामिल हैं। क्रोम में कोई कुकीज़ मौजूद नहीं थी। जब मैं HttpWebRequest बनाकर कुकीज़ का निरीक्षण करता हूं और प्रतिक्रिया प्राप्त करता हूं वहां कोई कुकी मौजूद नहीं होती है। तो इस वेबसाइट के साथ कुछ वास्तव में अजीब जा रहा है।

मैंने किसी भी तरह से अनुरोध बनाने और प्रतिक्रिया प्राप्त करने के लिए एक सरल कार्य करने में कामयाब रहा है। मैं जो कर रहा हूं वह यह है कि मैं पहले एक जीईटी अनुरोध बना रहा हूं और वेबसाइट स्ट्रिंग प्राप्त कर रहा हूं और इसे व्यूस्टेट, इवेंट वैलिडेशन इत्यादि निकालता हूं। मैं इस जानकारी का उपयोग दूसरे HttpWebRequest में उपयोग करने के लिए करता हूं जो एक पोस्ट है। अब सब कुछ ठीक काम करता है और मुझे प्रतिक्रिया मिलती है लेकिन उम्मीद के अनुसार नहीं। मैं चाहता हूं कि दो के बीच के रिकॉर्ड दिनांक दें और मैंने इन तिथियों को फॉर्म डेटा में निर्दिष्ट किया है लेकिन अभी भी POST अनुरोध फ़िल्टर किए गए डेटा को वापस नहीं करता है। मैंने उस फ़ंक्शन का उल्लेख किया है जिसे मैंने नीचे बनाया है और मैं वास्तव में किसी भी सुझाव की सराहना करता हूं कि यह क्यों हो रहा है और इसे कैसे संभाला जाए। यह समझने के लिए कि यह मेरे लिए एक चुनौती बन गई है क्योंकि मुझे समझ में नहीं आ रहा है कि यह सरल वेबसाइट फिडलर में क्यों दिखाई नहीं दे रही है। (यह जावास्क्रिप्ट पोस्टबैक का उपयोग करता है)

कोड लंबा और डरावना लग सकता है लेकिन यह बहुत आसान और सीधे आगे है।

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 

नोट: (viewstate और eventvalidation बिना दिनांकों कच्चे प्रपत्र डेटा)

fmdate: 20,160,130 eddate: 20,160,205 hidCurrentDate: 2016/02/05 ctl00_ContentPlaceHolder1_hdnCode: txtDate: 2016/04/01 ddlCalMonthDiv3: 1 ddlCalYearDiv3: 2016 txtTodate: 2016/04/02 ddlCalMonthDiv4: 2 ddlCalYearDiv4: 2016 Hidden1: ctl00_ContentPlaceHolder1_Ge tQuote1_smartSearch: दर्ज करें सुरक्षा नाम/कोड/आईडी btnSubmit.x: 55 btnSubmit.y: 13

+1

यह वास्तव में सहायक होगा कि एक टिप्पणी प्रदान की जाती है कि सवाल क्यों कम हो गया है और करीब के लिए वोट दिया गया है। मुझे पता है कि इस विशिष्ट विषय पर अलग-अलग प्रश्न हैं लेकिन यह स्थिति और परिदृश्य अलग है। मेरे लिए इस मंच का उद्देश्य उस चीज़ के उत्तर प्राप्त करना है जिसे आप और आपके आस-पास के लोगों द्वारा नहीं समझते हैं। मैंने स्पष्ट रूप से सभी प्रयासों और कोड का उल्लेख किया है जो मैंने लिखा है, इसलिए यह भी ऐसा नहीं है कि मैं उचित शोध के बिना कुछ भी पूछ रहा हूं। –

+0

मैं जांचता हूं: 'formDataCollection.Add ("fmdate", "20160104")' और इसके नीचे की रेखा। आपके द्वारा उपयोग की जाने वाली सभी अन्य तिथियां एक अलग प्रारूप में प्रतीत होती हैं। – Jeroen

+0

@Jeroen आपकी टिप्पणियों के लिए धन्यवाद। मैं उसी प्रारूप का उपयोग कर रहा हूं जिसे मैंने इंस्पेक्टर में पाया था। कृपया मेरी अद्यतन टिप्पणियों की जांच करें। मैंने क्रोम से कॉपी किए गए कच्चे फॉर्म डेटा को जोड़ा है। –

उत्तर

2

आप किसी ब्राउज़र में साइट चल रहा है और ब्राउज़र के बजाय सीधे प्राप्त/पोस्ट अनुरोध पत्र जारी करने को नियंत्रित करने के लिए एक उपकरण के उपयोग पर विचार कर सकता है। यह आपके वर्तमान दृष्टिकोण की तुलना में आसान और थोड़ा अधिक मजबूत हो सकता है।

उदा। सेलेनियम वेब चालक http://www.seleniumhq.org/projects/webdriver/

आप पृष्ठ लोड करेंगे, फॉर्म फ़ील्ड के मान सेट करें (उचित फ़ील्ड ढूंढने के लिए सीएसएस शैली चयनकर्ताओं का उपयोग करके) और फिर बटन क्लिक करें। जावास्क्रिप्ट चलाने के बाद, आप सभी को स्वचालित कर सकते हैं और पेज स्रोत प्राप्त कर सकते हैं (दुर्भाग्य से मुझे नहीं लगता कि आप वर्तमान स्थिति में पूर्ण एचटीएमएल प्राप्त कर सकते हैं, लेकिन संभावित रूप से आप तत्वों को प्राप्त करने के लिए एपीआई का उपयोग कर सकते हैं)।

API दस्तावेज़: http://seleniumhq.github.io/selenium/docs/api/dotnet/

1

आप वास्तव में छिपा लोगों और एएसपी सत्र पहचानकर्ता कि कुकीज़ में संग्रहीत किया जाता सहित रूप से सभी क्षेत्रों, शामिल होना चाहिए। इस तरह आप पूरी तरह से ब्राउज़र के अनुरोध का अनुकरण करते हैं और अपना लक्ष्य प्राप्त करते हैं। यह दिखाने के लिए कि आपको क्या सबमिट करना है - http://pastebin.com/AsSABgU6

संबंधित मुद्दे