利用HttpWebRequest和HttpWebResponse获取Cookie

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java。

C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助。现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜!

这是我们学校图书馆的登录界面的body:

<body onload="bodyload()">
<form name="aspnetForm" method="post" action="login.aspx?ReturnUrl=%2fuser%2fuserinfo.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE0MjY3MDAxNzcPZBYCZg9kFgoCAQ8PFgIeCEltYWdlVXJsBRt+XGltYWdlc1xoZWFkZXJvcGFjNGdpZi5naWZkZAICDw8WAh4EVGV4dAUt5bm/5Lic5bel5Lia5aSn5a2m5Zu+5Lmm6aaG5Lmm55uu5qOA57Si57O757ufZGQCAw8PFgIfAQUcMjAxM+W5tDA35pyIMjHml6UgIOaYn+acn+aXpWRkAgQPZBYEZg9kFgQCAQ8WAh4LXyFJdGVtQ291bnQCCBYSAgEPZBYCZg8VAwtzZWFyY2guYXNweAAM55uu5b2V5qOA57SiZAICD2QWAmYPFQMTcGVyaV9uYXZfY2xhc3MuYXNweAAM5YiG57G75a+86IiqZAIDD2QWAmYPFQMOYm9va19yYW5rLmFzcHgADOivu+S5puaMh+W8lWQCBA9kFgJmDxUDCXhzdGIuYXNweAAM5paw5Lmm6YCa5oqlZAIFD2QWAmYPFQMUcmVhZGVycmVjb21tZW5kLmFzcHgADOivu+iAheiNkOi0rWQCBg9kFgJmDxUDE292ZXJkdWVib29rc19mLmFzcHgADOaPkOmGkuacjeWKoWQCBw9kFgJmDxUDEnVzZXIvdXNlcmluZm8uYXNweAAP5oiR55qE5Zu+5Lmm6aaGZAIID2QWAmYPFQMbaHR0cDovL2xpYnJhcnkuZ2R1dC5lZHUuY24vAA/lm77kuabppobpppbpobVkAgkPZBYCAgEPFgIeB1Zpc2libGVoZAIDDxYCHwJmZAIBD2QWBAIDD2QWBAIBDw9kFgIeDGF1dG9jb21wbGV0ZQUDb2ZmZAIHDw8WAh8BZWRkAgUPZBYGAgEPEGRkFgFmZAIDDxBkZBYBZmQCBQ8PZBYCHwQFA29mZmQCBQ8PFgIfAQWlAUNvcHlyaWdodCAmY29weTsyMDA4LTIwMDkuIFNVTENNSVMgT1BBQyA0LjAxIG9mIFNoZW56aGVuIFVuaXZlcnNpdHkgTGlicmFyeS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyIC8+54mI5p2D5omA5pyJ77ya5rex5Zyz5aSn5a2m5Zu+5Lmm6aaGIEUtbWFpbDpzenVsaWJAc3p1LmVkdS5jbmRkZLjlteIKM9K+qxtjyYb5tuBVJpjN" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms[‘aspnetForm‘];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

<script src="/WebResource.axd?d=aUGQsxtqBlPCYSLCotjFAgPO7LVRMgZpwdLaRZWG0_6ihSU9GEuAV24Gz4casq4yN9Ey0mGcWUzl2dmajXQUJps-v9o1&amp;t=635090739058261250" type="text/javascript"></script>

<script src="/WebResource.axd?d=ID2SHi1EXLOLcv8QZV5z65ofzpfIKQP67HbOJyDtBOZGRBT6-d--Al86w9CE4E-H3dCnvuE2ZcqgPXnod-92Tv-ZeIo1&amp;t=635090739058261250" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
//]]>
</script>

