** 雖然現在一切似乎都有效,但這絕對是一項正在進行的工作。 **
對於加速閱讀計劃,有必要了解學生正在閱讀的書籍的要點和其他細節。這些可以在 arbookfind.co.uk 上找到,但當嘗試對大量書籍進行編目時,網站不支援 API 會帶來困難。事實上,該網站需要設定 cookie 才能存取搜尋引擎。
這個儲存庫保存了我為克服此限制所做的各種努力。這裡代碼的目的是獲取 ISBN(列印或掃描的)並查找書籍詳細資訊。這是透過使用phantomjs抓取他們的網站並以可用格式傳回資訊來實現的。作為後備方案,如果在 arbookfind 網站上找不到訊息,腳本還將嘗試存取 Google Books API。
目前我正在嘗試兩種不同的方法來呼叫程式和格式化結果。這些可能會在某個時刻合併到一個腳本中,但目前我將它們分開。方法如下:
下面是程式產生的 JSON 輸出的縮寫版本。如果您編寫自己的處理程序或使用 http 伺服器版本,這就是您將得到的結果。 CSV 用戶端僅取得此資訊並將其原封不動地插入 CSV 檔案中。如果沒有找到特定屬性的信息,仍將添加該信息。但是,如果在書中根本找不到任何訊息,則僅傳回 isbn,不會設定其他屬性。
{
"author" : "Rowling, J.K. " ,
"category" : "Fiction" ,
"imageURL" : "http://somewhere.com/image.jpg" ,
"interest" : "Middle Years" ,
"isbn" : "9750747532743" ,
"lang" : "EN" ,
"level" : "2.0" ,
"pages" : "223" ,
"points" : "19.0" ,
"publishedDate" : "1997" ,
"publisher" : "Bloomsbury Publishing" ,
"quizNumber" : "210738" ,
"ranking" : "3" ,
"series" : "Harry Potter; " ,
"summary" : "Harry thinks he is an ordinary boy till he finds out he is a wizard. First in the series." ,
"title" : "Harry Potter and the Philosopher's Stone" ,
"topic" : "Award Winners/Nominee..." ,
"words" : "77325"
}
雖然這種方法的程式碼不太漂亮,但它確實有效。使用phantomjs呼叫腳本後,它會提示您尋找 ISBN。產生的資訊只會在控制台上進行匯總 - 如果找到書名,則會顯示書名。所有其他資訊都儲存到在腳本的目前工作目錄中建立的兩個檔案之一中。
每次搜尋後,腳本都會要求輸入新的 ISBN。要結束腳本,只需輸入空白 ISBN。
###執行中
phantomjs arfinder-cli-csv.js
到目前為止也可以工作,儘管程式碼再次需要工作。當腳本執行時,它會開啟內部phantomjs Web 伺服器並偵聽連接埠8080。想要的數字來查找。例如訪問http://localhost:8080/9780439023528,它將以JSON格式傳回有關該書的資訊。
仍在處理要傳回的 http 程式碼,但目前如果您在路徑中使用無效字符,則會傳回 401 錯誤。如果 ISBN 無效或處理過程中發生錯誤,將傳回 404 錯誤。如果 ISBN 有效,則會傳回一個字串化的 JSON 對象,其中包含收集到的所有資訊。如果沒有 ISBN 的可用信息,則該物件將僅包含 ISBN 值本身。
###執行中
phantomjs arfinder-http-json.js
如果您想在自己的腳本中使用該程式碼,那麼目前呼叫它非常容易 - 請參閱下面的範例。
var arfinder = import('./core/arfinder-core);
var isbn = 1234567890; // the isbn you are looking for.
core.searchByISBN(isbn, function (result) {
// do something with the result.
// only call this if you want to
// close phantomjs and stop.
core.exit();
});
如果您想添加更多處理程序,以便在找不到書籍詳細資訊的情況下,它將檢查另一個相當直接的來源。在 core/handlers 資料夾中使用合理的名稱建立模組。建立一個導出函數,該函數採用兩個參數 - isbn 和結果的回呼。請記住,處理程序應傳回的標準化欄位顯示在 core/datamapping/core-datamapping.js 中。所有欄位都應該存在,即使它們是空字串。
function mySearch(isbn, callback) {
// Write what you want here.
// When complete you should call the callback function with
// the JSON formatted results as a parameter. If you can't
// find the information then pass null or call the function
// without supplying the parameter - as below.
callback();
}
// Export your function from the module.
module.exports.mySearch = mySearch;
接下來編輯同一資料夾中的 handlers.js 檔案。匯入您的模組並變更最後匯出的陣列(請參閱範例),以便將您的函數新增至其中。請注意,搜尋是按照數組的順序執行的,一旦處理程序傳回一些結果,就不會呼叫以下處理程序。
var arBookFind = require("./arfinder-handlers.js");
var googleBooks = require("./google-handlers.js");
var mySearch = require("./mySearch-handlers.js")
module.exports = [arBookFind.arBookSearch, googleBooks.googleBookSearch, mySearch.mySearch];