马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#实现HTTP POST请求的一个问题

  [复制链接]
查看16362 | 回复12 | 2014-10-14 22:17:34 | 显示全部楼层 |阅读模式
本帖最后由 tdkgn 于 2014-10-19 20:39 编辑

鄙人学生狗,想编个程序从学校网站爬取所有本校学生的基本个人信息,但是处理一个post请求遇到了问题,求各位大神指点。


QQ截图20141014214545.png

如图这么一个局部页面,当我输入学号并点击查询的时候,能用IE捕获一个HTTP请求
QQ截图20141014214834.png

用学号20131002做测试的时候,捕获的请求正文如下
请求正文.png
[AppleScript] 纯文本查看 复制代码
__VIEWSTATE=LH%2F9Re0QExCNH36tUrgN6ObuG94WlYrkvlLkLfPKItV0RToAs5sf9IBRYjNgtwhJJrxvnEAWBFMbHpkaK%2BYN83nB%2Fd7G%2BuQBp%2FUAce76T3lMVFHHZZUfrrw9Q1d%2BJVVQ4s%2F51og28YNQhLfC8shJw9SQSkTzRu%2F3mmzz%2FyENhRdaYl6Ioackw2K4712aFeSsKUQ0D3uo%2BNqqc48y1xkDiiAeggyRqDPbXG5v9I8ITil01PQcWgxDnVGYQdwlO1NFVgMuNZOlXN66O%2BbSTardQGzisKk2gwBqxcVToruXJZn3UkD7fdOm8ShiUetR7NebXKGK6A%3D%3D&__VIEWSTATEGENERATOR=E08963AD&__VIEWSTATEENCRYPTED=&__EVENTVALIDATION=Nufi4NPV%2BFKCbBaC8A1m0WKIp6cyHZ6leygheWI%2Bw%2FuHQn3n6Fm1eWPXwwDsXgq16fFy%2BjavUsKpvVrLnO8elTThAA%2B7xQkeSAqloNIX9TMq2oB1&StudentNo=20131004&StudentName=&Button1=%B2%E9%D1%AF&SearchStyleControl_currentState=False

我的post实现主体贴在下面
[C#] 纯文本查看 复制代码
public string HttpPost(string Url,string strPostdata)
        {
            StringBuilder content = new StringBuilder();
            try
            {
                // 与指定URL创建HTTP请求
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
                request.Method = "POST";
                request.Accept = "*/*";
//出于隐私考虑,cookie实际内容“键”、“值”代替
                CookieContainer objcok = new CookieContainer();
                objcok.Add(new Uri("http://www.yanghua.net/SystemForm/Student/Search/StuInfoSearch.aspx"), new Cookie("键", "值"));
                objcok.Add(new Uri("http://www.yanghua.net/SystemForm/Student/Search/StuInfoSearch.aspx"), new Cookie("键", "值"));
                objcok.Add(new Uri("http://www.yanghua.net/SystemForm/Student/Search/StuInfoSearch.aspx"), new Cookie("键", "值"));
                request.CookieContainer = objcok;

                //不保持连接
                request.KeepAlive = true;
                byte[] buffer = Encoding.Default.GetBytes(strPostdata);
                request.ContentLength = buffer.Length;

                request.GetRequestStream().Write(buffer, 0, buffer.Length);
            

                // 获取对应HTTP请求的响应
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // 获取响应流
                Stream responseStream = response.GetResponseStream();

                // 对接响应流(以"GBK"字符集)
                StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("gb2312"));

                // 开始读取数据
                Char[] sReaderBuffer = new Char[256];
                int count = sReader.Read(sReaderBuffer, 0, 256);
                while (count > 0)
                {
                    String tempStr = new String(sReaderBuffer, 0, count);
                    content.Append(tempStr);
                    count = sReader.Read(sReaderBuffer, 0, 256);
                }
                // 读取结束
                sReader.Close();
            }
            catch (Exception)
            {
                content = new StringBuilder("Runtime Error");
            }

            return content.ToString();
        }


但是我把上述请求正文作为postdata传入的时候,得到的响应却不是预期的响应。
预期响应片段:
预期响应.png