<div>

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBQLuwfDDAwKOmK5RApX9wcYGAsP9wL8JAqW86pcI915B4NnPkyRLP7m6znmysZd+180=" />
</div>
<input name="ctl00$ContentPlaceHolder1$txtlogintype" type="hidden" id="ctl00_ContentPlaceHolder1_txtlogintype" value="0" />
<div id="Login" class="clearFix">
    <div class="LoginTitle">
        登录我的图书馆
    </div>

    <div class="LeftLogin">
            <div class="LoginDiv">

                <div class="loginContent">
                    <div class="loginInfo">
                        <span class="leftInfo">图书证号:</span>
                        <span class="rightInfo">
                            <input name="ctl00$ContentPlaceHolder1$txtUsername_Lib" type="text" id="ctl00_ContentPlaceHolder1_txtUsername_Lib" class="txtInput" autocomplete="off" /><span id="ctl00_ContentPlaceHolder1_rfv_UserName_Lib" style="color:Red;display:none;">请输入证号</span>
                        </span>
                    </div>
                    <div class="loginInfo">
                        <span class="leftInfo">密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码:</span>
                        <span class="rightInfo">
                            <input name="ctl00$ContentPlaceHolder1$txtPas_Lib" type="password" id="ctl00_ContentPlaceHolder1_txtPas_Lib" class="txtInput" /><span id="ctl00_ContentPlaceHolder1_rfv_Password_Lib" style="color:Red;display:none;">请输入密码</span>
                        </span>
                    </div>
                    <div>
                        <span id="ctl00_ContentPlaceHolder1_lblErr_Lib"></span>
                    </div>
                    <div class="loginInfo">
                        <input type="submit" name="ctl00$ContentPlaceHolder1$btnLogin_Lib" value="登录" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$btnLogin_Lib&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_ContentPlaceHolder1_btnLogin_Lib" class="btn" />
                        <input type="button" value="清空" onclick="rset()" class="btn"/>
                    </div>
                </div>
            </div>
        </div>
        <div class="RightDescription">
        <img src="images/pin.gif" />  <br/>
        1.  如果您使用的是公共电脑,请在使用完毕后,务必退出登录,以保安全。<br />
        2.  首次登录,请先<a href="changepas.aspx">修改初始密码</a>。
        </div>

</div>

<script type="text/javascript">
//<![CDATA[
var Page_Validators =  new Array(document.getElementById("ctl00_ContentPlaceHolder1_rfv_UserName_Lib"), document.getElementById("ctl00_ContentPlaceHolder1_rfv_Password_Lib"));
//]]>
</script>

<script type="text/javascript">
//<![CDATA[
var ctl00_ContentPlaceHolder1_rfv_UserName_Lib = document.all ? document.all["ctl00_ContentPlaceHolder1_rfv_UserName_Lib"] : document.getElementById("ctl00_ContentPlaceHolder1_rfv_UserName_Lib");
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.controltovalidate = "ctl00_ContentPlaceHolder1_txtUsername_Lib";
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.focusOnError = "t";
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.errormessage = "请输入证号";
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.display = "Dynamic";
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.initialvalue = "";
var ctl00_ContentPlaceHolder1_rfv_Password_Lib = document.all ? document.all["ctl00_ContentPlaceHolder1_rfv_Password_Lib"] : document.getElementById("ctl00_ContentPlaceHolder1_rfv_Password_Lib");
ctl00_ContentPlaceHolder1_rfv_Password_Lib.controltovalidate = "ctl00_ContentPlaceHolder1_txtPas_Lib";
ctl00_ContentPlaceHolder1_rfv_Password_Lib.focusOnError = "t";
ctl00_ContentPlaceHolder1_rfv_Password_Lib.errormessage = "请输入密码";
ctl00_ContentPlaceHolder1_rfv_Password_Lib.display = "Dynamic";
ctl00_ContentPlaceHolder1_rfv_Password_Lib.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
ctl00_ContentPlaceHolder1_rfv_Password_Lib.initialvalue = "";
//]]>
</script>

<script type="text/javascript">
//<![CDATA[

