C# 如何从aspx站点中获取数据,请使用doPostBack表单?
我正在尝试使用c#控制台应用程序抓取/刮取网站,获取初始页面不是问题,但我需要在单击具有#doPostBack操作的按钮时获取页面 我尝试使用这些设置,但这已从初始页面返回结果: 我更新我的代码C# 如何从aspx站点中获取数据,请使用doPostBack表单?,c#,web-scraping,C#,Web Scraping,我正在尝试使用c#控制台应用程序抓取/刮取网站,获取初始页面不是问题,但我需要在单击具有#doPostBack操作的按钮时获取页面 我尝试使用这些设置,但这已从初始页面返回结果: 我更新我的代码 var client1 = new RestClient("https://example.com"); var request1 = new RestRequest(Method.POST); IRestResponse init
var client1 = new RestClient("https://example.com");
var request1 = new RestRequest(Method.POST);
IRestResponse initialResponse = client1.Execute(request1);
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(initialResponse.Content);
var formData = new Dictionary<string, string>();
formData.Add("__EVENTTARGET", "ctl00$MainContentExample");
formData.Add("__EVENTARGUMENT", "");
formData.Add("ctl00$MainContent$CustomHiddenField", "");
formData.Add("__VIEWSTATEGENERATOR", "B5682C7D");
var divViewState = doc.DocumentNode
.SelectSingleNode("//input[@name='__VIEWSTATE']").Attributes[3].Value;
formData.Add("__VIEWSTATE", divViewState);
var divEventValidation = doc.DocumentNode
.SelectSingleNode("//input[@name='__EVENTVALIDATION']").Attributes[3].Value;
formData.Add("__EVENTVALIDATION", divEventValidation);
var client = new RestClient("https://example.com");
var request = new RestRequest("/methodName",Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Connection", "keep-alive");
var c = "";
var i = 0;
foreach (var cookie in initialResponse.Cookies)
{
if(i==0)
c += cookie.Name + "=" + cookie.Value + "; ";
else
c += cookie.Name + "=" + cookie.Value;
i++;
}
request.AddHeader("Cookie", c);
request.AddHeader("Accept-Encoding", "gzip, deflate, br");
request.AddHeader("Host", "example.com");
request.AddHeader("Cache-Control", "max-age=0");
request.AddHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Accept-Language", "en-US,en;q=0.9");
request.AddHeader("Content-Encoding", "utf-8");
var json = JsonConvert.SerializeObject(formData);
byte[] byteData = Encoding.UTF8.GetBytes(json);
request.AddHeader("Content-Length", byteData.Length.ToString())
request.AddParameter("undefined", byteData, ParameterType.RequestBody);
IRestResponse response2 = client.Execute(request);
var client1=新的RestClient(“https://example.com");
var request1=新的重新请求(Method.POST);
IRestResponse initialResponse=client1.Execute(request1);
HtmlDocument doc=新的HtmlDocument();
doc.LoadHtml(initialResponse.Content);
var formData=新字典();
添加(“\uuuu EVENTTARGET”,“ctl00$MainContentExample”);
添加(“\uuu EVENTARGUMENT”,”);
添加(“ctl00$MainContent$CustomHiddenField”,“”);
添加(“uuu VIEWSTATEGENERATOR”,“B5682C7D”);
var divViewState=doc.DocumentNode
.SelectSingleNode(//input[@name=''.\u VIEWSTATE'])。属性[3]。值;
formData.Add(“\uuu VIEWSTATE”,divViewState);
var divEventValidation=doc.DocumentNode
.SelectSingleNode(//input[@name=''\uU EVENTVALIDATION'])。属性[3]。值;
添加(“\uuu EVENTVALIDATION”,divEventValidation);
var client=新的RestClient(“https://example.com");
var request=new RestRequest(“/methodName”,Method.POST);
AddHeader(“缓存控制”、“无缓存”);
AddHeader(“连接”、“保持活动”);
var c=“”;
var i=0;
foreach(initialResponse.Cookies中的var cookie)
{
如果(i==0)
c+=cookie.Name+“=”+cookie.Value+“;”;
其他的
c+=cookie.Name+“=”+cookie.Value;
i++;
}
AddHeader(“Cookie”,c);
AddHeader(“接受编码”、“gzip、deflate、br”);
AddHeader(“Host”,“example.com”);
AddHeader(“缓存控制”,“最大年龄=0”);
AddHeader(“Accept”,“text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed exchange;v=b3”);
AddHeader(“用户代理”、“Mozilla/5.0(Windows NT 6.1;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/78.0.3904.108 Safari/537.36”);
request.AddHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
AddHeader(“接受语言”,“en-US,en;q=0.9”);
AddHeader(“内容编码”、“utf-8”);
var json=JsonConvert.SerializeObject(formData);
byte[]byteData=Encoding.UTF8.GetBytes(json);
request.AddHeader(“内容长度”,byteData.Length.ToString())
AddParameter(“未定义”,byteData,ParameterType.RequestBody);
IRestResponse response2=客户端。执行(请求);
使用RestRequest.AddParameter而不是RestRequest.AddHeader
您是否尝试过将浏览器的POST请求与控制台应用程序的POST请求进行比较,看看有什么不同?如果可以,可以将此信息添加到您的问题中吗?我从post请求的浏览器中获取值,[链接]并在我的应用程序中添加变量。但是在ResponseBy变量中,我得到的是初始页面,而不是分页结果。您是否尝试过使用web代理从浏览器中捕获POST请求,例如,然后使用fiddler从控制台应用程序中捕获POST请求,并对它们进行比较?问题中似乎没有足够的代码来重现问题。我从post请求中获取数据,并使用cookie创建now请求。但同样的,回应来自最初的页面。这是我现在的代码:你能提供一个你的问题的可复制的例子吗这里有一些提示我这样说是因为在你的邮递员检查中,你把这些属性列为参数。我认为这些是作为URL编码的参数传输的,由&符号分隔。标题位于有效负载的元数据中,并以不同的方式进行解释。返回初始页并显示错误:*“异常:捕获:”“”不是受支持的编码名称。有关定义自定义编码的信息,请参阅encoding.RegisterProvider方法的文档。“(System.ArgumentException)捕获到System.ArgumentException:“”不是受支持的编码名称。有关定义自定义编码的信息,请参阅encoding.RegisterProvider方法的文档。“**