2021/06/09

Gg / 從GoogleBook、WorldCat、全國新書資訊網查詢ISBN

之前是從全國書目網搜尋書籍ISBN

但是這個網站好像蠻容易掛掉、沒反應

所以嘗試從其他網站查詢資訊

也試試看不同網站架構、資料型態的處理

GoogleBook、WorldCat 可以搜尋全世界的圖書,但是如果比較新近出版的不一定會有資料

全國新書資訊網只限於台灣出版的圖書,好處是在台灣新出版的書,在這邊都查得到

 

以下分別說明如何從這些網站查詢ISBN,以及抓取書籍資料的方式

Google Book

可以直接將搜尋字串帶入連結傳遞參數

https://www.googleapis.com/books/v1/volumes?q=isbn:9789864799190&qt=lang_switch&lang=zh-tw

得到的回傳書籍資料是JSON格式,可以用 JSON.parse( )解析內容

 

主要的結構與需要的資料

totalItems → 如果有資料的話為1,可以用來判斷是否要進行後面的資料寫出

items→資料型態是 key : value ,因為也只有1筆,所以可以用 items[0]來取出所有資料

  -volumeInfo→書籍資料都在這個屬性之下,資料型態也是 key : value ,在用屬性名稱取出對應的值

用 fetch( )必須在網址加上 &country=TW,才會取得中文的資料

如果直接用瀏覽器連結的話就不需要,應該是自動偵測瀏覽器語言

原本後面還有加Google Book API 的金鑰,但是不加這個也是可以抓到資料
 

WorldCat

也是直接將搜尋字串帶入連結傳遞參數

https://www.worldcat.org/search?q=bn:9789864799190&qt=lang_switch&lang=zh-tw

會得到網頁的搜尋結果,所以必須解析網頁內容

取出ID名稱為br-table-results的表格(table)

由於WorldCat是跨資料庫的搜尋,搜尋結果會列出資料庫裡符合的資料

所以如果有資料的話,只要抓出表格中的第一列(tr)就可以了

 

主要的流程是透過fetch( )取得網頁資料,再用外部資料庫Cheerio解析HTML

從中取出需要的表格-#br-table-results

再依據HTML內容分割所需要的欄位資料

網址最後帶的參數 &qt=lang_switch&lang=zh-tw,可以讓網站自動轉換語言

沒有加這個參數,除了書籍資料之外的資料都會是英文,例如:作者,會變成 author
 

全國新書資訊網

http://isbn.ncl.edu.tw/NEW_ISBNNet

這個是目前遇到最麻煩的網站,因為網站會用到 Cookie 以及會有多次重新導向

Status 302 表示會有重新導向

 

目前的處理方式

先fetch( )網站首頁 http://isbn.ncl.edu.tw/NEW_ISBNNet

抓取Cookie →PHPSESSID的值

原因在於網站在開啟之後就會自動生成 Cookie PHPSESSID

並且寫入HTML,例如:導覽列的分頁網址

這個PHPSESSID在之後都會跟著headers傳遞,會直接影響是否能抓取資料

可能網站後端有機制在驗證

 

所以先用外部資料庫Cheerio解析HTML,取得導覽列的網址,再拆解字串取得Cookie

設定成 headers裡的Cookie的值

備註:後來發現可以在第一次fetch( ) 用getAllHeaders()取得屬性名稱[“Set-Cookie”]的PHPSESSID

但是有時候會沒有這個值,只會回傳cookiesession1


 

再fetch( ) http://isbn.ncl.edu.tw/NEW_ISBNNet/main_ProcessLevel2.php?&Ptarget=5&GID=350

要注意的部分:雖然看起來點擊”書目資料庫”會在連結中帶入PHPSESSID

但是fetch( )時,必須將 PHPSESSID設定在headers,而不是網址字串

網址也會被轉向到 Location: H30_SearchBooks.php?&Pfuncid=281&Pact=init4Simple

 

然後再 fetch( ) http://isbn.ncl.edu.tw/NEW_ISBNNet/H30_SearchBooks.php?&Pact=DisplayAll4Simple

用POST方式帶入參數:headers、payload

payload就是搜尋字串

