一、準備
最近在學習寫自動化控件,自動化腳本開發(fā)。可能會需要學到的知識,提前了解一下:
idea,maven,谷歌驅(qū)動,網(wǎng)絡
個人建議使用maven自動導入,因為需要的依賴包確實不少。
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>
二、selenium介紹
Selenium是一個Web的自動化測試工具,最初是為網(wǎng)站自動化測試而開發(fā)的,
Selenium可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括
PhantomJS這些無界面的瀏覽器(2018年開發(fā)者說暫停開發(fā),
chromedriver也可以實現(xiàn)同樣的功能),可以接收指令,
讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏。
三、什么是抓取技術
個人通俗的理解就是:模擬人的行為去各個網(wǎng)站溜達,點點按鈕,查查數(shù)據(jù),或者把看到的信息背回來。就像一只蜘蛛在一幢樓里不知疲倦地爬來爬去。
四、爬蟲協(xié)議
路邊的野花不要踩,如果你控制不住,你偏要踩,小心回家跪搓衣板。
那么爬蟲也是一樣,很多系統(tǒng)是很討厭爬蟲的,它們希望自己的業(yè)務數(shù)據(jù)不被竊取,而爬蟲違背了它們利益。但并不是所有的網(wǎng)站都討厭爬蟲,因為很多網(wǎng)站做SEO,它們希望被搜索引擎收錄,被爬蟲主流搜索引擎的爬蟲抓取。
比如: www.hao123.com ,我們觀察它的爬蟲協(xié)議( 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: /
如何查看爬蟲協(xié)議:在網(wǎng)站根域名下,一般會放一個robots.txt文件,文件中會清楚的描述哪些允許,哪些不允許。
五、Jsoup實現(xiàn)簡單爬蟲
Jsoup是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內(nèi)容。
它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。
總之,如果對HTML頁面很了解的話,是可以很容易的用Jsoup來抓取頁面的信息的。
1、分析頁面元素
通過瀏覽器打開“開發(fā)者調(diào)試工具” 通過選擇器審查頁面元素,按照盒子模型思維分析頁面元素信息,如下圖所示:
頁面元素定位路徑:coolsites_wrapper->cool-row-> href
Jsoup 實現(xiàn)簡單爬蟲 源代碼入下:
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.helper.StringUtil;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Jsoup 實現(xiàn)
*/
public class Spider {
static List<LinkEntity> stores = new ArrayList<>();
public static void main(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、執(zhí)行請求、解析結果
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(new LinkEntity(text, attribute));
}
}
// 6、遍歷爬取的結果(此處只做演示,不做任何存儲操作)
stores.parallelStream().forEach(item -> {
System.out.println(item.getName() + " -> " + item.getUrl());
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
class LinkEntity {
private String name;
private String url;
public LinkEntity(String name, String url) {
this.name = name;
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
2、Jsoup爬蟲技術實現(xiàn)思路
①、得到自己想要爬取數(shù)據(jù)的url,與服務器建立鏈接
②、通過Jsoup的jar包中的方法將Html解析成Document
③、使用Document中的一些列get、first、children等方法獲取自己想要的數(shù)據(jù),如圖片地址、名稱、時間。
④、將得到的數(shù)據(jù)封裝成自己的實體類。將實體中的數(shù)據(jù)在頁面加載出來。
3、Jsoup爬蟲框架的不足
只有html元素有的情況下,才能通過jsoup來爬蟲,如果是這接口獲得的數(shù)據(jù),那么通過jsoup是無法獲取到的。
六、Selenium自動化測試+爬蟲
Selenium 是一款自動化測試框架,支持多種主流的開發(fā),對各種開發(fā)語言提供了豐富的API,通過API你可以快速定位頁面元素,模擬用戶點擊,滑動,翻頁,截屏等一系列操作。
它可模擬用戶真實操作行為,并且是基于真實瀏覽器運行環(huán)境,所以在自動化測試中受到了很多測試同學的青睞。
Selenium 實現(xiàn)自動化測試 源代碼入下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 使用Java+Selenium 自動框架實現(xiàn)
*/
public class SeleniumSpider {
private static ChromeOptions initChromeOptions(){
ChromeOptions options = new ChromeOptions();
/*
// 啟動時自動最大化窗口
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;
}
private static WebDriver initWebDriver (ChromeOptions options){
WebDriver webDriver = new ChromeDriver(options);
webDriver.manage().window().maximize();
webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
return webDriver;
}
public static void main(String [] args){
// 1、設置chrome瀏覽器驅(qū)動
System.setProperty("webdriver.chrome.driver", "D:\\tools\\chromedriver_win32\\chromedriver.exe");
// 2、設置ChromeOptions
ChromeOptions chromeOptions= initChromeOptions();
// 3、初始化一個瀏覽器實例
WebDriver webDriver= initWebDriver(chromeOptions);
// 4、加載網(wǎng)頁程序(某度)
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();
});
}
public static void syncThread(List<WebElement> imgs){
Thread thrad = new Thread(new myThread(imgs));
thrad.start();
}
}
class myThread implements Runnable {
List<WebElement> imgs;
public myThread(List<WebElement> imgs) {
this.imgs = imgs;
}
@Override
public void run() {
imgs.forEach(images -> {
WebElement currentImages = images.findElement(By.className("main_img"));
String src = currentImages.getAttribute("src");
System.out.println("圖片地址:->" + src);
//TODO
});
}
}
Selenium 核心步驟如下:
1、下載對應版本驅(qū)動
2、安裝瀏覽器產(chǎn)品,并定位至瀏覽器運行程序
# Chrome各版本驅(qū)動的下載地址
http://chromedriver.storage.googleapis.com/index.html
# Firefox瀏覽器對應各個版本驅(qū)動下載地址:
https://github.com/mozilla/geckodriver/releases/
3、設置chrome瀏覽器驅(qū)動
4、設置ChromeOptions
5、初始化一個瀏覽器實例
6、加載網(wǎng)頁程序
7、通過ID選擇器定位輸入框,并設置搜索關鍵字”美女“
8、通過Class類樣式選擇器定位,模擬點擊事件并提交表單
9、加載第二個頁面:展示搜索頁面元素信息
10、定位搜索到所有圖片元素
11、異步獲取圖片地址
12、模擬頁面圖片點擊事件
七、小結
selenium能夠執(zhí)行頁面上的js,對于js渲染的數(shù)據(jù)和模擬登陸處理起來非常容易。文章來源:http://www.zghlxwxcb.cn/news/detail-764733.html
使用過程中,selenium由于在獲取頁面的過程中會發(fā)送很多請求,所以效率非常低,所以在很多時候需要酌情使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-764733.html
到了這里,關于Java自動化-selenium的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!