之前是從全國書目網搜尋書籍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取出需要的資料內容