FO_SearchField0': 'ISBN','FO_SearchValue0': isbn,'FB_clicked': 'FB_開始查詢','FB_pageSID': 'Simple','FO_Match': '2','FO_每頁筆數': '10','FO_目前頁數': '1','FB_ListOri':''

其中的FO_SearchField0′: ‘ISBN’,是搜尋欄位,這邊就是ISBN

‘FO_SearchValue0’: isbn, isbn是自設儲存ISBN字串的變數

這樣就能夠傳回搜尋結果

 

 最後透過外部資料庫Cheerio解析HTML

如果順利取得資料的話,資料會在類別名稱為.table-searchbooks的表格之中

接下來就是分別中tr td取出需要的資料內容

2021/06/05

VBA / 使用Word VBA批次轉換成PDF 修改版

之前在 VBA / 使用Word VBA批次轉換PDF檔使用了一個批次轉換PDF的Word VBA

原理就是利用Word自身另存新檔為PDF的功能

藉由VBA程式將這個過程自動化完成

當初在檔案裡看到

 

所以想嘗試看看自己能不能做到這2個功能

1.流水號前置文字

2.自動檢查文件是否有追踪修訂顯示

 

首先遭遇到的問題是如何在Word裡增加表單

從Word的開發-控制項可以看到會有3種控制項

1.內容控制項,這個是可以跟其他人互動的表單元件

例如把完成後的檔案給其他人填寫,然後再利用限制編輯的功能

讓表單只能在控制器欄位輸入資料

延伸應用可以參考:

Word-使用控制項來限制輸入的內容與格式
透過表單控制項製作表單樣板,讓填寫資料更加便利與方便

2.舊表單 跟 3.ActiveX控制項,兩者很像

查到的資料是說舊表單可以不需要VBA就能夠操作;而ActiveX控制項的某些功能必須用到VBA來撰寫

兩者都可以跟VBA互動,所以使用上沒什麼差別

ActiveX控制項的屬性介面就跟VBA裡的一樣

開啟屬性視窗需要先點擊 “設計模式”,才能在ActiveX控制項文字欄位上按右鍵

 

點選”內容”就會出現屬性視窗,不過也可以直接按設計模式下面的”屬性”

     

 

舊表單的屬性介面就很明白的顯示哪些可以修改

 

不過在Excel裡,兩者的功能就會有很明顯的不同,可以參考這個網頁的說明

 

再來是處理VBA程式

Word 透過 VBA 取得、寫入表單的方式 跟 Excel 一樣

所以 1.流水號前置文字  只要取得勾選啟動這個功能的核取方塊回傳值

以及要放在檔名之前的前置文字的文字欄位值,

 

2.自動檢查文件是否有追踪修訂顯示,就必須知道Word VBA如何處理追踪修訂

Word VBA透過Revisions物件來處理檔案裡所有的修訂版本的屬性與方法

如果要處理所有修訂版本中的一個修訂紀錄,可以透過Revision物件

在這邊的處理是針對檔案內的所有修訂紀錄

1) 偵測是否有追蹤修訂的紀錄-Revisions.Count 屬性

2) 如果有,接受所有的追蹤修訂-Revisions.AcceptAll 方法

因為不想變動原始檔案,所以在這之前先另存一個工作檔

另外,要注意的是Word表格的儲存格,會有2個特殊字元

 

 

這2個特殊字元是  ASCII 13 Carriage Return, ASCII  7 Bell

所以取得資料之後要再用 Left( )去掉最後2個字元

 

測試看看結果

當Word檔裡有修訂紀錄

 

轉成PDF檔,檔名也增加了 自訂的前置文字123 跟 流水號001

 

經過處理之後的PDF檔,沒有修訂紀錄

 

除了這兩個主要的功能之外,也修改了一些小細節

例如:選取檔案的對話窗的預設路徑為桌面、檔案篩選方式

'設定顯示的副檔名
fd.Filters.Add "Word File", "*.doc, *.docx"

'設定檔案選取的預設路徑 桌面
fd.InitialFileName = "%USERPROFILE%\Desktop\"

之後有時間想再簡化原本的程式碼

因為有些判斷資料是否存在跟是否在最後一列的方式

感覺有點瑣碎,想試試看有沒有更直覺的方法