var Page_ValidationActive = false;
if (typeof(ValidatorOnLoad) == "function") {
    ValidatorOnLoad();
}

function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    else {
        return true;
    }
}
        //]]>
</script>
</form>
</body>

最主要的是<form></form>里面的内容,也就是我们要提交的表单。要实现登录,就要将表单提交上去,当然,在这之前,我们先要填充该表单。

首先,我们需要提取出需要填充的内容。直接看源代码,我们已经知道需要填充什么数据了,但注意到我们要提交的表单需要填充__VIEWSTATE和 __EVENTVALIDATION,而它们的表单值每次都不一样,所以我们需要提取出来,而不是自己填充。

ViewState是ASP.NET用来保存控件状态信息的。在ASP时代,一个HTML控件的值,比如input控件值会在我们把表单提交到服务器,页面再刷新回来的时候自动清空掉,这是因为web的无状态导致的,所以服务端每次把HTML输出到客户端后就不再与客户端有任何联系。

但是ASP.NET解决了这个问题:当我们在写一个ASP.NET表单的时候,如果标明"form runat = server",那么ASP.NET就会自动在输出时给页面添加一个隐藏域:

<input type = "hidden" name = "_VIEWSTATE" value = "">

有了这个隐藏域,页面里其他所有控件的状态,包括页面本身的一些状态都会保存到这个控件值里,这样每次页面提交时就会一起提交到后台,然后由ASP.NET对其中的值进行解码,最后输出时再根据这个值来恢复各个控件的状态。 
      在上面得到的网页源码中,我么可以看到,_VIEWSTATE的值非常复杂,根本无法阅读,就像是加密后的值一样,但实际上并没有任何加密,仅仅是因为各个控件和页面的状态都存入适当的对象里面,然后把该对象序列化并进行一次Base64编码,最后直接赋值给viewstate控件。所谓的Base64就是一种基于64个可打印字符来表示二进制数据的表示方法,通常用于处理像是MIME的Email或者XML中存储的一些复杂数据,在HTTP环境中专门用来传递较长的标识信息,用作HTTP表单和HTTP GET URL中的参数。

当然,我们会想到:为什么不用Session来保存这些数据呢?因为Session值是保存在服务器内存上的,如果大量使用Session将导致服务器负担加重,而ViewState只是将数据存入到页面隐藏控件里,不会占用服务器资源。所以,我们可以将一些需要服务器保存的变量和对象保存到ViewState里,而Session只应该用在需要跨页面并且与每个访问用户相关的变量和对象存储上。最重要的一点,Session默认情况下20分钟就过期了,但ViewState永远不会过期。

ViewState并不能存储所有的.NET数据类型,它仅仅支持String , Integer, Boolean, Array, ArrayList, HashTable,以及一些自定义的类型。

虽然使用ViewState对服务器内存是友好的,但使用ViewState会增加页面HTML的输出量,像是上面那么一大串的字符串,这样带宽就会被占用得更多。而且ViewState是不安全的,因为所有的ViewState都存储在同一个地方,我们完全可以通过查看源码来找到这个值,只要经过转换就可以获取其中的对象和变量值。

为了解决这个问题,ASP.NET提供了两种方案:防篡改和加密。这些措施是题外话了,大家有兴趣的可以自己研究下。

__EVENTVALIDATION是ASP.NET2.0新增加的特性(很遗憾,我们学校图书馆使用的就是ASP.NET 2.0,已经断代了很久了,但这种公共管理网站是不会更新的,除非哪天它出现了严重问题),它用于对PostBack的值进行验证,确保其是合法的值。他的工作原理是这样的:在页面render的时候,ASP.NET会对控件所有可能的值以及控件的UniqueID进行Hash计算,得到一个值,所有需要Render的控件都会有一个这样的计算值,并且组成一个列表,然后放在隐藏字段__EVENTVALIDATION中,页面Render后,就会对该字段的额内容进行解包,重新计算并对比Hash值是否一致。这样是为了防范一些模拟的post攻击,但问题也就来了:如果页面非常大或者网速加载较慢,用户在没有加载到该字段的时候就提交,会发数据不完整,那么就会出错。

