哈囉大家好,這裡是覺得 Java 超級龜毛的小編過路君子
同樣的功能,Python3 不用額外設定什麼,直接呼叫即可使用,Java 還要設定一堆。
如果各位有去網路上搜尋過相關資料的話,應該是能發現有另外一個專門為 Java 設計的輕量化瀏覽器 HtmlUnil。
但是小編實際使用起來的心得是:HtmlUnil 對 Javascript 的支援度非常非常非常差,簡單的 JS 渲染是沒有問題的,但是如果遇到那種使用 class 做初始化頁面的 JS,就有極高的機率失敗。
所以後來小編決定使用目前主流的瀏覽器 Firefox 來直接擷取並渲染網頁,那麼小編也就在這裡順手附上所有軟體的版本一覽表:
軟體 | 版本 |
Java | 17.0.3.1 |
Linux | Centos7.9.2009 |
Maven | 3.8.5 |
Firefox | 101.0b6 |
geckodriver | 0.31.0 |
selenium firefox driver | 4.1.4 |
Step 1. 更新以及安裝必要的軟體
因為 Firefox 有一些依賴包,而且這些依賴包並非最小安裝內預設安裝包,所以我們必須先確認並安裝這些依賴包。
yum install -y yum yum install -y dnf dnf install -y wget dnf install -y bzip2 dnf install -y gtk3 dnf install -y alsa-lib-devel
Step 2. 安裝 Firefox
安裝 Firefox 有兩種方式,一種是直接使用 dnf install firefox,另一種是去鏡站下載資源包自行安裝。
這邊小編會採用第二種方式,也就自行到鏡站去下載資源包來用。
各位可以自行找尋相關的鏡站,那小編在這邊使用的是這個鏡站:http://ftp.mozilla.org/pub/firefox/releases/。
wget http://ftp.mozilla.org/pub/firefox/releases/101.0b6/linux-x86_64/zh-TW/firefox-101.0b6.tar.bz2 tar -xf firefox-101.0b6.tar.bz2 mv ./firefox /usr/local/ ln -fs /usr/local/firefox/firefox /bin/firefox ln -fs /usr/local/firefox/firefox /usr/local/bin/firefox
Step 3. 安裝 Firefox Dirver
我們在這邊會使用 geckodriver 這個 dirver 來驅動 Firefox,而在這邊小編是到 Github 頁面去下載的:https://github.com/mozilla/geckodriver/releases。
wget https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz tar -xf geckodriver-v0.31.0-linux64.tar.gz mv ./geckodriver /usr/local/bin/ ln -fs /usr/local/bin/geckodriver /bin/geckodriver
Step 4. 安裝 Java 以及 Maven
畢竟 Maven 是需要由 Java 來驅動,所以這兩個一起安裝應該也很正常。
Java 下載點:https://www.oracle.com/java/technologies/downloads/。
Maven 下載點:https://maven.apache.org/download.cgi。
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz tar -xf jdk-17_linux-x64_bin.tar.gz mv jdk-17.0.3.1/ /usr/local/ ln -fs /usr/local/jdk-17.0.3.1/bin/java /bin/java ln -fs /usr/local/jdk-17.0.3.1/bin/javac /bin/javac ln -fs /usr/local/jdk-17.0.3.1/bin/java /usr/local/bin/java ln -fs /usr/local/jdk-17.0.3.1/bin/javac /usr/local/bin/javac wget --no-check-certificate https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz tar -xf apache-maven-3.8.5-bin.tar.gz mv apache-maven-3.8.5 /usr/local/ ln -fs /usr/local/apache-maven-3.8.5/bin/mvn /bin/mvn ln -fs /usr/local/apache-maven-3.8.5/bin/mvn /usr/local/bin/mvn
Step 5. 創建 Maven 專案
可以使用 Maven 內建的建構式來創立專案,也可以使用 mkdir 和 touch 來慢慢做,這邊小編採用下 mkdir 等指令的方式來土法煉鋼創建出整個專案。
那小編所使用的基本概念來自這邊:【Maven】如何創建一個簡單可執行的JAR檔@小編過路君子。
cd ~ mkdir -p webpage/src/main/java/editor/passing/jinzan cd webpage/ mkdir src/resources touch pom.xml touch src/main/java/editor/passing/jinzan/index.java
pom.xml 的內容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>editor.passing.jinzan</groupId> <artifactId>packageJAR</artifactId> <version>1.0.0</version> <name>pixiJS-web Maven Webapp</name> <url>http://maven.apache.org</url> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-firefox-driver</artifactId> <version>4.1.4</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>editor.passing.jinzan.index</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.7.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins> </build> </project>
index.java 的內容
package editor.passing.jinzan; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxDriverLogLevel; public class index { public static void main(String [] args) { // 設定驅動軟體位置 System.setProperty("webdriver.gecko.driver", "/bin/geckodriver"); // 設定 Firefox FirefoxOptions firefoxOptions = new FirefoxOptions(); firefoxOptions.setHeadless(true); firefoxOptions.setLogLevel(FirefoxDriverLogLevel.FATAL); FirefoxDriver driver = new FirefoxDriver(firefoxOptions); try { // 請求這個頁面 driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS); driver.get("https://n.sfs.tw/content/index/15833"); // 很重要,不能省,雖然省了一樣可以顯示結果 // 但是會報錯,嚴重影響到 wicket 等等軟體的執行 // 然後驅動程式直接卡死在後台,還要用 killall 殺掉 Thread.sleep(3000); // 顯示渲染後的頁面結果 System.out.println(driver.getPageSource()); } catch(Exception error) {;} finally {driver.quit();} } }
Step 6. 打包並執行此 Maven 專案
mvn package java -jar target/packageJAR-1.0.0.jar
然後就可以看到最終結果了,如果要截取其他網頁,只要將上方 index.java 程式碼中的網址替換即可。
(所有圖片點擊都可以放大、變高清)
後記
只是單純用 Maven 打包小編覺得還算相對簡單,之後小編真正要做的是將此功能部署至 Wildfly 內,小編敢打百分之兩百的保證,絕對會不相容,一定要做微調。
因為上面的方法 Firefox 和 geckodriver 是直接安裝在 Linux 系統內,可以直接呼叫,小編猜想 Wildfly 和 Wicket 應該是不會讓小編這麼輕鬆地去呼叫系統指令。
2022年05月22日 更新:
小編錯怪 Wildfly 和 Wicket 了,以上的程式碼可以直接複製使用。