File Coverage

blib/lib/WWW/Scraper/ISBN/TWKingstone_Driver.pm
Criterion Covered Total %
statement 31 49 63.2
branch 0 6 0.0
condition n/a
subroutine 9 9 100.0
pod 1 1 100.0
total 41 65 63.0


[% ... %]
line stmt bran cond sub pod time code
1             # ex:ts=8
2              
3             package WWW::Scraper::ISBN::TWKingstone_Driver;
4              
5 1     1   1153 use strict;
  1         3  
  1         41  
6 1     1   6 use warnings;
  1         2  
  1         41  
7              
8 1     1   6 use vars qw($VERSION @ISA);
  1         12  
  1         146  
9             $VERSION = '0.02';
10              
11             #--------------------------------------------------------------------------
12              
13             =head1 NAME
14              
15             WWW::Scraper::ISBN::TWKingstone_Driver - Search driver for TWKingstone's online catalog.
16              
17             =head1 SYNOPSIS
18              
19             See parent class documentation (L)
20              
21             =head1 DESCRIPTION
22              
23             Searches for book information from the TWKingstone's online catalog.
24              
25             =cut
26              
27             #--------------------------------------------------------------------------
28              
29             ###########################################################################
30             #Library Modules #
31             ###########################################################################
32              
33 1     1   8 use WWW::Scraper::ISBN::Driver;
  1         1  
  1         28  
34 1     1   1547 use WWW::Mechanize;
  1         188974  
  1         43  
35 1     1   930 use Template::Extract;
  1         692  
  1         24  
36 1     1   797 use Text::Iconv;
  1         3106  
  1         71  
37              
38             ###########################################################################
39             #Constants #
40             ###########################################################################
41              
42 1     1   9 use constant QUERY => 'http://search.kingstone.com.tw/Result.asp?SE_Type=ISBN&k=%s';
  1         2  
  1         494  
43              
44             #--------------------------------------------------------------------------
45              
46             ###########################################################################
47             #Inheritence #
48             ###########################################################################
49              
50             @ISA = qw(WWW::Scraper::ISBN::Driver);
51              
52             ###########################################################################
53             #Interface Functions #
54             ###########################################################################
55              
56             =head1 METHODS
57              
58             =over 4
59              
60             =item C
61              
62             Creates a query string, then passes the appropriate form fields to the Kingstone
63             server.
64              
65             The returned page should be the correct catalog page for that ISBN. If not the
66             function returns zero and allows the next driver in the chain to have a go. If
67             a valid page is returned, the following fields are returned via the book hash:
68              
69             isbn
70             title
71             author
72             book_link
73             image_link
74             pubdate
75             publisher
76             price_list
77             price_sell
78              
79             The book_link and image_link refer back to the Kingstone website.
80              
81             =back
82              
83             =cut
84              
85             sub search {
86 1     1 1 1858 my $self = shift;
87 1         2 my $isbn = shift;
88 1         11 $self->found(0);
89 1         24 $self->book(undef);
90              
91 1         14 my $url = sprintf(QUERY, $isbn);
92 1         10 my $mechanize = WWW::Mechanize->new();
93 1         16834 $mechanize->get($url);
94 0 0         return undef unless($mechanize->success());
95              
96             # The Search Results page
97 0           my $template = <
98            
99             [% ... %]
100             101             END
102              
103 0           my $extract = Template::Extract->new;
104 0           my $data = $extract->extract($template, $mechanize->content());
105              
106 0 0         return $self->handler("Could not extract data from TWKingstone result page.")
107             unless(defined $data);
108              
109 0           my $book_link = $data->{book_link};
110 0           $mechanize->get($book_link);
111              
112 0           my $content = $mechanize->content();
113 0           $content =~ /(table width="980" border="0" align="center" .*form name="form2")/s;
114 0           $content = Text::Iconv->new("utf-8", "big5")->convert($1);
115              
116 0           $template = <
117            
118             [% title %][% ... %]
119             作  者:[% ... %]>[% author %][% ... %]
120             出版社:[% ... %]>[% publisher %][% ... %]
121             ISBN:[% isbn %]
[% ... %]
122             出版日:[% pubdate %]
123             定  價:[% price_list %] 元
[% ... %]
124             特  價:<[% ... %] [% price_sell %]
125             END
126              
127 0           $data = $extract->extract($template, $content);
128              
129 0 0         return $self->handler("Could not extract data from TWKingstone result page.")
130             unless(defined $data);
131              
132 0           $data->{pubdate} =~ s/[ \n\r\t]*//g;
133              
134 0           my $bk = {
135             'isbn' => $data->{isbn},
136             'title' => $data->{title},
137             'author' => $data->{author},
138             'book_link' => $book_link,
139             'image_link' => "http://www.kingstone.com.tw".$data->{image_link},
140             'pubdate' => $data->{pubdate},
141             'publisher' => $data->{publisher},
142             'price_list' => $data->{price_list},
143             'price_sell' => $data->{price_sell},
144             };
145              
146 0           $self->book($bk);
147 0           $self->found(1);
148 0           return $self->book;
149             }
150              
151             1;
152             __END__