如何使用Perl将ISBN替换为MARC文件中的Google Books ID?

l0b*_*0b0 1 perl google-books isbn marc

我有一个包含MARC格式书籍数据的文件,其中一些是ISBN.我想将这些行替换为该ISBN的Google图书ID(如果存在).这是到目前为止的代码,它最终删除了这些代码:

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在使用自动化工具方面有点模糊:Books Data API推荐使用curl/wget等工具,但没有关于如何避免在使用此类工具时被阻止的说明.我也很确定我在ToS中看到一个条款,说用户无法发送自动查询,但我再也找不到了.这是讨论在他们的论坛.

Sin*_*nür 5

您最终不得不对用户代理撒谎的原因是您违反了Google的服务条款:不要这样做.

相反,请使用Google图书搜索API.

由于我对XML :: Atom,Data :: Feed,WWW :: OpenSearch等模块缺乏熟悉,下面的代码略有不足.但是,它应该提供一个良好的起点.

#!/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 : '';
}
Run Code Online (Sandbox Code Playgroud)

给定一个文本文件t.txt包含:

ISBN:0060930314
ISBN:9780596520106

它输出:

Google Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC