[精讚] [會員登入]
124

【Firefox \ Maven】[Headless](Linux) 如何使用Maven打包並驅動Firefox

有時候我們需要取得渲染後的網頁,當然是直接呼叫瀏覽器出來用啦

分享此文連結 //n.sfs.tw/15833

分享連結 【Firefox \ Maven】[Headless](Linux) 如何使用Maven打包並驅動Firefox@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2022-05-22 18:28:38 最後編修
2022-05-13 22:26:53 By 過路君子
 

哈囉大家好,這裡是覺得 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 了,以上的程式碼可以直接複製使用。

END

你可能感興趣的文章

【Raspberry Pi/樹梅派】(gcc 10) 如何安裝 gcc & g++ 需要的時間非常久,不愧是gcc的編譯

【教程】[HTML](進階版)如何在手機上編輯電子書(epub)預覽介面 可能會有人認為電子書(epub)只能用電腦來開啟、編輯,其實不是的,手機也可以編輯喔!

【C++】class練習 — 檢測該字串是否為迴圈 第一次的C++結構式寫法,雖然以後應該會見怪不怪,但畢竟是第一次所以還是想保存下來

【自製-製作epub輔助工具】(Sigil) content產生器 能交給程式快速結束的地方就不要自己手動浪費時間了吧。

【JDA/discord bot】取得頻道第一筆或最新(最後一筆)的歷史訊息 在不處理訊息的先後順序下取得相關的歷史訊息

【Vim】解決貼上文字時出現過多空格的問題 換了新系統,有時候就算重裝軟體並且複製了設定檔也還是會出現非常奇怪的現象

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

【手遊介紹】小品手遊─寶箱是我的!(SUMMONER'S GREED) 輕鬆無腦的塔防遊戲,殺時間本小編推薦的遊戲之一

高捷少女:小穹與果仁巧克力㊤ 阿敏突然輕笑一聲,從櫃臺拿來一個塑膠餐盒,打開給大家看。「這是小穹烤的餅乾,妳們吃吃看就知道她為什麼不想講了。」小穹變得緊張起來。「阿敏,妳怎麼還留著呀?」艾米莉亞、婕兒與耐耐各自拿了一塊,把夾著奶油

高捷少女:小穹與果仁巧克力㊦ 「如果妳跟一個女生同班三年,看過她午休流口水跟狼吞虎嚥地吃午餐,就算變成高捷代言人,也很難把她當女神的啦!」她說,小穹氣得搶走她義大利麵裡的蝦子,其他人笑得花枝招展。

高捷少女:購票大作戰① 「各位乘客,本班機即將降落,感謝各位乘客的搭乘……」隨著空中小姐的廣播音,那架飛機逐漸降落在地面,裡面的乘客們也紛紛開始整理自己的行李。 那個有著歐美人五官的少女抓緊包包,看著外面的小港機場,臉上緩緩

高捷少女:購票大作戰② 一個不好的預感浮現,艾米莉亞開始檢查屋子四處。窗戶跟陽台都有關好,也沒有被打開的跡象。但一股無形的壓力,開始在寂靜的公寓中蔓延,她不安地嚥一下喉嚨。最後,她走向那扇窗戶,那前天晚上,白龍為了逃脫,而撞