通过上面的内容,我们已经明白:要使表单提交成功,我们就要得到这两个值。

        private List<string> GetElementContent(string url, string elementName, string subElement)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
            string content = reader.ReadToEnd();
            reader.Close();
            responseStream.Close();

            StringBuilder regexStr = new StringBuilder("(?is)<");
            regexStr.Append(elementName).Append("[^>]*?").Append(subElement).Append(@"=([‘""\s]?)([^‘""\s]+)\1[^>]*?>");
            Regex regex = new Regex(regexStr.ToString());
            MatchCollection match = regex.Matches(content);
            List<string> values = new List<string>();
            foreach (Match m in match)
            {
                values.Add(m.Groups[2].Value);
            }
            return values;
        }

该方法就是利用正则表达式对HTML页面中的节点内容进行提取。首先,我们得先得到该页面,于是需要通过HttpWebRequest发出请求,然后由HttpWebResponse得到响应该请求后返回的页面,接着就是利用正则表达式提取了。

如果有心想搞Web的同学,正则表达式一定要懂得写。如果对正则表达式的使用得心应手的话,在实际编码中就会非常方便。

我们来看看这个方法是如何使用的:

List<string> values = GetElementContent(url, "input", "value");
 List<string> names = GetElementContent(url, "input", "name");

这样我们就得到了表单中所有要提交的元素的name和value了。

接着就是自动填充表单了:

Dictionary<string, string> postPair = new Dictionary<string, string>();
for (int i = 0, len = names.Count(); i < len; i++)
{
     postPair.Add(names.ElementAtOrDefault(i), values.ElementAtOrDefault(i));
}

利用一个字典,将对应的name和value放进去。当然,要想登录,我们还是得需要用户名和密码:

SetParams("ctl00$ContentPlaceHolder1$txtUsername_Lib", "***", postPair);
SetParams("ctl00$ContentPlaceHolder1$txtPas_Lib", "***", postPair);

SetParams()方法的实现如下:

private void SetParams(string element, string content, Dictionary<string, string> dictionary)
        {
            for (int i = 0, len = dictionary.Keys.Count(); i < len; i++)
            {
                string key = dictionary.Keys.ElementAtOrDefault(i);
                if (key == element)
                {
                    dictionary[key] = content;
                }
            }
        }

这样的值我们是不能提交上去的,还需要进行URL编码:

private void UrlEncodeParams(Dictionary<string, string> formParams)
        {
            for (int i = 0, len = formParams.Keys.Count(); i < len; i++)
            {
                string key = formParams.Keys.ElementAtOrDefault(i);
                formParams[key] = HttpUtility.UrlEncode(formParams[key], Encoding.GetEncoding("GBK"));
            }
        }

然后就是Post该表单了:

private string PostForm(string url, Dictionary<string, string> form)
        {
            CookieContainer cookies = new CookieContainer();
            string postStr = "";
            foreach (string key in form.Keys)
            {
                postStr += key + "=" + form[key] + "&";
            }
            byte[] postData = Encoding.ASCII.GetBytes(postStr.Substring(0, postStr.Length - 1));
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.AllowAutoRedirect = false;
            request.ContentType = "application/x-www-form-urlencoded;charset=gbk";
            request.CookieContainer = new CookieContainer();
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11";
            request.ContentLength = postData.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(postData, 0, postData.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);

            string cookie = response.Headers.Get("Set-Cookie");
            string resultPage = reader.ReadToEnd();
            string html = getHtml(GetCookieName(cookie), GetCookieValue(cookie));
            reader.Close();
            responseStream.Close();
            return html;
        }

