Como posso substituir o ISBN com o Books ID Google em um arquivo de MARC, usando Perl?

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

  •  13-09-2019
  •  | 
  •  

Pergunta

Eu tenho um arquivo com alguns dados livro em MARC formato , dos quais algumas linhas são ISBN. Eu gostaria de substituir essas linhas com os livros ID Google de que ISBN, se ele existir. Aqui está o código até agora, o que acaba por remover as linhas:

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 são um pouco confuso sobre o uso de ferramentas automatizadas: A API Livros dados recomenda ferramentas como onda / wget, mas não há instruções sobre como evitar ser bloqueado quando o uso de tais ferramentas. Estou também certeza que eu vi uma cláusula em um ToS dizendo usuários não podem enviar consultas automáticas, mas não posso encontrá-lo novamente. Esta é discutido em seu fórum.

Foi útil?

Solução

Eu acho que o OP está no caminho certo e poderia usar uma frase para isso, e só precisa de substituir alguma sintaxe de estilo festa com a sintaxe Perl correta. Eu acho que isso iria funcionar (novas linhas adicionadas para facilitar a leitura):

    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}

Você tem que escapar. (Edit: a saída dupla parece funcionar) os personagens $ ou & na url

Outras dicas

A razão que você acabar por ter de mentir sobre o agente do usuário é porque você está violando TOS do Google:. Não faça isso

Em vez disso, use a API Google Book Search .

O código abaixo é um pouco prejudicado por minha falta de familiaridade com módulos como XML :: Atom , Data :: Alimentação , WWW :: OpenSearch . No entanto, ele deve fornecer um bom ponto 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 : '';
}

Dada uma t.txt arquivo de texto contendo:

ISBN:0060930314
ISBN:9780596520106

ele gera:

Google Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top