webbrowsers 抓取产品分类

放一个webbrowsers 简单应用的demo

1.vs新建一个winfrom应用

webbrowsers 抓取产品分类

 

 

2.窗体中添加webbrowsers控件

 webbrowsers 抓取产品分类

3.添加代码 加载窗体时调用webbrowsers打开登陆页面

private void Form1_Load(object sender, EventArgs e)
        {
            //webBrowser 显示对话框和脚本错误 tue不显示 false 显示
            webBrowser1.ScriptErrorsSuppressed = true;
            //设置需要打开的页面
            this.webBrowser1.Navigate("https://secure.dhgate.com/passport/login");
        }

4.写了个枚举记录加载到哪个页面

 enum step { 登录 = 1, 用户首页 = 2, 产品类别 = 3}

5.登陆方法 模拟点击登陆 很好理解 就是页面上的id获取元素 赋值 再 加click 事件

webbrowsers 抓取产品分类

 

//登陆方法
        public void loginPage()
        {
            //获取配置在Config里的账号密码
            string pwd = ConfigurationManager.AppSettings["pwd"];
            string names = ConfigurationManager.AppSettings["names"];

            htmlDoc = this.webBrowser1.Document;
            htmlDoc.GetElementById("username").SetAttribute("value", names);
            htmlDoc.GetElementById("password").SetAttribute("value", pwd);
            htmlDoc.GetElementById("login").InvokeMember("click");
        }

6.添加webbrowsers控件判断页面加载是否完成的方法

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //WebBrowserReadyState.Complete 代表页面加载完成
            if (webBrowser1.ReadyState < WebBrowserReadyState.Complete) return;
            //导航加载完成后要执行的代码
            DocumentCompleted();
        }

 

7.这里接上面的 DocumentCompleted() 方法 我在这里写 页面加载完成后的逻辑

  //导航加载完成后要执行的代码
        private void DocumentCompleted()
        {
            switch (int_step)
            {
                case 1:
                    loginPage();//登录页面 直接调用模拟登陆点击事件的方法
                    int_step = Convert.ToInt32(step.用户首页);
                    return;
                case 2://用户首页
                    if (!this.webBrowser1.Url.Equals("http://seller.dhgate.com/mydh/index.do"))
                    {
                        MessageBox.Show("登录失败!");
                        Application.Exit();
                    }
                    this.btn_start.Enabled = true;
                    return;
                case 3://产品类别
                        Thread th = new Thread(new ThreadStart(clickClass));
                        th.IsBackground = true;
                        th.Start();
                    return;
                default:
                    return;
            }
        }

 8.这个时候我想我需要一个按钮  点击开始的时候 跳转到我抓取数据的页面并开始抓取so

    //抓取类目按钮 跳转至类目列表 并开始抓取
        private void button_start_Click(object sender, EventArgs e)
        {
            this.btn_start.Enabled = false;
            int_step = Convert.ToInt32(step.产品类别);
            this.webBrowser1.Navigate("http://seller.dhgate.com/syi/category.do");
        }

