抓取微博数据:使用HtmlUnitDriver实现模拟登陆

发表于:2017-8-23 11:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:神经骚栋    来源:51Testing软件测试网采编

  键盘事件
  对于键盘的模拟操作,Actions 类中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法来实现。键盘的操作有普通键盘和修饰键盘(Modifier Keys, 下面的章节将讲到修饰键的概念)两种 :
  ●普通键盘模拟 sendKeys(keysToSend)
  Actions action = new Actions(driver); 
  action.sendKeys(Keys.TAB);// 模拟按下并释放 TAB 键
  action.sendKeys(Keys.SPACE);// 模拟按下并释放空格键
  /***
  针对某个元素发出某个键盘的按键操作,或者是输入操作,
  比如在 input 框中输入某个字符也可以使用这个方法。这个方法也可以拆分成:
  action.click(element).sendKeys(keysToSend)。
  */
  action.sendKeys(element,keysToSend);
  ●对于修饰键(Modifier keys),一般都是跟普通键组合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。
  Actions action = new Actions(driver); 
  action.keyDown(Keys.CONTROL);// 按下 Ctrl 键
  action.keyDown(Keys.SHIFT);// 按下 Shift 键
  action.keyDown(Key.ALT);// 按下 Alt 键
  action.keyUp(Keys.CONTROL);// 释放 Ctrl 键
  action.keyUp(Keys.SHIFT);// 释放 Shift 键
  action.keyUp(Keys.ALT);// 释放 Alt 键
  示例:通过 Alt+F4 来关闭当前的活动窗口,可以通过下面语句来实现。
  action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();`
  使用 HtmlUnitDriver 模拟登录微博账号(基于Selenium:3.4.0实现)
  上面我们对HtmlUnitDriver的使用有了初步的了解,下面我们就要模拟登录微博账号.由于数据抓取是通过www.weibo.cn而不是www.weibo.com.所以我们要通过https://passport.weibo.cn/signin/login这个登录地址来登录.我们首先要打开这个网站地址,分析这个网站有什么是我们需要.网站上的元素很少.我们需要账号输入框、密码输入框和登录按钮的点击事件。
  然后我们通过控制台来获取这个三个元素.如下所示.(因为我先前登陆过,所以Cookie里面会有我的信息)
  好了,准备工作已经做完了,那么接下来我们就需要搞我们的代码了.代码比较简单,这里就不过多解释了。
              //初始化一个HtmlUnitDriver对象
              HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_52);
              driver.setJavascriptEnabled(true);//允许JS操作
              driver.get("https://passport.weibo.cn/signin/login");
              driver.executeScript("document.getElementById('loginWrapper').style.display = 'block'");//隐藏新浪微博登录的验证码
              //找到账号输入框,输入用户账号
              WebElement mobile = driver.findElementByCssSelector("input#loginName");
              mobile.sendKeys(username);
              //找到密码输入框,输入用户密码
              WebElement pass = driver.findElementByCssSelector("input#loginPassword");
              pass.sendKeys(password);
              //输入完成之后,点击登录按钮
              WebElement submit = driver.findElementByCssSelector("a#loginAction");
              submit.click();
              driver.close();//关闭浏览器
  那么我们该如何拿到Cookie字符串呢?这里登录完成之后,HtmlUnitDriver就存储了Cookie信息,我们直接拿出来就行,代码如下所示。
              Set<Cookie> cookieSet = driver.manage().getCookies();
              StringBuilder sb = new StringBuilder();
              for (Cookie cookie : cookieSet) {
                  sb.append(cookie.getName() + "=" + cookie.getValue() + ";");
              }
              String result = sb.toString();//拼接好的Cookie信息
  整体代码如下所示。
       public static String getSinaCookie(String username, String password) throws Exception {
              //初始化一个HtmlUnitDriver对象
              HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_52);
              driver.setJavascriptEnabled(true);//允许JS操作
              driver.get("https://passport.weibo.cn/signin/login");
              driver.executeScript("document.getElementById('loginWrapper').style.display = 'block'");//隐藏新浪微博登录的验证码
              //找到账号输入框,输入用户账号
              WebElement mobile = driver.findElementByCssSelector("input#loginName");
              mobile.sendKeys(username);
              //找到密码输入框,输入用户密码
              WebElement pass = driver.findElementByCssSelector("input#loginPassword");
              pass.sendKeys(password);
              //输入完成之后,点击登录按钮
              WebElement submit = driver.findElementByCssSelector("a#loginAction");
              submit.click();
              String result = concatCookie(driver);
              System.out.println("Get Cookie: " + result);
              driver.close();//关闭浏览器
              if (result.contains("SUB")) {
                  return result;
              } else {
                  throw new Exception("weibo login failed");
              }
          }
          public static String concatCookie(HtmlUnitDriver driver) {
              Set<Cookie> cookieSet = driver.manage().getCookies();
              StringBuilder sb = new StringBuilder();
              for (Cookie cookie : cookieSet) {
                  sb.append(cookie.getName() + "=" + cookie.getValue() + ";");
              }
              String result = sb.toString();
              return result;
          }
  通过控制台的打印,我们就能获得我们所需要的Cookie字符串了.如下所示。
  总结
  这篇博客写到这就到了尾声了,有一点要注意,那就是使用HtmlUnitDriver时候,可能会链接失败,现在未找到原因,希望有知道的大佬能提点下.文章很多点都可能模糊不清,所以如果有错误,欢迎指导批评,非常感谢各位大佬。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号