跨系統網頁自動化填寫做法

背景

上級單位需要管考目前管理處執行中的工程案件,建立農田水利設施工程管考系統(以下稱外部系統)供各管理處進行填報,然而管理處於前期便已建立工程管考E化系統(以下稱內部系統)做為內部資料的收集,監造單位需要在內部系統先進行填寫後,再由管理單位進入外部系統將內部系統資料再重新謄打一次。

為進行外部系統資料填報,最理想的狀況當然是能透過內部系統自身觸發器(Trigger)執行外部系統API發送,內部系統資料庫異動時也能一併修改到外部系統的內容。

然而今日沒有外部系統API使用,需要另外想辦法從原本的資料庫撈取資料進行網頁自動化填報才能省事,首先要確認內部系統的資料庫欄位是否能進行資料梳理,再者確認網頁自動化填報做法為何。


外部系統操作畫面

Fig1. 新增計畫工程

Fig2. 計畫工程成果

Fig3. 新增分項工程

Fig4. 分項工程成果

Fig5. 工程概要表填寫欄位(一)

Fig6. 工程概要表填寫欄位(二)

內部系統資料庫

經查外部系統相關資料欄位分散於內部系統資料庫(SQLserver)各個不同資料表,雖然透過JOIN的方式也可以產出一個滿接近可以直接輸入的成果,但筆者對於資料庫的操作經驗尚顯不足,期程迫在眉睫,只好先將內部系統相關各表先匯出成excel,再透過熟悉的VBA進行資料梳理,整理成未來網頁自動化填報待載入的內容。

為不影響既有資料庫運作,先請各同仁將欲填報資料內容填寫完後進行資料庫備份,於本地端重啟一個資料庫服務並導入備份內容進行後續操作。

資料梳理細節

外部系統頁面 欄位名稱 內部系統資料表
工程研提 工程編號(自訂) APMFORM
工程名稱
鄉鎮市
水路名稱列表(自訂)
分項工程 水路名稱 MONFORM
工程概要表 受益面積
改善類別
改善效益
用地情形
規劃情形
相關情形
農民意願
水源情形
水權情形
是否需配合斷水期施工
工程重要性
經費概估項目 MONFUND
現況照片及設計簡圖 MONFPIC

照片處理

在處理照片對映時,發現資料庫中的照片存成二進位,需先把二進位轉成圖片才有辦法進行後續處理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def get_photos():
conn = get_db_connection()
cursor = conn.cursor()

query="""

SELECT
mf.[MN_ID],
mf.[WRD_NAME],
mp.[PIC_FILE], -- 假設你想要選擇圖片欄位
mp.[PIC_PATH]
FROM
[CMPSGS].[dbo].[MONFORM] mf
JOIN
[CMPSGS].[dbo].[MONFPIC] mp
ON mf.[MN_ID] = mp.[MN_ID]
WHERE
mf.[ADD_DT] > '2024-11-01'

ORDER BY
mf.[MN_ID]
"""

cursor.execute(query)
# 獲取列名
columns = [column[0] for column in cursor.description]

# 將結果轉換為字典列表
results = [dict(zip(columns, row)) for row in cursor.fetchall()]

# print("Results:", results) # 新增這一行

# 將結果轉換為 DataFrame
df = pd.DataFrame(results)

for index, row in df.iterrows():

if index %3==0:
print(row["WRD_NAME"])
folder_name=row["WRD_NAME"]
os.makedirs("./data/"+folder_name, exist_ok=True)

with open("./data/"+folder_name+"/"+row["WRD_NAME"]+"-"+row["PIC_PATH"], "wb") as image_file:
image_file.write(row["PIC_FILE"])
print(str(index)+"...OK!")

cursor.close()
conn.close()

return df

Fig7. 資料夾安排(以渠道名稱為分類) Fig8. 資料夾內容(檔案名稱取為數字方便排序進行)


網頁自動化填報

原本想像中的Selenium會需要從無到有開啟一個網站後開始進行資料填寫,大多數的網站都會有帳號密碼驗證機制,甚至祭出驗證碼、選擇汽車圖片、移動滑鼠到指定位置...等反爬蟲機制來確認是否為機器人,但若網頁可以被接管繞開這些機制的話,那整個資料填報作業就會很有機會讓電腦代勞,這就是寫程式的趣味來源,當然還是要小心不能點太快,否則網站可能會負荷不過來。

Chrome

網頁瀏覽器,透過以下指令即可進行網站操作接管,需要根據自身電腦的chrome安裝路徑執行,建議將原本所開啟中的chrome畫面通通關閉後再執行以下指令。

  • WIN10

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" –remote-debugging-port=9222

  • WIN11

"C:\Program Files\Google\Chrome\Application\chrome.exe" –remote-debugging-port=9222

NOTE:如果仍然找不到瀏覽器的執行路徑,可以在原本桌面瀏覽器捷徑找尋內容

Fig9. 瀏覽器畫面

更多細節請參考.Selenium詳細操作步驟

操作DEMO