** Хотя сейчас кажется, что все работает, работа над этим определенно продолжается. **
Для программы ускоренного чтения необходимо знать баллы и другие детали книг, которые читают студенты. Их можно найти на arbookfind.co.uk, но при попытке каталогизировать большое количество книг тот факт, что веб-сайт не поддерживает API, создает трудности. Действительно, сайт требует установки файла cookie для доступа к поисковой системе.
В этом репозитории хранятся мои различные усилия по преодолению этого ограничения. Целью кода здесь является получение ISBN (напечатанного или отсканированного) и поиск сведений о книге. Это достигается за счет использования phantomjs для очистки веб-сайта и возврата информации в удобном для использования формате. В качестве запасного варианта сценарии также попытаются получить доступ к API Google Книг, если на веб-сайте arbookfind не будет найдена информация.
В настоящее время я экспериментирую с двумя разными методами вызова программы и форматирования результата. В какой-то момент они могут быть объединены в один сценарий, но на данный момент я храню их отдельно. Методы следующие:
Ниже приведена сокращенная версия вывода 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 и прослушивает порт 8080. Чтобы использовать сервер, перейдите по адресу http://localhost:8080/{isbn} в своем веб-браузере, где вы заменили часть isbn на нужный вам номер. для поиска. Например, перейдите по адресу 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];