一、准备
最近在学习写自动化控件,自动化脚本开发。可能会需要学到的知识,提前了解一下:
idea,maven,谷歌驱动,网络
个人建议使用maven自动导入,因为需要的依赖包确实不少。
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.4.0</version></dependency>
二、selenium介绍
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,
Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括
PhantomJS这些无界面的浏览器(2018年开发者说暂停开发,
chromedriver也可以实现同样的功能),可以接收指令,
让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
三、什么是抓取技术
个人通俗的理解就是:模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来。就像一只蜘蛛在一幢楼里不知疲倦地爬来爬去。
四、爬虫协议
路边的野花不要踩,如果你控制不住,你偏要踩,小心回家跪搓衣板。
那么爬虫也是一样,很多系统是很讨厌爬虫的,它们希望自己的业务数据不被窃取,而爬虫违背了它们利益。但并不是所有的网站都讨厌爬虫,因为很多网站做SEO,它们希望被搜索引擎收录,被爬虫主流搜索引擎的爬虫抓取。
比如: www.hao123.com ,我们观察它的爬虫协议( https://www.hao123.com/robots.txt ) 就能看出它允许部分(百度、谷歌、有道、搜狗、搜搜)等爬虫对他进行蹂躏。其他的爬虫它一律不允许。
User-agent: Baiduspider
Allow: /
User-agent: Baiduspider-image
Allow: /
User-agent: Baiduspider-video
Allow: /
User-agent: Baiduspider-news
Allow: /
User-agent: Googlebot
Allow: /
User-agent: MSNBot
Allow: /
User-agent: YoudaoBot
Allow: /
User-agent: Sogou web spider
Allow: /
User-agent: Sogou inst spider
Allow: /
User-agent: Sogou spider2
Allow: /
User-agent: Sogou blog
Allow: /
User-agent: Sogou News Spider
Allow: /
User-agent: Sogou Orion spider
Allow: /
User-agent: JikeSpider
Allow: /
User-agent: Sosospider
Allow: /
User-agent: *
Disallow: /
如何查看爬虫协议:在网站根域名下,一般会放一个robots.txt文件,文件中会清楚的描述哪些允许,哪些不允许。
五、Jsoup实现简单爬虫
Jsoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。
它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
总之,如果对HTML页面很了解的话,是可以很容易的用Jsoup来抓取页面的信息的。
1、分析页面元素
通过浏览器打开“开发者调试工具” 通过选择器审查页面元素,按照盒子模型思维分析页面元素信息,如下图所示:
页面元素定位路径:coolsites_wrapper->cool-row-> href
Jsoup 实现简单爬虫 源代码入下:
importorg.jsoup.Connection;importorg.jsoup.Jsoup;importorg.jsoup.helper.StringUtil;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;/**
* Jsoup 实现
*/publicclassSpider{staticList<LinkEntity> stores =newArrayList<>();publicstaticvoidmain(String[] args){//1、与目标服务建立连接 Connection connection =Jsoup.connect("https://www.***.com/");
connection.header("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36");try{// 2、执行请求、解析结果 Document document = connection.get();Element element = document.getElementById("coolsites_wrapper");// 3、定位到->"酷站列表" Elements elements = element.getElementsByClass("cool-row");Iterator iterator = elements.iterator();while(iterator.hasNext()){Element ulElement =(Element) iterator.next();// 4、获取当前盒子模型下<a>标签列表 Elements links = ulElement.getElementsByTag("a");Iterator iteratorLinks = links.iterator();// 5、迭代遍历超链接列表 while(iteratorLinks.hasNext()){Element items =(Element) iteratorLinks.next();String text = items.text();String attribute = items.select("a").attr("href");if(StringUtil.isBlank(attribute)||StringUtil.isBlank(text)){continue;}
stores.add(newLinkEntity(text, attribute));}}// 6、遍历爬取的结果(此处只做演示,不做任何存储操作)
stores.parallelStream().forEach(item ->{System.out.println(item.getName()+" -> "+ item.getUrl());});}catch(IOException e){
e.printStackTrace();}}}classLinkEntity{privateString name;privateString url;publicLinkEntity(String name,String url){this.name = name;this.url = url;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicStringgetUrl(){return url;}publicvoidsetUrl(String url){this.url = url;}}
2、Jsoup爬虫技术实现思路
①、得到自己想要爬取数据的url,与服务器建立链接
②、通过Jsoup的jar包中的方法将Html解析成Document
③、使用Document中的一些列get、first、children等方法获取自己想要的数据,如图片地址、名称、时间。
④、将得到的数据封装成自己的实体类。将实体中的数据在页面加载出来。
3、Jsoup爬虫框架的不足
只有html元素有的情况下,才能通过jsoup来爬虫,如果是这接口获得的数据,那么通过jsoup是无法获取到的。
六、Selenium自动化测试+爬虫
Selenium 是一款自动化测试框架,支持多种主流的开发,对各种开发语言提供了丰富的API,通过API你可以快速定位页面元素,模拟用户点击,滑动,翻页,截屏等一系列操作。
它可模拟用户真实操作行为,并且是基于真实浏览器运行环境,所以在自动化测试中受到了很多测试同学的青睐。
Selenium 实现自动化测试 源代码入下:
importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeDriver;importorg.openqa.selenium.chrome.ChromeOptions;importjava.util.List;importjava.util.concurrent.TimeUnit;/**
* 使用Java+Selenium 自动框架实现
*/publicclassSeleniumSpider{privatestaticChromeOptionsinitChromeOptions(){ChromeOptions options =newChromeOptions();/*
// 启动时自动最大化窗口
options.addArguments("--start-maximized");
// 禁用阻止弹出窗口
options.addArguments("--disable-popup-blocking");
// 启动无沙盒模式运行
options.addArguments("no-sandbox");
// 禁用扩展
options.addArguments("disable-extensions");
// 默认浏览器检查
options.addArguments("no-default-browser-check");
// 设置chrome 无头模式
options.setHeadless(Boolean.TRUE);
//不用打开图形界面。
options.addArguments("--headless");
*/
options.setBinary("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");return options;}privatestaticWebDriver initWebDriver (ChromeOptions options){WebDriver webDriver =newChromeDriver(options);
webDriver.manage().window().maximize();
webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);return webDriver;}publicstaticvoidmain(String[] args){// 1、设置chrome浏览器驱动 System.setProperty("webdriver.chrome.driver","D:\\tools\\chromedriver_win32\\chromedriver.exe");// 2、设置ChromeOptions ChromeOptions chromeOptions=initChromeOptions();// 3、初始化一个浏览器实例 WebDriver webDriver=initWebDriver(chromeOptions);// 4、加载网页程序(某度)
webDriver.get("https://image.baidu.com");// 5、通过ID选择器定位输入框,并设置搜索关键字”帅哥“
webDriver.findElement(By.id("kw")).sendKeys("帅哥");// 6、通过Class类样式选择器定位,模拟点击事件并提交表单
webDriver.findElement(By.className("s_btn")).submit();// 7、加载第二个页面:展示搜索页面元素信息 WebElement webElement = webDriver.findElement(By.id("imgid"));// 8、定位搜索到所有图片元素 List<WebElement> imgs= webElement.findElements(By.className("imgbox"));// 9、异步获取图片地址 syncThread(imgs);// 10、模拟页面图片点击事件
imgs.forEach(images ->{
images.click();});}publicstaticvoidsyncThread(List<WebElement> imgs){Thread thrad =newThread(newmyThread(imgs));
thrad.start();}}class myThread implementsRunnable{List<WebElement> imgs;publicmyThread(List<WebElement> imgs){this.imgs = imgs;}@Overridepublicvoidrun(){
imgs.forEach(images ->{WebElement currentImages = images.findElement(By.className("main_img"));String src = currentImages.getAttribute("src");System.out.println("图片地址:->"+ src);//TODO });}}
Selenium 核心步骤如下:
1、下载对应版本驱动
2、安装浏览器产品,并定位至浏览器运行程序
# Chrome各版本驱动的下载地址
http://chromedriver.storage.googleapis.com/index.html
# Firefox浏览器对应各个版本驱动下载地址:
https://github.com/mozilla/geckodriver/releases/
3、设置chrome浏览器驱动
4、设置ChromeOptions
5、初始化一个浏览器实例
6、加载网页程序
7、通过ID选择器定位输入框,并设置搜索关键字”美女“
8、通过Class类样式选择器定位,模拟点击事件并提交表单
9、加载第二个页面:展示搜索页面元素信息
10、定位搜索到所有图片元素
11、异步获取图片地址
12、模拟页面图片点击事件
七、小结
selenium能够执行页面上的js,对于js渲染的数据和模拟登陆处理起来非常容易。
使用过程中,selenium由于在获取页面的过程中会发送很多请求,所以效率非常低,所以在很多时候需要酌情使用。
版权归原作者 全粘架构师 所有, 如有侵权,请联系我们删除。