¿Cómo puedo reemplazar el ISBN con el Google Books ID en un archivo MARC, usando Perl?

StackOverflow https://stackoverflow.com/questions/1667926

  •  13-09-2019
  •  | 
  •  

Pregunta

Tengo un archivo con algunos datos de la libreta de noreferrer"> formato Libros API de datos de recomienda herramientas como rizo / wget, pero no hay instrucciones sobre cómo evitar ser bloqueados cuando se utiliza este tipo de herramientas. También estoy bastante seguro de que vi una cláusula de un ToS diciendo usuarios no pueden enviar consultas automatizadas, pero no puedo encontrar de nuevo. Esta es discutido en su foro.

¿Fue útil?

Solución

Creo que el PO está en el camino correcto y podría usar una sola línea para esto, y sólo tiene que reemplazar algunos de sintaxis al estilo de fiesta con la sintaxis correcta Perl. Creo que esto funcionaría (nuevas líneas añadidas para facilitar la lectura):

    perl -pe 's#ISBN(\w+)#qx(wget --output-document=- 
        --quiet --user-agent=Mozilla/5.0 
        "http://books.google.com/books\\?jscmd=viewapi\\&bibkeys=$1")#ge' \
        < 5-${file} > 6-${file}

Tienes que escapar. (Edit: el doble escape parece funcionar) o los $ & caracteres en la URL

Otros consejos

La razón por la que acaban de tener que mentir sobre el agente de usuario se debe a que usted está violando TOS de Google: No hacer eso

.

En su lugar, utilice el Google Book Search API .

El código siguiente es un poco obstaculizado por mi falta de familiaridad con módulos como XML :: Atom , de datos :: RSS , WWW :: OpenSearch . Sin embargo, se debe proporcionar un buen punto de partida.

#!/usr/bin/perl

use strict;
use warnings;

use Business::ISBN qw( valid_isbn_checksum );
use LWP::Simple;
use XML::Simple;

while ( <> ) {
    s/ISBN:([0-9]+)/'Google Books ID:' . get_google_id_for_isbn($1)/ge;
    print;
}

use Carp;

sub make_google_books_query {
    sprintf 'http://books.google.com/books/feeds/volumes?q=isbn:%s', $_[0];
}

sub get_google_id_for_isbn {
    my ($isbn) = @_;

    my $google_id = eval {
        defined(valid_isbn_checksum $isbn)
            or croak "Invalid ISBN: $isbn";

        my $query = make_google_books_query($isbn);
        my $xml = get $query;

        defined($xml)
            or croak "No response to <$query>";

        my $data = XMLin($xml, ForceArray => 1);
        my @ids = @{ $data->{entry}[0]{'dc:identifier'} };

        unless ("ISBN:$isbn" eq $ids[1]
                or "ISBN:$isbn" eq $ids[2] ) {
            croak "Invalid search results: '@ids'";
        }

        $ids[0];
    };

    defined($google_id) ? $google_id : '';
}

Dado un archivo de texto que contiene t.txt:

ISBN:0060930314
ISBN:9780596520106

da salida:

Google Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top