Perl을 사용하여 MARC 파일에서 ISBN을 Google 도서 ID로 바꾸려면 어떻게 해야 합니까?

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

  •  13-09-2019
  •  | 
  •  

문제

책 데이터가 포함된 파일이 있습니다. 마크 형식이며 그 중 일부 줄은 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}

추신:Google은 자동화 도구 사용에 대해 약간 모호합니다.그만큼 도서 데이터 API 컬/wget과 같은 도구를 권장하지만 이러한 도구를 사용할 때 차단을 피하는 방법에 대한 지침은 없습니다.또한 ToS에서 사용자가 자동화된 쿼리를 보낼 수 없다는 조항을 본 적이 있지만 다시 찾을 수 없다고 확신합니다.이것은 논의됨 그들의 포럼에서.

도움이 되었습니까?

해결책

나는 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의 문자.

다른 팁

사용자 에이전트에 대해 거짓말을 하게 된 이유는 Google TOS를 위반했기 때문입니다.그러지 마세요.

대신 Google 도서 검색 API.

아래 코드는 다음과 같은 모듈에 대한 지식이 부족하여 약간 방해를 받습니다. XML::원자, 데이터 피드, WWW::열린검색.그러나 이는 좋은 출발점을 제공해야 합니다.

#!/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 Books ID:ioXFqlzsmK8C
Google Books ID:lNVHi3TunxsC
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top