C# C中http GET方法、计算参数和POST方法之间的网页刷新#

C# C中http GET方法、计算参数和POST方法之间的网页刷新#,c#,.net,post,web-scraping,html-agility-pack,C#,.net,Post,Web Scraping,Html Agility Pack,我有一个页面需要解析(刮取),但首先我必须通过控制措施。 我设法计算了一些控件号,当我试图通过POST方法参数传递这些控件号和其他内容时,我认为页面会自动刷新并生成新的控件号,这样我计算的控件号就不会通过检查,我无法访问所需的页面 首先,我使用HtmlAgilityPack方法获取页面,并获取这些控件号的值: HtmlWeb web = new HtmlWeb(); HtmlDocument mainPage = web.Load(url); int controlNumber = FindCo

我有一个页面需要解析(刮取),但首先我必须通过控制措施。
我设法计算了一些控件号,当我试图通过POST方法参数传递这些控件号和其他内容时,我认为页面会自动刷新并生成新的控件号,这样我计算的控件号就不会通过检查,我无法访问所需的页面

首先,我使用HtmlAgilityPack方法获取页面,并获取这些控件号的值:

HtmlWeb web = new HtmlWeb();
HtmlDocument mainPage = web.Load(url);
int controlNumber = FindControlNumber();
紧接着,我尝试通过POST方法传递计算出的数字:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string data = @"id=" + id + "&controlNumber=" + controlNumber;
byte[] dataStream = Encoding.UTF8.GetBytes(data);
request.ContentLength = dataStream.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(dataStream, 0, dataStream.Length);
newStream.Close();
HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(webResponse.GetResponseStream());
string html = sr.ReadToEnd();
但是,不是导航到所需的页面,而是在初始页面显示消息“错误的控制编号”


我做错了什么?

真的,我唯一需要做的就是设置cookies,并使用WebRequest和WebResponse,而不是HPA的HtmlWeb。
下面是有效的代码:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.KeepAlive = true;
        CookieContainer cookies = new CookieContainer(); // instantiate cookie container

        request.CookieContainer = cookies;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var stream = response.GetResponseStream();

        // Calculate control number...

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        string data = @"id=" + id + "&controlNumber=" + controlNumber;
        byte[] dataStream = Encoding.UTF8.GetBytes(data);
        request.ContentLength = dataStream.Length;

        request.CookieContainer = cookies;

        Stream newStream = request.GetRequestStream();
        newStream.Write(dataStream, 0, dataStream.Length);
        newStream.Close();
        HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
        StreamReader sr = new StreamReader(webResponse.GetResponseStream());
        string html = sr.ReadToEnd();

controlNumber的值是多少?controlNumber是3位整数。我相信它的计算是正确的。让我担心的是,可能是连接或会话过期,或者类似的事情,迫使页面重新加载并生成新的控件号,这会使计算出的控件号值变旧。您确定要传递的控件号确实有效吗?如果是刮削,您确定没有任何cookie或任何其他重要的标题丢失吗?或者可能是额外的POST参数?这就是我要看的,你的代码似乎很适合获取页面内容。以下是FireBug的结果:响应头HTTP/1.1 200 OK代理连接:保持活动连接:保持活动内容长度:12463 Via:1.1 ISA日期:周二,2013年7月30日08:46:43 GMT内容类型:text/html;charset=windows-1250服务器:IBM_HTTP_服务器保持活动状态:超时=15,max=9999内容语言:hr hr请求头POST/path HTTP/1.1主机:主机名用户代理:Mozilla/5.0(windows NT 5.2;rv:22.0)Gecko/20100101 Firefox/22.0接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8接受语言:en-US,en;q=0.5接受编码:gzip,deflate Referer:fullpath Cookie:JSESSIONID=0000jycepelagcexgxwt9pmntfj:13fshcske连接:保持活动状态