1

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 DataAPIはcurl/wgetのようなツールを推奨していますが、そのようなツールを使用するときにブロックされないようにする方法についての指示はありません。また、ToSに、ユーザーは自動クエリを送信できないという条項が表示されたと確信していますが、それを再度見つけることはできません。これは彼らのフォーラムで議論されています。

4

2 に答える 2

5

ユーザー エージェントについてうそをつくことになるのは、Google の TOS に違反しているためです。そうしないでください。

代わりに、Google Book Search APIを使用してください。

以下のコードは、 XML::AtomData::FeedWWW::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 : '';
}

t.txt以下を含むテキスト ファイルがあるとします。

ISBN:0060930314
ISBN:9780596520106

それは出力します:

Google ブックス ID:ioXFqlzsmK8C
Google ブックス ID:lNVHi3TunxsC
于 2009-11-03T17:09:07.430 に答える
1

OPは正しい方向に進んでおり、これにはワンライナーを使用できると思います.bashスタイルの構文を正しいPerl構文に置き換えるだけで済みます. これでうまくいくと思います(読みやすくするために改行を追加しました):

    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}

URL 内の$または文字をエスケープする必要があります (編集: ダブル エスケープが機能するようです) 。&

于 2009-11-03T15:59:15.220 に答える