您的位置:首页 > 其它

数据提取-Selenium专治各种顽固性客户端

2016-04-26 22:32 405 查看
说起Selenium,很多人想到的是Selenium用在自动化web测试上,的确,Selenium是一个很好的自动化测试工具,能够实现很多便利的测试功能。其实Selenium也是一款数据抽取的神器。我们知道现在很多网站使用了很多javascript,ajax,cookie,session等等,或者人为设置了很多规则来防止/限制爬虫,有过提取数据的都知道在提取数据的过程中,会遇到各种顽固性问题,像上篇介绍的httpclient之类,虽然做了一些东西,但还是存在很多不足,尤其是JS解析,支持很有限。这个时候就可以试试Selenium这款神器了。

Selenium IDE

先来说说Selenium IDE,这个是Selenium通过图形界面的方式,很方便支持web页面操作,而且可以记录操作的过程,形成脚本,不过目前只有FireFox插件,其他的浏览器不支持。 所以我们说的Selenium IDE其实就是一个FireFox插件。下载/安装好插件之后,FireFox浏览器右上角就多了一个Se的图标,就是Selenium IDE了,就可以使用。



一如你般聪明,很容易就知道怎么开始了。想要导出各种脚本,也是很容易的



多种语言可以选择,你值得拥有。

不过话说这种方式还是有不少坑的,

首先下载插件都不容易,Selenium官网好像被强了,基本下载不了;

FireFox版本和Selenium IDE版本要对应,不然就经常出现很多错误;

录制的脚本经常回放不了,这个比较悲催了。

Selenium RC

Selenium server端,也就是Selenium Remote Control简称RC,RC主要包括三个部分,launcher,http proxy,selenium core, 其中selenium core是由一堆javascript函数构成,通过调用这些函数,来实现对浏览器的各种操作。Selenium2主要解决了几点1.没有原生的鼠标和键盘事件;2.XSS/HTTP同源数据问题;3.popup dialog问题。Webdriver对不同浏览器的处理和Selenium1.0有着明显的不同,Selenium1.0不管是什么浏览器,都是由javascript来处理,而webdriver是选择浏览器最容易识别的语言来处理,比如在Firefox中javascript最容易,在IE中C++最容易识别,通过灵活选择最容易识别的语言来处理多浏览器,我们就可以很好的回避某些浏览器对javascript的安全限制,Webdriver不仅可以处理这方面的问题,而且可以调用操作系统API,尤其是当用户需要模拟鼠标或键盘操作时,这项能力的作用表现的尤其明显。目前支持主流的浏览器,包括chrome,firefox,IE等,使用的时候要下载对应的driver.

有了server端,我们就可以通过代码来控制各种操作,发送命令给服务端,接受到返回的结果,解析返回的结果。

下面通过简短的代码片段来说明下:

// System.setProperty("webdriver.firefox.bin",

// "D:/Program Files/Mozilla firefox33/firefox.exe");

System.setProperty("webdriver.chrome.bin",

"C:/Program Files/Google/Chrome/Application/chrome.exe");
WebDriver driver = new ChromeDriver();

driver.get(baseUrl + "/"); //访问一个页面

driver.manage().window().maximize();//浏览器最大化

// Thread.sleep(2000);

Actions a = new Actions(driver);

a.click(driver.findElement(By.linkText("供应商")));// not work???

// driver.findElement(By.linkText("供应商")).click();

// Thread.sleep(2000);

driver.findElement(By.id("alisearch-keywords")).clear();

driver.findElement(By.id("alisearch-keywords")).sendKeys(key);

driver.findElement(By.id("alisearch-submit")).submit();

Actions action = new Actions(driver);

action.sendKeys(Keys.ENTER);// 模拟按下并释放 TAB键

经常遇到鼠标点击数据不工作,没有效果,可以试试这个:

WebElement we = driver.findElement(By.linkText("" + i));

act.moveToElement(we).perform(); //先移动到某个元素,然后执行

需要说明的是,代码中有很多sleep的时候,因为由于网络等各方面的原因,经常需要等待,不然会现在元素不存在的异常。

每次跳转到新的页面,我们可以遍历元素或者driver.getPageSource()得到所有的响应,来解析响应提取的部分,这样也是很方便的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: