** Auch wenn jetzt alles zu funktionieren scheint, ist dies definitiv noch in Arbeit. **
Für das beschleunigte Leseprogramm ist es notwendig, die Punkte und andere Details der Bücher zu kennen, die die Schüler lesen. Diese sind auf arbookfind.co.uk zu finden. Wenn Sie jedoch versuchen, eine große Anzahl von Büchern zu katalogisieren, stellt die Tatsache, dass die Website keine API unterstützt, ein Problem dar. Tatsächlich erfordert die Website das Setzen eines Cookies, um auf die Suchmaschine zugreifen zu können.
Dieses Repository enthält meine verschiedenen Bemühungen, diese Einschränkung zu überwinden. Das Ziel des Codes hier besteht darin, eine ISBN (entweder getippt oder gescannt) zu nehmen und die Details eines Buches nachzuschlagen. Dies wird erreicht, indem Phantomjs verwendet werden, um ihre Website zu scannen und die Informationen in einem verwendbaren Format zurückzugeben. Als Fallback versuchen die Skripte auch, auf die Google Books-API zuzugreifen, wenn auf der arbookfind-Website keine Informationen gefunden werden.
Derzeit experimentiere ich mit zwei verschiedenen Methoden, um das Programm aufzurufen und das Ergebnis zu formatieren. Diese werden vielleicht irgendwann in einem Skript zusammengefügt, aber im Moment habe ich sie getrennt gehalten. Die Methoden sind wie folgt:
Nachfolgend finden Sie eine gekürzte Version der JSON-Ausgabe, die vom Programm erzeugt wird. Dies erhalten Sie als Ergebnis, wenn Sie Ihre eigenen Handler schreiben oder die http-Server-Version verwenden. Der CSV-Client übernimmt lediglich diese Informationen und fügt sie unverändert in eine CSV-Datei ein. Wenn für eine bestimmte Eigenschaft keine Informationen gefunden werden, werden diese trotzdem hinzugefügt. Wenn jedoch überhaupt keine Informationen zum Buch gefunden werden, wird nur die ISBN zurückgegeben und es werden keine anderen Eigenschaften festgelegt.
{
"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"
}
Obwohl der Code für diesen Ansatz nicht schön ist, funktioniert er. Sobald das Skript mit phantomjs aufgerufen wird, werden Sie aufgefordert, eine ISBN zum Nachschlagen einzugeben. Die resultierenden Informationen werden auf der Konsole nur zusammengefasst – der Buchtitel erscheint, wenn er gefunden wurde. Alle anderen Informationen werden in einer von zwei Dateien gespeichert, die im aktuellen Arbeitsverzeichnis des Skripts erstellt werden.
Das Skript fragt nach jeder Suche nach einer neuen ISBN. Um das Skript zu beenden, geben Sie einfach eine leere ISBN ein.
###Ausführen
phantomjs arfinder-cli-csv.js
Funktioniert derzeit auch, auch wenn der Code noch überarbeitet werden muss. Wenn das Skript ausgeführt wird, öffnet es den internen PhantomJS-Webserver und lauscht auf Port 8080. Um den Server zu verwenden, gehen Sie in Ihrem Webbrowser zu http://localhost:8080/{isbn}, wo Sie den isbn-Teil durch die gewünschte Nummer ersetzt haben nachschlagen. Gehen Sie beispielsweise zu http://localhost:8080/9780439023528 und es werden die Informationen über das Buch im JSON-Format zurückgegeben.
Ich arbeite immer noch daran, welche HTTP-Codes zurückgegeben werden sollen. Wenn Sie jedoch ungültige Zeichen im Pfad verwenden, wird derzeit ein 401-Fehler zurückgegeben. Wenn die ISBN ungültig ist oder bei der Verarbeitung ein Fehler auftritt, wird ein 404-Fehler zurückgegeben. Wenn die ISBN gültig ist, wird ein stringifiziertes JSON-Objekt zurückgegeben, das alle gesammelten Informationen enthält. Wenn für die ISBN keine Informationen verfügbar waren, enthält das Objekt einfach den ISBN-Wert selbst.
###Ausführen
phantomjs arfinder-http-json.js
Wenn Sie den Code in Ihren eigenen Skripten verwenden möchten, ist der Aufruf derzeit sehr einfach – siehe Beispiel unten.
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();
});
Wenn Sie weitere Handler hinzufügen möchten, sodass, wenn keine Buchdetails gefunden werden, eine andere Quelle überprüft wird, was wiederum ziemlich einfach ist. Erstellen Sie Ihr Modul im Ordner core/handlers mit einem sinnvollen Namen. Erstellen Sie eine Funktion zum Exportieren, die zwei Parameter benötigt – den isbn und den Callback für die Ergebnisse. Denken Sie daran, dass die standardisierten Felder, die die Handler zurückgeben sollten, in core/datamapping/core-datamapping.js angezeigt werden. Alle Felder sollten vorhanden sein, auch wenn es sich um leere Zeichenfolgen handelt.
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;
Bearbeiten Sie als Nächstes die Datei handlers.js im selben Ordner. Importieren Sie Ihr Modul und ändern Sie das am Ende exportierte Array (siehe Beispiel), sodass Ihre Funktion hinzugefügt wird. Bitte beachten Sie, dass die Suchvorgänge in der Reihenfolge des Arrays ausgeführt werden und sobald ein Handler einige Ergebnisse zurückgibt, werden die folgenden Handler NICHT aufgerufen.
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];