C#自动登录网页浏览页面 抓取数据

来源:互联网 发布:数据内勤个人工作总结 编辑:程序博客网 时间:2024/04/30 12:14

 

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

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

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

 

程序非常简单

     /// <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

 

 

        }
      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);

        &nbsp;          

                    //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中存储的例外,这个容易破解)

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 政审爷爷有犯罪怎么办 看守犯人遇到贿赂怎么办 家属收到行政拘留通知书怎么办 有治安处罚记录怎么办 党员被打了怎么办 交通事故第一次笔录不对怎么办 老公被刑拘了怎么办 老公被拘留了怎么办 刑拘看守所不收怎么办 被贷款中介忽悠怎么办 被中介套路贷款怎么办 车牌变更后保险怎么办 被诬陷诈骗刑拘怎么办 把人头打破了怎么办 起诉后找不到人怎么办 欠款人转移财产怎么办 公安不退保释金怎么办 拘留没钱交罚款怎么办 对治安拘留不服 怎么办 老公被治安拘留怎么办 治安拘留找不到人怎么办 刑事拘留转治安拘留怎么办 遇到晦气的事怎么办 人死在看守所怎么办 检察院抗诉了我怎么办 异地在北京怎么办护照 欠信用卡20万怎么办 2018工作好难找怎么办 在拘留所病犯怎么办 心脏偷挺拘留所怎么办 公安局悬赏不给怎么办 北京限外地车怎么办 外地车辆怎么办进京证 吃头孢过敏了怎么办 2018年进京证怎么办 长沙宁乡人怎么办护照 北京护照过期了怎么办 去旅游怎么办加急护照 去越南没有护照怎么办 南京护照过期了怎么办 外国人护照快到期怎么办