C#的HttpWebRequest编程,支持带ViewState的网页POST请求
从网上找到了Jake Lin(Jake's Blog on 博客园)的一篇文章《.NET Compact Framework下HttpWebRequest开发》,在他的代码基础上稍加修改,可以编程模拟网页POST提交的效果。
在主程序上用了个循环,再将取出的网页用正则表达式把想要的信息取出来,最后成功地提取出了石油大学附中2010小升初的成绩表。
static private string SearchURL(string id)
{
try
{
//Get the ViewState and EventValidation
HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
request.Method ="GET";
request.KeepAlive =false;
//Get the response
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader =new System.IO.StreamReader(responseStream, Encoding.UTF8);
string srcString = reader.ReadToEnd();
//Get the ViewState
string viewStateFlag ="id=\"__VIEWSTATE\" value=\"";
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
int j = srcString.IndexOf("\"", i);
string viewState = srcString.Substring(i, j - i);
//Get the ViewState
string EventValidationFlag ="id=\"__EVENTVALIDATION\" value=\"";
i = srcString.IndexOf(EventValidationFlag) + EventValidationFlag.Length;
j = srcString.IndexOf("\"", i);
string eventValidation = srcString.Substring(i, j - i);
//Compose the URL
viewState = Uri.EscapeDataString(viewState);
eventValidation = Uri.EscapeDataString(eventValidation);
string strSearch = Uri.EscapeDataString("查询");
string formatString ="__VIEWSTATE={0}&__EVENTVALIDATION={1}&TextBox1={2}&Button1={3}";
string postString =string.Format(formatString, viewState, eventValidation, id,strSearch);
//Change to byte[]
byte[] postData = Encoding.ASCII.GetBytes(postString);
//Compose the new request
request = WebRequest.Create(URI) as HttpWebRequest;
request.Method ="POST";
request.KeepAlive =false;
request.ContentType ="application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
System.IO.Stream outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();
//Get the new response
response = request.GetResponse() as HttpWebResponse;
responseStream = response.GetResponseStream();
reader =new System.IO.StreamReader(responseStream);
srcString = reader.ReadToEnd();
return srcString;
}
catch (WebException we)
{
Console.WriteLine("Communication error,"+ we.Message +" please check your connectivity and try again.", "Error");
}
catch
{
Console.WriteLine("Unknow error.", "Error");
}
return null;
}
{
try
{
//Get the ViewState and EventValidation
HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;
request.Method ="GET";
request.KeepAlive =false;
//Get the response
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader =new System.IO.StreamReader(responseStream, Encoding.UTF8);
string srcString = reader.ReadToEnd();
//Get the ViewState
string viewStateFlag ="id=\"__VIEWSTATE\" value=\"";
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;
int j = srcString.IndexOf("\"", i);
string viewState = srcString.Substring(i, j - i);
//Get the ViewState
string EventValidationFlag ="id=\"__EVENTVALIDATION\" value=\"";
i = srcString.IndexOf(EventValidationFlag) + EventValidationFlag.Length;
j = srcString.IndexOf("\"", i);
string eventValidation = srcString.Substring(i, j - i);
//Compose the URL
viewState = Uri.EscapeDataString(viewState);
eventValidation = Uri.EscapeDataString(eventValidation);
string strSearch = Uri.EscapeDataString("查询");
string formatString ="__VIEWSTATE={0}&__EVENTVALIDATION={1}&TextBox1={2}&Button1={3}";
string postString =string.Format(formatString, viewState, eventValidation, id,strSearch);
//Change to byte[]
byte[] postData = Encoding.ASCII.GetBytes(postString);
//Compose the new request
request = WebRequest.Create(URI) as HttpWebRequest;
request.Method ="POST";
request.KeepAlive =false;
request.ContentType ="application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
System.IO.Stream outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();
//Get the new response
response = request.GetResponse() as HttpWebResponse;
responseStream = response.GetResponseStream();
reader =new System.IO.StreamReader(responseStream);
srcString = reader.ReadToEnd();
return srcString;
}
catch (WebException we)
{
Console.WriteLine("Communication error,"+ we.Message +" please check your connectivity and try again.", "Error");
}
catch
{
Console.WriteLine("Unknow error.", "Error");
}
return null;
}
----==== Email: slofslb (GTD) qq.com 请将(GTD)换成@ ====----
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:申龙斌的程序人生
---- 魔方、桥牌、象棋、游戏人生...
---- BASIC、C++、JAVA、C#、Haskell、Objective-C、Open Inventor、程序人生...
---- GTD伴我实现人生目标
---- 区块链生存训练
---- 用欧拉计划学Rust编程
---- 申龙斌的读书笔记(2011-2019)
----