代码改变世界

取远程网页数据 WebClient,HttpWebRequest

2008-11-10 11:29  旦旦  阅读(4692)  评论(21编辑  收藏  举报

修改版,由于取的网站多对应加了修正.我就没发新贴了.
1,同一个用户(或浏览器)的不同请求共享同一个变量储存空间,就称其为Session(会话)
Session内的变量保存在服务器中。
用SessionID以区别不同的Session(会话),因为不是一个用户在请求。

2,众所周知HTTP是无连接的,所以服务端和客户端交流时协商好使用些什么标志来保持Session(会话)状态,于是出现了Cookie(可能你更熟悉Cookie的其他用途)。这便是HTTP协议的状态保持机制,是标准,所有的浏览器都应该支持。为什么不用IP标识?呵呵,因为有人用代理啊,早期的代理服务器是很普遍的连到Internet的方式。

So, 在Cookie中放置一个类似于SessionID的Value,同一个客户端在与服务端交互式,该ID便被来回传递,服务端便可依此建立若干变量,就是Session变量。不同的客户端因为SessionID不同,所以访问服务器时得到的Session变量就不同。


验证原理服务器的Session会在客户端产生临时COOKIESS.
APS.NET网站就会生成ASP.NET_SessionId=hjguqsn34ai3h3aattozr2fy
PHP,JSP网站生成的JSESSIONID=4D9D2F0B65C77385C43CE4EE22D0536E
就是看什么服务器而以
取了登陆成功后的COOKIESS,只要电脑不清空COOKIESS,那就可以做成免登陆了.
换句话A电脑的COOKIESS,不能在B电脑上用.
工具WPE之类的网络探嗅器.
先记录一次成功登陆时所发送的信息.
找信息中的POST,和GET
p1.jpgp2.jpg

这网上打资料都没有完整的资料特别是验证码登陆。

其实我这都是从网上收集整理出来的的。做的不是太好。

使用的两个WebClient,HttpWebRequest。NET的类分别做出一个静态类和动态类。

静态类GetHtml 支持一般的网页取数据和POET提交,但不能支持验证码,自动识别网页编码也可以手动输入网页编码。不过最好是手动输入那样会让程序少做运行代码。

System.Collections.Specialized.NameValueCollection PostVars =new System.Collections.Specialized.NameValueCollection()
PostVars.Add("uid","name");
PostVars.Add("pwd","123456");

string tmphtml= GetStrHtmlPost(url,PostVars);

动态类PostWeb 支持验证码、验证用户、登陆过会产生COOKIES字符串,第二次运行程序时可通过COOKIES而不用再次登陆。

PostWeb web=new PostWeb();

web.GetCode(验证码地址);

string tmplogin=web.LoginPost("http://www.mystand.com.cn/");

if(tmplogin.Contains(条件))

{

string cookie= web.cookieHeader;//保存到文件中下次直接付到类就可免登陆

web.GetPage("http://www.mystand.com.cn/", "http://www.mystand.com.cn/");

}

 

PostWeb web=new PostWeb();

web.cookieHeader=cookie;//把保存文件中的cookie付到类中

web.GetPage("http://www.mystand.com.cn/", "http://www.mystand.com.cn/");

Code