随心所欲

做个幸福的人
posts - 146, comments - 1380, trackbacks - 25, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

c#自动登录网页,浏览页面

Posted on 2007-11-08 13:55 随心所欲 阅读(2209) 评论(13)  编辑 收藏 网摘 所属分类: 通讯/WebServer

 

需求:客户的数据同时存在在另外一个不可控的系统中,需要和当前系统同步。

思路:自动登录另外一个系统,然后抓取数据,同步到本系统中。

技术点:模拟用户登录;保存登录状态;抓取数据

 

程序非常简单

     /// <summary>

        /// visit the target url

        /// </summary>

        /// <param name="targetURL"></param>

        /// <param name="cc">this is for keeping cookies and sessions</param>

        /// <param name="param">this is the data need post inside form</param>

        /// <returns>html page</returns>

        public static string PostAndGetHTML(string targetURL,CookieContainer cc, Hashtable param)

        {

            //prepare the submit data

            string formData = "";

            foreach (DictionaryEntry de in param)

            {

                formData += de.Key.ToString() + "=" + de.Value.ToString()+"&";

            }

            if(formData.Length>0)

               formData = formData.Substring(0, formData.Length - 1); //remove last '&'

 

            ASCIIEncoding encoding = new ASCIIEncoding();

            byte[] data = encoding.GetBytes(formData);

 

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetURL);

            request.Method = "POST";    //post

            request.ContentType = "application/x-www-form-urlencoded";

            request.ContentLength = data.Length;

            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";

            

            Stream newStream = request.GetRequestStream();

            newStream.Write(data, 0, data.Length);

 

            newStream.Close();

 

            request.CookieContainer = cc;

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            cc.Add(response.Cookies);

            Stream stream = response.GetResponseStream();

            string result = new StreamReader(stream, System.Text.Encoding.Default).ReadToEnd();

            return result;

        }

这一个是调用的例子:先登录,在查询。 实际中这个逻辑可能有很多步骤

        private void button2_Click(object sender, EventArgs e)

        {

            CookieContainer cc = new CookieContainer();//this is for keep the Session and Cookie

            Hashtable param = new Hashtable();//this is for keep post data.

 

            string urlLogin = "http://demo.server//login.asp";

             //do find the elementId that needed. check the source of login page can get this information

            param.Add("User", "xxx");

            param.Add("Password", "xxxx");

            string result = PostAndGetHTML(urlLogin, cc, param);

            //check result, whether login success

          

            //if login success, goto the target url, and input some value.

            string url2 = " http://demo.server/query.asp?id=1";// need change. special logic

            param.Clear();

            //param.Add("SearchAreaId","JobId")

            result = PostAndGetHTML(url2, cc, new Hashtable());

            //ConvertToDT the html or do something others

 

 

        }

这是一个简单的抓取网页数据的函数(针对Table内的,直接转化成DataTable

        private DataTable ConvertToDT(DataTable dt, string tableHTML)

        {

 

            int lastTD = tableHTML.ToLower().LastIndexOf("</td>");

            int firstRow = tableHTML.ToLower().IndexOf("<tr") + 3;//after ""<tr

            int index = tableHTML.ToLower().IndexOf("<tr", firstRow) + 3;//after ""<tr

            while (index < lastTD)

            {

                DataRow dr = dt.NewRow();

                for (int i = 0; i < dt.Columns.Count; i++)

                {

                    string value = "";

                    int startTD = tableHTML.ToLower().IndexOf("<td", index) + 3;//after "<td"

                    int endTD = tableHTML.ToLower().IndexOf("</td>", startTD);

                    if (endTD < 0)

                        break;

                    string tdStr = tableHTML.Substring(startTD, endTD - startTD);

                   

                    //remove <> and others

                    tdStr = tdStr.Replace("&nbsp;", "").Replace("\t", "").Replace("\r", "");

                    string[] v = tdStr.Split('<', '>');

                    for (int j = 0; j < v.Length; j++)

                    {

                        j++;

                        if (v[j].Trim() != "")

                        {

                            value = v[j].Trim();

                            break;

                        }

 

 

                    }

                    //

                    dr[i] = value;

                    index = endTD;

                }

                dt.Rows.Add(dr);

 

            }

            return dt;

        }

注:对于有验证码登录系统的无效。(如果该系统的验证码放到cookie中存储的例外,这个容易破解)

Feedback

#1楼    回复  引用    

2007-11-08 14:07 by wxdxy [未注册用户]
有验证码的用ocr,不过速度处理就慢了,

#2楼 [楼主]   回复  引用  查看    

2007-11-08 14:10 by 随心所欲      
@wxdxy
是的。
但是那个就比较麻烦了,得根据具体的系统来做破解了。
有的网站简单,甚至直接就把信息放在了图片名上,还有放在cookie中的。

#3楼    回复  引用    

2007-11-08 14:21 by A.Z* [未注册用户]
看了半天,发觉,网上到处都是...

#4楼    回复  引用  查看    

2007-11-08 16:34 by 元宝      
抓取数据,建议用“正表达式”,这方面知识,看看我的博客吧

#5楼 [楼主]   回复  引用  查看    

2007-11-08 18:32 by 随心所欲      
@元宝
好的,给个链接吧

#6楼    回复  引用  查看    

2007-11-08 18:54 by 踏雪无痕      
我是把验证码放到session里的。
不过这种抓东西的一般不是很好,还是要尊重作者的著作权。

#7楼    回复  引用  查看    

2007-11-08 18:58 by 神奇小子      
用Web服务可以不

#8楼 [楼主]   回复  引用  查看    

2007-11-08 19:12 by 随心所欲      
@踏雪无痕
和著作权有关?人工访问和机器访问没什么区别吧?

#9楼 [楼主]   回复  引用  查看    

2007-11-08 19:12 by 随心所欲      
@神奇小子
用web service? 做什么?

#10楼    回复  引用    

2007-11-19 14:01 by 国际电话卡 [未注册用户]
看了半天,不是很懂,好像很麻烦!

#11楼 [楼主]   回复  引用  查看    

2007-11-19 14:40 by 随心所欲      
@国际电话卡
这已经是最简单的了。还有一种是用WebBrowser模拟,更麻烦。
这种方法的缺点也是不少,很多复杂的网页无法实现登陆。WebBrowser则可以胜任任何一种方式。

#12楼    回复  引用    

2007-11-22 19:05 by 都市风 [未注册用户]
这个类不错

#13楼    回复  引用  查看    

2008-08-11 16:45 by 夏雷      
登录就不成功啊

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-08 18:53 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:

 




Google