9.因为每次加载页面都会进入到 webBrowser_DocumentCompleted 方法 所以我在这里判断 如果 int_step=3 就开始执行数据抓取的方法 clickClass()

 

        /// <summary>
        /// 点击分类click
        /// </summary>
        public void clickClass()
        {
         
            listValue = new List<string>();
            while (!htmlDoc.Body.InnerHtml.Contains("上传产品"))
            {
                Thread.Sleep(500);
            }
            //this.Invoke 获取主线程对象
            this.Invoke(new Action(() =>{htmlDoc = this.webBrowser1.Document;}));

            #region 点击类别 存储类别
            HtmlElement ulhtml0 = htmlDoc.GetElementById("div_catagory0").Children[0];
            for (int i = 0; i < ulhtml0.Children.Count; i++)
            {
                //类别是否有权读取
                if (ulhtml0.Children[i].OuterHtml.Contains("disable j-tipsbox"))
                {
                    continue;
                }
                ArrayList arr1=new ArrayList();
                arr1.Add(ulhtml0.Children[i].GetAttribute("title"));//MenuName
                arr1.Add(0);//TreeLevel
                arr1.Add("");//ParentMenu
                arr1.Add(number.Match(ulhtml0.Children[i].GetAttribute("data-param")).Value);//MenuID
                StrArr.Add(arr1);

                Thread.Sleep(500);
                ulhtml0.Children[i].InvokeMember("click");
                //判断发布按钮能不能点击
                if (!htmlDoc.GetElementById("button_category").OuterHtml.Contains("submit-syi initialstate"))
                {
                    listValue.Add(ulhtml0.Children[i].GetAttribute("data-param"));
                    continue;
                }

                while (htmlDoc.GetElementById("div_catagory1").Children.Count == 0)
                {
                    Thread.Sleep(500);
                }

                HtmlElement ulhtml1 = htmlDoc.GetElementById("div_catagory1").Children[0];
                for (int j = 0; j < ulhtml1.Children.Count; j++)
                {
                    ArrayList arr2 = new ArrayList();
                    arr2.Add(ulhtml1.Children[j].GetAttribute("title"));//MenuName
                    arr2.Add(1);//TreeLevel
                    arr2.Add(number.Match(ulhtml0.Children[i].GetAttribute("data-param")).Value);//ParentMenu
                    arr2.Add(number.Match(ulhtml1.Children[j].GetAttribute("data-param")).Value);//MenuID
                    StrArr.Add(arr2);
                   
                    ulhtml1.Children[j].InvokeMember("click");

                    if (!htmlDoc.GetElementById("button_category").OuterHtml.Contains("submit-syi initialstate"))
                    {
                        listValue.Add(ulhtml1.Children[j].GetAttribute("data-param"));
                        continue;
                    }
                 
                    while (htmlDoc.GetElementById("div_catagory2").Children.Count == 0)
                    {
                        Thread.Sleep(500);
                    }

                    HtmlElement ulhtml2 = htmlDoc.GetElementById("div_catagory2").Children[0];
                    for (int k = 0; k < ulhtml2.Children.Count; k++)
                    {
                        ArrayList arr3 = new ArrayList();
                        arr3.Add(ulhtml2.Children[k].GetAttribute("title"));//MenuName
                        arr3.Add(2);//TreeLevel
                        arr3.Add(number.Match(ulhtml1.Children[j].GetAttribute("data-param")).Value);//ParentMenu
                        arr3.Add(number.Match(ulhtml2.Children[k].GetAttribute("data-param")).Value);//MenuID
                        StrArr.Add(arr3);
                        ulhtml2.Children[k].InvokeMember("click");

                        if (!htmlDoc.GetElementById("button_category").OuterHtml.Contains("submit-syi initialstate"))
                        {
                            listValue.Add(ulhtml2.Children[k].GetAttribute("data-param"));
                            continue;
                        }
                        while (htmlDoc.GetElementById("div_catagory3").Children.Count == 0)
                        {
                            Thread.Sleep(500);
                        }
                        HtmlElement ulhtml3 = htmlDoc.GetElementById("div_catagory3").Children[0];

                        for (int l = 0; l < ulhtml3.Children.Count; l++)
                        {
                            ArrayList arr4 = new ArrayList();
                            arr4.Add(ulhtml3.Children[l].GetAttribute("title"));//MenuName
                            arr4.Add(3);//TreeLevel
                            arr4.Add(number.Match(ulhtml2.Children[k].GetAttribute("data-param")).Value);//ParentMenu
                            arr4.Add(number.Match(ulhtml3.Children[l].GetAttribute("data-param")).Value);//MenuID
                            StrArr.Add(arr4);
                            ulhtml3.Children[l].InvokeMember("click");
                            if (!htmlDoc.GetElementById("button_category").OuterHtml.Contains("submit-syi initialstate"))
                            {
                                listValue.Add(ulhtml3.Children[l].GetAttribute("data-param"));
                                continue;
                            }
                        }
                    }
                }
            }
            #endregion
        }

到这里就结束了