当前位置: 首页 > 编程语言 > C#

使用分页刮取ASP.NET网站分享

时间:2023-04-10 20:34:24 C#

C#学习教程:使用分页抓取ASP.NET网站该站点有50多个页面,并且在任何一页上最多包含10个分页链接。我正在使用fiddler来帮助复制使用浏览器发布的所有参数、变量、表单字段、cookie等。我在这两个帖子之间看到的唯一区别是__EVENTVALIDATION值。使用HttpWebRequest我总是有相同的值,而通过浏览器它每次点击都会改变。使用HttpWebRequest我正确地获得了前10页,但所有后续页面都将我重定向到主页。Bellow是回发javascript,对于前10个链接之后的链接始终相同。javascript:__doPostBack('CT_Main_2$gvDirectorySearch$ctl53$ctl00$ctl11','')知道为什么__EVENTVALIDATION不会随HttpWebRequest改变吗?根据您的描述,它听起来像是一种防伪令牌,用于防止跨站点请求伪造(XSRF)攻击。对于使用防伪令牌的站点,它通常会在客户端的浏览器中设置一个cookie,并且它会期望使用与发布的表单中的参数相同的令牌。为了克服它,您需要在后续请求中发送服务器设置的令牌,您还需要扫描相同令牌的HTML表单,并将其包含在内。编辑所以我深入挖掘并创建了一个ASP.NETWebForms站点并尝试复制您的问题,但无法设法在每个请求中提取__EVENTVALIDATION字段。不过,如果大家觉得有用的话,这是我的代码。。。以上是C#学习教程:使用分页抓取全部内容的ASP.NET网站分享,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注—voidMain(){stringeventValidationToken=string.Empty;varfirstResponse=this.Get(@"http://localhost:7428/Account/Login");firstResponse.FormValues["ctl00$MainContent$Email"]="email@example.com";firstResponse.FormValues["ctl00$MainContent$Password"]="密码";字符串secondRequestPostdata=firstResponse.ToString();varsecondResponse=this.Post(@"http://localhost:7428/Account/Login",secondRequestPostdata);Console.WriteLine(firstResponse.FormValues["__EVENTVALIDATION"]);Console.WriteLine(secondResponse.FormValues["__EVENTVALIDATION"]);}publicFormDataGet(stringuri){HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create("http://localhost:7428/Account/Login");使用(HttpWebResponseresponse=(HttpWebResponse)request.GetResponse())使用(Streamstream=response.GetResponseStream())使用(StreamReaderreadr=newStreamReader(stream)){returnnewFormData(reader.ReadToEnd());}}publicFormDataPost(stringuri,stringpostContent){byte[]formBytes=Encoding.UTF8.GetBytes(postContent);varrequest=(HttpWebRequest)WebRequest.Create("http://localhost:7428/Account/Login");request.Method="POST";request.ContentType="application/x-www-form-urlencoded";request.ContentLength=formBytes.Length;使用(Streamstream=request.GetRequestStream()){stream.Write(formBytes,0,formBytes.Length);}使用(HttpWebResponseresponse=(HttpWebResponse)request.GetResponse())使用(Streamstream=response.GetResponseStream())使用(StreamReaderreader=newStreamReader(stream)){}}publicclassFormData{publicFormData(stringhtml){this.Html=html;this.FormValues=newDictionary();this.FormValues["__EVENTTARGET"]=this.Extract(@"__EVENTTARGET");this.FormValues["__EVENTARGUMENT"]=this.Extract(@"__EVENTARGUMENT");this.FormValues["__VIEWSTATE"]=this.Extract(@"__VIEWSTATE");this.FormValues["__VIEWSTATEGENERATOR"]=this.Extract(@"__VIEWSTATEGENERATOR");this.FormValues["__EVENTVALIDATION"]=this.Extract(@"__EVENTVALIDATION");this.FormValues["ctl00$MainContent$Email"]=string.Empty;this.FormValues["ctl00$MainContent$Password"]=string.Empty;this.FormValues["ctl00$MainContent$ctl05"]="登录";}publicstringHtml{get;set;}privatestringExtract(stringid){returnRegex.Match(this.Html,@"id="""+id+@"""value=""([^""]*)").Groups[1].Value;}publicDictionaryFormValues{get;set;}publicoverridestringToString(){varformData=this.FormValues.Select(form=>HttpUtility.UrlEncode(form.Key)+"="+HttpUtility.UrlEncode(form.Value));returnstring.Join("&",formData);}}本文收集自网络转载,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处: