كيف يمكنني استبدال ISBN مع معرف كتب Google في ملف Marc، باستخدام Perl؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

لدي ملف مع بعض بيانات الكتاب في مارك شكل، منها بعض الخطوط هي ISBNS. أرغب في استبدال هذه الخطوط مع معرف كتب Google لتلك ISBN، إذا كان موجودا. إليك الرمز حتى الآن، الذي ينتهي فقط بإزالة الخطوط:

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. يوصي أدوات مثل Curl / WGET، ولكن لا توجد تعليمات حول كيفية تجنب الحظر عند استخدام هذه الأدوات. أنا أيضا متأكد من أنني رأيت جملة في TOS قائلا للمستخدمين إرسال استفسارات تلقائية، لكن لا يمكنني العثور عليها مرة أخرى. هذا هو ناقش في منتدىهم.

هل كانت مفيدة؟

المحلول

أعتقد أن OP موجود على المسار الصحيح ويمكنه استخدام بطانة واحدة لهذا الغرض، ويحتاج فقط إلى استبدال بناء جملة أسلوب باش مع بناء جملة بيرل الصحيح. أعتقد أن هذا سيعمل (Newlines المضافة للقراءة):

    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}

يجب عليك الهروب (تحرير: يبدو أن Double Hearing يعمل) $ أو & الأحرف في عنوان URL.

نصائح أخرى

السبب في الانضمام إلى الاضطرار إلى الكذب حول وكيل المستخدم هو لأنك تنتهك Tos Google: لا تفعل ذلك.

بدلا من ذلك، استخدم بحث جوجل البحث API.

يعيق الرمز أدناه قليلا بسبب عدم الإلمام به وحدات مثل XML :: Atom., خلاصة البيانات, 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 : '';
}

إعطاء ملف نصي t.txt تحتوي:

ISBN: 0060930314 ISBN: 9780596520106

مخرجاتها:

معرف كتب Google: IOXFQLZSMK8C Books Books ID: LNVHI3TUNXSC
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top