Comment puis-je remplacer le ISBN avec Google Books ID dans un fichier MARC, en utilisant Perl?

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

  •  13-09-2019
  •  | 
  •  

Question

J'ai un fichier avec des données de livre dans le format MARC , dont certaines lignes sont les numéros ISBN. Je voudrais remplacer ces lignes avec Google Livres ID de ce ISBN, si elle existe. Voici le code à ce jour, qui se termine juste en supprimant les lignes:

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

PS: Google sont un peu floue sur l'utilisation d'outils automatisés: Livres API de données recommande des outils comme curl / wget, mais il n'y a pas d'instructions sur la façon d'éviter d'être bloqué lors de l'utilisation de tels outils. Je suis aussi assez sûr d'avoir vu une clause ToS disant utilisateurs ne peuvent pas envoyer des requêtes automatisées, mais je ne peux pas le trouver à nouveau. Ceci est discuté dans leur forum.

Était-ce utile?

La solution

Je pense que l'OP est sur la bonne voie et pourrait utiliser une seule ligne pour cela, et a juste besoin de remplacer une syntaxe de type bash avec la syntaxe Perl correcte. Je pense que cela fonctionnerait (nouvelles lignes ajoutées pour une meilleure lisibilité):

    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}

Vous devez échapper. (Edit: double échappement semble fonctionner) les caractères $ ou & dans l'url

Autres conseils

La raison pour laquelle vous finissez par avoir à mentir au sujet de l'agent utilisateur est parce que vous violez TOS de Google: Ne pas faire

.

Au lieu de cela, utilisez le Google Book Search API .

Le code ci-dessous est un peu gêné par mon manque de familiarité avec des modules tels que XML :: Atom , données :: RSS , WWW :: OpenSearch . Cependant, il devrait fournir un bon point de départ.

#!/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 : '';
}

Étant donné un fichier texte contenant t.txt:

ISBN:0060930314
ISBN:9780596520106

il affiche:

Google Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top