Frage

Ich habe eine Datei mit einigen Buchdaten bekommt in MARC Format, von denen einige Linien sind ISBN-Nummern. Ich mag diese Zeilen mit der Google Books-ID dieser ISBN ersetzen, wenn es vorhanden ist. Hier ist der Code so weit, die nur die Linien zu entfernen endet:

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 ist ein bisschen unscharf auf der Verwendung von automatisierten Tool: Die Bücher Data API empfiehlt Werkzeuge wie curl / wget, aber es gibt keine Anweisungen, wie blockiert zu vermeiden, wenn solche Werkzeuge. Ich bin auch ziemlich sicher, dass ich eine Klausel in einem ToS sah sagen Benutzer keine automatisierten Anfragen senden kann, aber ich kann es nicht wieder finden. Dies ist diskutiert in ihrem Forum.

War es hilfreich?

Lösung

Ich denke, die OP auf dem richtigen Weg ist und einen Einzeiler dafür verwenden könnte, und brauche nur etwas bash-style-Syntax mit der korrekten Perl-Syntax zu ersetzen. Ich denke, dass dies funktionieren würde (Zeilenumbrüche hinzugefügt, um die Lesbarkeit):

    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}

Sie haben zu entkommen. (Edit: Doppel Entkommen scheint zu funktionieren) in der URL die $ oder & Zeichen

Andere Tipps

Der Grund, warum Sie über die User-Agenten liegen am Ende mit ist, weil Sie Google TOS verletzen: Tu das nicht

.

Verwenden Sie stattdessen die Google Book Search API .

unten Der Code wird leicht durch meinen Mangel an Vertrautheit mit Modulen behindert wie XML :: Atom , Data ::-Feed , WWW :: OpenSearch- . Es sollte jedoch einen guten Ausgangspunkt bieten.

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

eine Textdatei t.txt Gegeben enthalten:

ISBN:0060930314
ISBN:9780596520106

es gibt:

Google Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top