该方法才是我们的重点! 
       我们要先定义一个CookieContainer用来存储得到的Cookie。提交的表单字符串的形式应该是这样:name1=value1&name2=value2&...。同样,提交上去的时候,我们也是需要对该字符串进行编码。

重点在于接下来的HttpWebRequest和HttpWebResponse的使用。

首先,我们的HttpRequest应该是post方式,可以通过request.Method进行设置。request.AllowAutoRedirect=false是为了防止重定向,很多网站都是登录后就马上进行重定向,这样我们就无法得到登录时的Cookie,于是需要禁止该重定向。然后就是request.ContentType = "application/x-www-form-urlencoded;charset=gbk"。Content-Type就是所谓的内容类型,它是HTTP请求的头部信息,用于指定消息的类型,默认是text/plain,即纯文本,这里是application/x-www-form-urlencode,即指定是使用HTTP的POST方式提交表单。然后我们再指定请求的CookieContainer为刚才定义的CookieContainer。然后就是指定代理:request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"。用户代理字符串用于标识请求的浏览器类型和版本,操作系统,使用语言等各种信息,主要就是用于抓包。采用POST方式提交,都需要指定内容长度:request.ContentLength = postData.Length。

接着我们再向请求流中写入数据:

Stream requestStream = request.GetRequestStream();
requestStream.Write(postData, 0, postData.Length);
requestStream.Close();

得到响应后,我们就可以得到响应中的Cookie:

string cookie = response.Headers.Get("Set-Cookie");

通常在响应的头信息里就包含了Cookie,它就是Set-Cookie的值。如果想要知道HTTP的头信息有哪些,可以在谷歌浏览器中按F12进行查看,但记得,要想捕捉这些信息,必须在未登录前就按F12,否则谷歌浏览器是不会跟踪这些信息的。 
       然后我们就可以利用该Cookie登录网站并且得到登录后的网站内容:

string html = getHtml(GetCookieName(cookie), GetCookieValue(cookie));

        private string GetCookieValue(string cookie)
        {
            Regex regex = new Regex("=.*?;");
            Match value = regex.Match(cookie);
            string cookieValue = value.Groups[0].Value;
            return cookieValue.Substring(1, cookieValue.Length - 2);
        }

        private string GetCookieName(string cookie)
        {
            Regex regex = new Regex("sulcmiswebpac.*?");
            Match value = regex.Match(cookie);
            return value.Groups[0].Value;
        }

        private string getHtml(string name, string value)
        {
            CookieCollection cookies = new CookieCollection();
            cookies.Add(new Cookie(name, value));
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://222.200.98.171:81/user/bookborrowed.aspx");
            request.Method = "GET";
            request.Headers.Add("Cookie", name + "=" + value);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            return reader.ReadToEnd();
        }

我们之前得到的cookie字符串中其实就是一个键值对字符串,我们还是需要根据正则表达式提取出cookie的name和value,然后我们定义一个CookieContainer,往里面添加我们捕捉到的Cookie,接着就是需要Cookie的网页发送一个带有该Cookie的HTTP请求。 
     方法很简单,只要合理的使用正则表达式,我们就可以方便的对网页进行处理,而不需要什么第三方的库。

每个程序员都需要学会自己造轮子而不是一味的追求轮子,就算是其他语言的轮子,我们依然可以用自己熟悉的语言实现出来,毕竟所有的语言背后的实现思想都是一样的,尤其是面向对象语言,它们都是相互借鉴的,交叉处实在是太多了,C#更是在参考java的基础上创造出来的,有什么理由是java可以C#不可以呢?(有是有,但我们可以模拟)

时间: 2024-08-06 21:17:15

利用HttpWebRequest和HttpWebResponse获取Cookie的相关文章

利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助.现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜! 这是我们学校图书馆的登录界面的body: <body onload="bodyload()"> <for