实际响应片段:
实际响应.png
不知道为什么会未找到相关数据。
不知道我有没有把我的问题描述清楚了。如果还需要其他信息,我再提供。希望大神们能给一个解决方案,已经卡了两天了。谨拜谢!

ibcadmin | 2014-10-14 22:22:19 | 显示全部楼层
  你post的内容贴出来  
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tdkgn | 2014-10-14 22:23:33 | 显示全部楼层
ibcadmin 发表于 2014-10-14 22:22
你post的内容贴出来

__VIEWSTATE=LH%2F9Re0QExCNH36tUrgN6ObuG94WlYrkvlLkLfPKItV0RToAs5sf9IBRYjNgtwhJJrxvnEAWBFMbHpkaK%2BYN83nB%2Fd7G%2BuQBp%2FUAce76T3lMVFHHZZUfrrw9Q1d%2BJVVQ4s%2F51og28YNQhLfC8shJw9SQSkTzRu%2F3mmzz%2FyENhRdaYl6Ioackw2K4712aFeSsKUQ0D3uo%2BNqqc48y1xkDiiAeggyRqDPbXG5v9I8ITil01PQcWgxDnVGYQdwlO1NFVgMuNZOlXN66O%2BbSTardQGzisKk2gwBqxcVToruXJZn3UkD7fdOm8ShiUetR7NebXKGK6A%3D%3D&__VIEWSTATEGENERATOR=E08963AD&__VIEWSTATEENCRYPTED=&__EVENTVALIDATION=Nufi4NPV%2BFKCbBaC8A1m0WKIp6cyHZ6leygheWI%2Bw%2FuHQn3n6Fm1eWPXwwDsXgq16fFy%2BjavUsKpvVrLnO8elTThAA%2B7xQkeSAqloNIX9TMq2oB1&StudentNo=20131004&StudentName=&Button1=%B2%E9%D1%AF&SearchStyleControl_currentState=False
ibcadmin | 2014-10-14 22:37:46 | 显示全部楼层
光传这个试试
StudentNo=20131004&StudentName=&Button1=%B2%E9%D1%AF&SearchStyleControl_currentState=False
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2014-10-14 22:38:30 | 显示全部楼层
或者这个
StudentNo=20131004&StudentName=
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tdkgn | 2014-10-14 22:41:43 | 显示全部楼层
ibcadmin 发表于 2014-10-14 22:38
或者这个
StudentNo=20131004&StudentName=

都试了,还是未找到相关数据
ibcadmin | 2014-10-14 22:55:25 | 显示全部楼层
   不要Cookie去掉在试试 , 你这个搜索 是你自己做的网页吗?
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tdkgn | 2014-10-14 22:59:43 | 显示全部楼层
ibcadmin 发表于 2014-10-14 22:55
不要Cookie去掉在试试 , 你这个搜索 是你自己做的网页吗?

不是我做的网页,是我们学校的一个网页,提供学生信息查询。需要登陆才能查询,去掉cookie会跳转到登录页面。感兴趣的话希望能与站长私聊。
ibcadmin | 2014-10-15 09:09:48 | 显示全部楼层
tdkgn 发表于 2014-10-14 14:59
不是我做的网页,是我们学校的一个网页,提供学生信息查询。需要登陆才能查询,去掉cookie会跳转到登录页 ...

  我前两天刚做了个类似的 , 也是需要登录后抓取数据的,   

   我的做法是  用webBrowser先进行登录  拿到cookie, 而不是你这种拿Cookie  抓包拿cookie没用, 获取cookie后在抓取
    你这个测试过了没有 ,  用你这个cookie 登录进去了没有?
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tdkgn | 2014-10-15 13:35:35 | 显示全部楼层
ibcadmin 发表于 2014-10-15 09:09
我前两天刚做了个类似的 , 也是需要登录后抓取数据的,   

   我的做法是  用webBrowser先进行登 ...

这个必须测试过。用cookie是可以登录的,但是post相同的数据居然得到响应不一样。

用WebBrowser直接用GetElementById然后调用InvokeMember("click")就能得到响应了,不用post。但是我想通过console直接搞定、有解决方案么?
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则