首页 / ASP.NET / 刮分页的ASP.NET网站
刮分页的ASP.NET网站
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了刮分页的ASP.NET网站,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3741字,纯文字阅读大概需要6分钟。
内容图文
![刮分页的ASP.NET网站](/upload/InfoBanner/zyjiaocheng/662/0322adc53acc4598a5e4da66f9e10067.jpg)
我正在尝试抓取具有分页功能的基本asp.net目录网站.
该网站有50多个页面,在任一页面上最多包含10个页面链接.
我正在使用提琴手来帮助复制使用浏览器发布的所有参数,变量,表单字段,Cookie等.我在两个帖子之间看到的唯一区别是__EVENTVALIDATION值.
使用HttpWebRequest时,我始终具有相同的值,而通过浏览器,每次单击时其更改都相同.
使用HttpWebRequest,我可以正确获取前10个页面,但是随后的所有页面都将我重定向到主页.波纹管是回发JavaScript,前10个链接之后的链接始终相同.
javascript:__doPostBack('CT_Main_2$gvDirectorySearch$ctl53$ctl00$ctl11','')
为什么__EVENTVALIDATION不会随着HttpWebRequest更改而有任何想法?
解决方法:
从您的描述来看,这听起来像是一个防伪令牌,一个防伪令牌用于防止跨站点请求伪造(XSRF)攻击.
为了使站点能够利用防伪令牌,通常会在客户端的浏览器中设置Cookie,并且期望与发布表单中的参数具有相同的令牌.
为了克服它,您将需要发送服务器在后续请求中设置的令牌,还需要扫描HTML表单以查找相同的令牌,并包括该令牌.
编辑
因此,我进行了更深入的研究,并创建了一个ASP.NET WebForms站点,并尝试复制您的问题,但是无法…针对每个请求,我都设法提取了__EVENTVALIDATION字段.
不过,如果您发现其中任何有用的代码,这就是我的代码…
void Main()
{
string eventValidationToken = string.Empty;
var firstResponse = this.Get(@"http://localhost:7428/Account/Login");
firstResponse.FormValues["ctl00$MainContent$Email"] = "email@example.com";
firstResponse.FormValues["ctl00$MainContent$Password"] = "password";
string secondRequestPostdata = firstResponse.ToString();
var secondResponse = this.Post(@"http://localhost:7428/Account/Login", secondRequestPostdata);
Console.WriteLine (firstResponse.FormValues["__EVENTVALIDATION"]);
Console.WriteLine (secondResponse.FormValues["__EVENTVALIDATION"]);
}
public FormData Get(string uri)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:7428/Account/Login");
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
return new FormData(reader.ReadToEnd());
}
}
public FormData Post(string uri, string postContent)
{
byte[] formBytes = Encoding.UTF8.GetBytes(postContent);
var request = (HttpWebRequest)WebRequest.Create("http://localhost:7428/Account/Login");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = formBytes.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(formBytes, 0, formBytes.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
return new FormData(reader.ReadToEnd());
}
}
public class FormData
{
public FormData(string html)
{
this.Html = html;
this.FormValues = new Dictionary<string, string>();
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"] = "Log in";
}
public string Html { get; set; }
private string Extract(string id)
{
return Regex.Match(this.Html, @"id=""" + id + @""" value=""([^""]*)")
.Groups[1]
.Value;
}
public Dictionary<string, string> FormValues { get;set; }
public override string ToString()
{
var formData = this.FormValues.Select(form => HttpUtility.UrlEncode(form.Key) + "=" + HttpUtility.UrlEncode(form.Value));
return string.Join("&", formData);
}
}
内容总结
以上是互联网集市为您收集整理的刮分页的ASP.NET网站全部内容,希望文章能够帮你解决刮分页的ASP.NET网站所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。