【java】Selenium爬虫控制谷歌浏览器
每逢佳節倍思親,中秋節到了,這里祝愿大家中秋節快樂。
今天主要向大家介紹的是如何自動打開瀏覽器并自動搜索指定內容。
1. 下載谷歌瀏覽器驅動
為什么要下載驅動?
因為一般的寫爬蟲的方法是用腳本直接對目標網站進行訪問,而且只對目標數據進行采集,訪問速度很快,這樣目標網站很容易就識別出你是爬蟲,然后把你封鎖了。這個時候,為了更加像人瀏覽網站,需要一個控制器來控制瀏覽器,這樣就可以避開封鎖,很多難爬的網站也可以輕而易舉的抓數據了。
我們就是通過一個叫做Selenium的工具做到模擬人瀏覽瀏覽器的,當然,Selenium不僅如此,它還是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統之上。測試系統功能——創建回歸測試檢驗軟件功能和用戶需求。支持自動錄制動作和自動生成 .Net、Java、Perl等不同語言的測試腳本。
針對不同的瀏覽器,控制底層的邏輯實現不同,因此,不同的瀏覽器需要下載不同的驅動,這有點類似于連接到不同的數據庫時需要不同的數據庫驅動一樣,這里提供一個谷歌瀏覽器的驅動下載鏈接:谷歌瀏覽器驅動。
2. 元素定位之XPath
XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基于XML的樹狀結構,提供在數據結構樹中找尋節點的能力,在實際開發自動化腳本過程中,XPath的使用是最多的一種方法。關于XPath的其他內容,讀者可以自行百度。
這里主要介紹一下如何獲取某一個元素的XPath,例如,我們以獲取百度首頁的搜索文本框填入搜索內容后點擊搜索按鈕距離。
上述操作對于沒有接觸過谷歌瀏覽器的讀者可能有一定的困難,如果有不懂可以評論區留蘭。
copy xpath后,直接黏貼,可以看到如下的路徑字符串:?
//*[@id="kw"]為了實現搜索,我們也獲取一下“百度一下”按鈕的XPath:?
//*[@id="su"]3. 搜索內容
下面演示一下如何打開瀏覽器并輸入搜索“中秋快樂”的。
3.1 添加依賴
首先,建立一個maven項目,并在pom.xml中添加依賴的jar包:
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.4.0</version> </dependency>接著,編寫我們主要的代碼:
3.2?獲取驅動對象
/** * 獲取Chrome驅動 * * @param path 路徑 * @return * @throws Exception */ public static WebDriver createChromeWebDriver(String path) throws Exception {if (path == null || "".equals(path)) {throw new Exception("配置錯誤, 沒有配置:chrome path");}System.getProperties().setProperty("webdriver.chrome.driver", path);WebDriver webDriver = new ChromeDriver();webDriver.manage().timeouts().pageLoadTimeout(1200, TimeUnit.SECONDS);webDriver.manage().window().setSize(new Dimension(1024, 768));return webDriver; }3.3?搜索
/** * 搜索 * * @param key 關鍵字 */ public static void search(WebDriver driver, String key) {driver.get("http://baidu.com/");WebElement elementKey = driver.findElement(By.xpath("//*[@id=\"kw\"]"));elementKey.sendKeys(key);WebElement elementClick = driver.findElement(By.xpath("//*[@id=\"su\"]"));elementClick.click(); }3.4?主函數?
public static void main(String[] args) {WebDriver webDriver;try {webDriver = createChromeWebDriver("webdrivers\\chromedriver.exe");search(webDriver, "中秋快樂");} catch (Exception e) {e.printStackTrace();} }3.5?完整代碼和效果?
package com.clawer.logintest;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver;/*** 百度搜索*/ public class App {public static void main(String[] args) {WebDriver webDriver;try {webDriver = createChromeWebDriver("driver\\chromedriver.exe");search(webDriver, "中秋快樂");} catch (Exception e) {e.printStackTrace();}}/*** 創建Chrome** @param path 路徑* @return* @throws Exception*/public static WebDriver createChromeWebDriver(String path) throws Exception {if (path == null || "".equals(path)) {throw new Exception("配置錯誤, 沒有配置:chrome path");}System.getProperties().setProperty("webdriver.chrome.driver", path);WebDriver webDriver = new ChromeDriver();webDriver.manage().timeouts().pageLoadTimeout(1200, TimeUnit.SECONDS);webDriver.manage().window().setSize(new Dimension(1024, 768));return webDriver;}/*** 搜索* * @param key 關鍵字*/public static void search(WebDriver driver, String key) {driver.get("http://baidu.com/");WebElement elementKey = driver.findElement(By.xpath("//*[@id=\"kw\"]"));elementKey.sendKeys(key);WebElement elementClick = driver.findElement(By.xpath("//*[@id=\"su\"]"));elementClick.click();} }?4.?報錯處理
unknown error: call function result missing 'value',網上關于這個錯誤的說法是chrome版本和driver的版本不一致,因此,筆者這里建議升級chrome,并下載對應的驅動。
Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 38667 Only local connections are allowed. 九月 13, 2019 2:27:01 下午 org.openqa.selenium.remote.ProtocolHandshake createSession 信息: Detected dialect: OSS org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value'(Session info: chrome=76.0.3809.100)(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 81 milliseconds Build info: version: '3.4.0', revision: 'unknown', time: 'unknown' System info: host: 'MicroWin10-2025', ip: '192.168.44.45', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_131' Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f), userDataDir=C:\Users\ADMINI~1\AppData\Local\Temp\scoped_dir8664_25666}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=76.0.3809.100, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}] Session ID: 879a1a7546fff18bd185a2a8a54c6b48at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671)at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:272)at org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:96)at com.clawer.logintest.App.search(App.java:52)at com.clawer.logintest.App.main(App.java:20)?
總結
以上是生活随笔為你收集整理的【java】Selenium爬虫控制谷歌浏览器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器人总动员片尾曲歌词_机器人总动员中的
- 下一篇: 金海佳学C++primer 练习9.4/