ISBN -> búsqueda bookdata para rellenar una base de datos
-
20-09-2019 - |
Pregunta
Ok, queriendo base de datos de una pequeña biblioteca.
Sólo he tenido una experiencia limitada con las bases de datos, y ninguno con la consulta de un servidor web.
Voy a querer recuperar información como el título, editor, tal vez autor, descripción la forma más sencilla que puedo pensar dooing esto les está mirando hacia arriba a través del ISBN.
Me he encontrado isbndb.com antes, pero la API para acceder parece bastante complejo.
Me pregunto cómo debo ir haciendo esto.
Solución
Recientemente tuve que hacer exactamente esto, ya que nuestra biblioteca indexados a efectos del seguro. A continuación se muestra el código de la clase VBA Pirateé juntos:
Option Compare Database
dim BookTitle As String
dim BookTitleLong As String
dim BookAuthorsText As String
dim BookPublisherText As String
dim BookSummary As String
dim BookNotes As String
dim accessKey As String
Private Sub Class_Initialize()
'Your isbnDB access key'
accessKey = "PUT ACCESSKEY HERE"
End Sub
Property Get Title() As String
Title = BookTitle
End Property
Property Get TitleLong() As String
TitleLong = BookTitleLong
End Property
Property Get AuthorsText() As String
AuthorsText = BookAuthorsText
End Property
Property Get PublisherText() As String
PublisherText = BookPublisherText
End Property
Property Get Summary() As String
Summary = BookSummary
End Property
Property Get Notes() As String
Notes = BookNotes
End Property
Public Function Lookup(isbn As String) As Boolean
Lookup = False
Dim xmlhttp
Set xmlhttp = CreateObject("MSXML2.xmlhttp")
xmlhttp.Open "GET", "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False
xmlhttp.send
'Debug.Print "Response: " & xmlhttp.responseXML.XML'
Dim xmldoc
Set xmldoc = CreateObject("Microsoft.XMLDOM")
xmldoc.async = False
'Note: the ResponseXml property parses the server's response, responsetext doesn't
xmldoc.loadXML (xmlhttp.responseXML.XML)
If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") = 0) Then
MsgBox "Invalid ISBN or not in database"
Exit Function
End If
If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") > 1) Then
MsgBox "Caution, got more than one result!"
Exit Function
End If
BookTitle = xmldoc.selectSingleNode("//BookData/Title").Text
BookTitleLong = xmldoc.selectSingleNode("//BookData/TitleLong").Text
BookAuthorsText = xmldoc.selectSingleNode("//BookData/AuthorsText").Text
BookPublisherText = xmldoc.selectSingleNode("//BookData/PublisherText").Text
BookNotes = xmldoc.selectSingleNode("//BookData/Notes").Text
BookSummary = xmldoc.selectSingleNode("//BookData/Summary").Text
Lookup = True
End Function
Obtener una clave de API, pegar el código anterior (con la llave) en un nuevo módulo de clase en el editor de VBA (Insertar> Módulo de clase) y el nombre del "ISBN" módulo. También es necesario agregar una referencia a "Microsoft XML" en el editor de VBA (Herramientas> Referencias)
Se puede probar que funciona con el siguiente fragmento de código en un módulo VBA normales:
Public Function testlookup()
Dim book
Set book = New isbn
book.Lookup ("0007102968")
Debug.Print book.Title
Debug.Print book.PublisherText
End Function
A continuación, sólo tiene que escribir "testlookup" en la ventana inmediata (Ver> Ventana Inmediato). Usted debe ver una respuesta de:
The Times book of quotations
[Glasgow] : Times Books : 2000.
isbnDB puede devolver más de los datos que se acumulan en la clase anterior, leer la referencia de la API aquí: http: / /isbndb.com/docs/api/ y adaptar la clase a sus necesidades.
He encontrado este artículo muy útil para explicar cómo utilizar xmlhttp desde dentro de acceso: http://www.15seconds.com/issue/991125.htm
Las páginas de MSDN en XML DOM Métodos y Objeto XMLHttpRequest también eran útiles (porque soy un nuevo usuario sólo puedo publicar dos enlaces activos, que tendrá que reemplazar los puntos en los siguientes URL):
Microsoft MSDN com / es-es / library / ms757828 (v = VS.85) .aspx
Microsoft MSDN com / es-es / library / ms535874 (v = vs.85) .aspx
Otros consejos
Esta es una respuesta incompleta, pero servirán para iniciar (no he trabajado con datos XML como el retorno).
Este código tiene lo básico:
Dim oHttp As Object
Set oHttp = CreateObject("Microsoft.XMLHTTP")
oHttp.Open "GET", "https://isbndb.com/api/books.xml?access_key=YourKey&results=texts&index1=isbn&value1=YourISBN", False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.Send vbNullString
Debug.Print oHttp.responseText
La respuesta de la página web se encuentra en la propiedad .responseText del objeto XMLHTTP. La forma de proceso que está más allá de mí. Sé que uno de los gurús de grupos de noticias de acceso ha publicado un tutorial sobre el consumo de servicios web de acceso, pero no puedo localizarlo. Este artículo podría tener algo que ver con el tema:
La API ISBNdb.com parece simple. La siguiente petición debe recuperar la información que desea ... simplemente sustituya su clave de acceso para "yourkey" y el ISBN para "YourISBN".
https://isbndb.com/api/books.xml?access_key=YourKey&results=texts&index1=isbn&value1=YourISBN
La respuesta es XML que contiene información sobre el único libro cuyo ISBN que ha enviado.
Puede utilizar el XML MARC 21 de la Biblioteca del Congreso.
Hice lo mismo que usted, la construcción de una base de datos para alojar a mi biblioteca. Escaneado en el ISBN recoge los datos de esta URL http://z3950.loc.gov:7090/voyager? version = 1.1 y operación = searchRetrieve y consulta = YOUR_ISBN y MaximumRecords = 1
Los datos de respuesta a continuación se llena en un formulario con todos los datos. Usted no necesita una cuenta, esa URL.
La respuesta viene en XML (como se ha mencionado), y se puede analizar a partir de ahí el uso de cualquier idioma que desee (mi elección pasa a ser PHP).
¿Qué idioma se utiliza? Es necesario un programa / script para presentar un formulario en el que puede introducir el ISBN, lo que a continuación, obtener los datos de isbndb.com y poblar la base de datos. He utilizado el API un poco, pero no por algún tiempo, y es bastante sencillo.