webbrowsers 抓取产品分类
放一个webbrowsers 简单应用的demo
1.vs新建一个winfrom应用
2.窗体中添加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 事件
//登陆方法 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 }
到这里就结束了