|
本帖最后由 龙 于 2013-7-20 20:27 编辑
首先说一下 这个教程面向的是具有一定C#基础知识的初学者
我相信很多人会用C#的人都是能够编一些小的算法程序 始终没有接触到网络应用
也就与贴吧辅助无缘了
说老实话 我在过去几年就是这样 接触C#有两年了 然后学vb差不多10年了吧。。。始终没有途径了解这些东西
但是C#就是这样一种简单的 高度封装的语言 用它来写网络应用 不需要了解什么tcp/ip协议
访问网页不过是一个过程 在C#中抽象为一个对象一个函数罢了
首先在程序开头加上这么一句:这是在引入名字空间 让你少打重复的字 不解释了
说之前先扯一些关于webclient
webclient的确能访问网页 但是不能设置超时和代理 导致访问一些页面就很卡= =
在这里就简单做个例子吧,比如访问百度首页:
基本的http知识也不叙述了 翻我之前那篇教程去= =
顺带提一下 抓包还是推荐用经典的httpwatch和wireshark 两者都是两个按钮开始和停止 可以抓点开始和停止中间的包
- Webclient wc = new Webclient();
- //这五个是非常常见的标头 虽然说访问百度首页不需要那么苛刻 还是加上为好
- wc.Headers.Set(HttpRequestHeader.Accept, "*/*");
- wc.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-cn");
- wc.Headers.Set(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
- wc.Headers.Set(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
- wc.Headers.Set("Cache-Control", "no-cache");
- string str = wc.DownloadString("http://www.baidu.com");
复制代码 是的就这么几句就搞定了 要注意如果是post操作的话要用Uploadxxx函数 传两个参数为url和提交数据
如果要返回二进制数据而不是字符串的话 要用到xxxData函数 用Byte()类型的变量接收即可
还有程序初始化的时候不要忘了加上- ServicePoint.Expect100Continue = False
复制代码 接下来是另一种方法 httpwebrequest 和 httpwebresponse
webclient说白了就是对上面那俩做了一个封装
还是访问百度首页:
1.写出了这句你就成功了一半- HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com");
复制代码 2.还是标头 和一些杂项
- req.Accept = "*/*"
- req.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-cn")
- req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
- req.KeepAlive = True
- req.Headers.Set("cache-control", "no-cache")
- req.ContentType = "application/x-www-form-urlencoded"
- req.ServicePoint.Expect100Continue = False
- req.Timeout = 8000;
- req.ReadWriteTimeout = 8000;
- req.Method = "GET";//这个就必须自己写了 该是什么就写什么
- req.Proxy = new WebProxy(...);//还是有就写 没有就不写
复制代码 3.如果是 post 还要提交数据对吧 假设数据变量的名字是postdata 这样写
- Stream st = req.GetRequestStream();
- st.Write(postdata, 0, postdata.Length);
- st.Close();//不要忘了关 不关就卡在那儿了
复制代码 4.
- HttpWebResponse res = (HttpWebResponse)req.GetResponse();
- st = res.GetResponseStream();
复制代码 5.这时候你有两种选择 一种是取得文本
- StreamReader sr = new StreamReader(st);
- string retstr = sr.ReadToEnd();
- sr.Close();
- st.Close();
- res.Close();
复制代码 retstr即是页面的文本
当然 如果你没有中间保存st的引用的话可以不用自己管他的关闭 你可以理解为C#具有强大的回收机制
还有一种是要二进制数据的:- //如果直接访问Length属性会报错
- MemoryStream ms = new MemoryStream();
- byte[] buff = new byte[2048];
- int count;
- do
- {
- count = st.Read(buff, 0, 2048);
- ms.Write(buff, 0, count);
- } while (count != 0);
- st.Close();
- res.Close();
- byte[] retdata = ms.ToArray();
- ms.Close();
复制代码 retdata就是页面文本以二进制保存的形式 可以用encoding.getstring函数转过去
于是就大功告成了。。不过还有几件事情要做
(1)异常处理
C#访问网页失败时候都会报异常 而如果你不处理的话 就崩的跟狗似的了= =
try..catch可以插在任何地方 单条语句 for内部 或者整个函数体 总之控制流程还是很方便的
(2)程序初始化的时候- ServicePointManager.Expect100Continue = False
- ServicePointManager.MaxServicePoints = 512;//这个貌似是最大值了
复制代码 要不然多线程会卡
好了就这样。。。。
变式提升:
以下是百度贴吧wap登录的url和数据(不考虑验证码的情况) 尖括号内是需要替换成实际情况的东西- url:http://wappass.baidu.com/passport
- 数据:login_username=<username,utf8>&login_loginpass=<pw>&aaa=%E7%99%BB%E5%BD%95&login=yes&can_input=0&u=http%3A%2F%2Fwapp.baidu.com%2F&tpl=wapp&tn=bdIndex&pu=&ssid=&from=&bd_page_type=1&uid=1337004243356_897&type=
复制代码 请参照其模拟登录动作并获取返回文本
Hint:url编码用System.Web.HttpUtility.UrlEncode函数解决
答案: |
评分
-
参与人数 2 | 妹纸 +101 |
基友 +101 |
+100 |
+100 |
收起
理由
|
bdmg123
| + 1 |
+ 1 |
|
|
大神~~用BDUSS判断登陆成功貌似失效了 |
小二
| + 100 |
+ 100 |
+ 100 |
+ 100 |
很给力! |
查看全部评分
|