fix Aleph scraper
[Biblio-Z3950.git] / Aleph.pm
1 package Aleph;
2
3 use warnings;
4 use strict;
5
6 use MARC::Record;
7 use Data::Dump qw/dump/;
8
9 use base 'Scraper';
10
11 sub diag {
12         print "# ", @_, $/;
13 }
14
15 # Koha Z39.50 query:
16 #
17 # Bib-1 @and @and @and @and @and @and @and @or
18 # @attr 1=8 isbn-issn 
19 # @attr 1=7 isbn-issn 
20 # @attr 1=4 title 
21 # @attr 1=1003 author 
22 # @attr 1=16 dewey 
23 # @attr 1=21 subject-holding 
24 # @attr 1=12 control-no 
25 # @attr 1=1007 standard-id 
26 # @attr 1=1016 any
27
28 # LCC - Klasifikacija Kongresne knjižnice 
29 # LCN - Signatura Kongresne knjižnice
30 # DDC - Deweyjeva klasifikacija 
31 # TIT - Naslovi 
32 # AUT - Autori 
33 # IMP - Impresum
34 # SUB - Predmetnice
35 # SRS - Nakladnička cjelina 
36 # LOC - Lokacija 
37 # WRD - Riječi 
38 # WTI - Riječi u polju naslova 
39 # WAU - Riječi u polju autora 
40 # WPE - Riječi u polju individualnog autora 
41 # WCO - Riječi u polju korporativnog autora 
42 # WME - Riječi u polju sastanka 
43 # WUT - Riječi u polju jedinstvenog naslova 
44 # WPL - Riječi u polju mjesta izdavanja 
45 # WPU - Riječi u polju nakladnika 
46 # WSU - Riječi u polju predmetnica 
47 # WSM - Riječi u predmetnicama MeSH-a 
48 # WST - Riječi u polju status
49 # WGA - Riječi u geografskim odrednicama 
50 # WYR - Godina izdavanja
51
52 sub usemap {{
53         4               => 'WTI',
54         1003    => 'WTI',
55         16              => 'CU',
56         21              => 'SU',
57 #       12              => '',
58 #       1007    => '',
59 #       1016    => '',
60 }};
61
62
63 sub search {
64         my ( $self, $query ) = @_;
65
66         die "need query" unless defined $query;
67
68         my $url = 'http://161.53.240.197:8991/F?RN=' . rand(1000000000);
69         # fake JavaScript code on page which creates random session
70
71 diag "get $url";
72
73         my $mech = $self->{mech} || die "no mech?";
74         $mech->get( $url );
75
76 diag "advanced search";
77
78         $mech->follow_link( url_regex => qr/find-c/ );
79
80 diag "submit search $query";
81
82         $mech->submit_form(
83                 fields => {
84                         'ccl_term' => $query,
85                 },
86         );
87
88         my $hits = 0;
89         if ( $mech->content =~ m{ukupno\s+(\d+).*(do\s+(\d+))}s ) {
90                 $hits = $1;
91                 $hits = $2 if $2 && $2 < $1; # correct for max. results
92         } else {
93                 diag "get't find results in ", $mech->content;
94                 return;
95         }
96
97 diag "got $hits results, get first one";
98
99         $mech->follow_link( url_regex => qr/set_entry=000001/ );
100
101 diag "in MARC format";
102
103         $mech->follow_link( url_regex => qr/format=001/ );
104
105         return $hits;
106 }
107
108
109 sub next_marc {
110         my ($self,$format) = @_;
111
112         my $mech = $self->{mech} || die "no mech?";
113
114 print $mech->content;
115
116         if ( $mech->content =~ m{Zapis\s+(\d+)}s ) {
117
118                 my $nr = $1;
119
120 diag "parse $nr";
121
122                 my $marc = MARC::Record->new;
123
124                 my $html = $mech->content;
125                 my $hash;
126
127                 sub field {
128                         my ( $f, $v ) = @_;
129                         $v =~ s/\Q&nbsp;\E/ /gs;
130 warn "# $f\t$v\n";
131                         $hash->{$f} = $v;
132                         my ($i1,$i2) = (' ',' ');
133                         ($i1,$i2) = ($2,$3) if $f =~ s/^(...)(.)?(.)?/$1/;
134                         my @sf = split(/\|/, $v);
135                         shift @sf;
136                         @sf = map { s/^(\w)\s+//; { $1 => $_ } } @sf;
137 diag "sf = ", dump(@sf);
138                         $marc->add_fields( $f, $i1, $i2, @sf ) if $f =~ m/^\d+$/;
139                 }
140
141                 $html =~ s|<tr>\s*<td class=td1 id=bold[^>]*>(.+?)</td>\s*<td class=td1>(.+?)</td>|field($1,$2)|ges;
142                 diag dump($hash);
143
144                 my $id = $hash->{SYS} || die "no SYS";
145
146
147
148                 my $path = "marc/$id.$format";
149
150                 open(my $out, '>:utf8', $path);
151                 print $out $marc->as_usmarc;
152                 close($out);
153
154                 diag "created $path ", -s $path, " bytes";
155
156                 diag $marc->as_formatted;
157
158                 $nr++;
159
160                 die if $nr == 3; # FIXME
161
162                 $mech->follow_link( url_regex => qr/set_entry=0*$nr/ );
163
164                 return $marc->as_usmarc;
165         } else {
166                 die "can't fetch COMARC format from ", $mech->content;
167         }
168
169 }
170
171 1;