C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章利用了 HttpWebRequest 和 HttpWebResponse 模拟登录了有验证码的网站. 程序设计的界面很简单,三个TextBox分别输入用户名.密码和验证码,一个Image控件显示从网站请求到的验证码图片,还有两个按钮,一个换验证码,一个登录. 写程序前,先用浏览器的开发者工具观察下登

利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

需要用程序模拟登录一个网站,登录的时候需要填写验证码. 设计的界面很简单: 写程序前,先用浏览器的开发者工具观察下登录页面有什么请求,我这里用的是 FireBug,下面两个图是在 FireBug 的网络面板中截的. 可以看到打开登录页面时有个 GET 请求验证码的,在 FireBug 中可以看到: 上面的图上可以看到这一句: Set-Cookie GUID=c89eabb62d9d4f35b491a8afd371b4ad; path=/ 这里请求的验证码页面保存了一个Cookie. 然后我们输入

笔记4:HttpWebRequest 与 HttpWebResponse 类

网页的请求与响应均通过HTTP来完成,HTTP是Web最重要的基础核心. HttpWebRequest与HttpWebResponse通过HTTP协议,完成网络"请求/响应"模型架构所需的功能,同时存取网页上各种特定元素. 一.HTTP通信协议 HTTP组成格式主要包含http标题及http主体,这两个部分请求与响应的消息有差别. 客户端向服务器端所发出的HTTP请求消息,其标题包含了一些重要的信息如: (同样服务器响应客户端也会有消息,也有头部信息) Server:Microsoft

c# HttpWebRequest与HttpWebResponse

[转]c# HttpWebRequest与HttpWebResponse 绝技 如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧. 本文章会对Http请求时的Get和Post方式进行详细的说明, 在请求时的参数怎么发送,怎么带Cookie,怎么设置证书,怎么解决 编码等问题,进行一步一步的解决. * 如果要使用中间的方法的话,可以访问我的帮助类完全免费开源: 这个类是专门为HTTP的GET和POST请求写的,解决了编码,证书,自动带Cookie等问题. C# H

利用HttpWebRequest抓取网页数据

根据运单号来获取运单状态 以EMS快递为例: 第一步首先分析要抓取网站的入口及参数 http://www.ems.com.cn 第二部利用httpwebRequest 模拟浏览器请求来获取网页内容 上图可以看到 获取验证码请求 http://www.ems.com.cn/ems/rand 查询 可以看到 发送的 post请求 http://www.ems.com.cn/ems/order/singleQuery_t public void getcode() { string code = "&

ASP.NET HttpWebRequest和HttpWebResponse

HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性. 模拟艺龙旅游网登录 想模拟登录,首先整理一下流程 1.通过360浏览器(IE,火狐等等)F12开发人员工具抓到相关数据 2.获取验证码(拿到cookie),登录时也需要使用 3.登录 ------------------------------- F12调出开发人员工具,输入用户名,密码登录,看我们抓到了什么信息. (此处为360浏览器) Request URL:这个

利用javascript跨域访问cookie之广告推广

在上一篇<说一说javascript跨域和jsonp>中,利用JSONP进行了跨域的数据访问,利用JS本身的跨域能力在远端生成HTML结构的方式完成了一个小广告. 在实际应用中, 跨域使用天气预报组件可以使用上面的方式实现,另外一种常用的就是显示某些电商的广告,此广告中会滚动您访问过的产品或者关联想推介给你的产品. 比如在某个A网页中显示了两种广告: 某东的广告,里面显示的东西,都是访问过滴,并且加推了相关的东西 某宝的广告,基本一样呈现方式. 当访问某东某宝的商品时,会把信息放到cookie

利用HttpWebRequest实现实体对象的上传

一 简介 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程序来说是可访问的.请注意,HttpWebRequest对象不是利用new关键字通过构 造函数来创建的,而是利用工厂机制(factory mechanism)通过Create()方法来创建的.另外,你可能预计需要显式地调用一个“Send”方法,实际上不需要.接下来调用 HttpWebRequ