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取出需要的資料內容