2012年5月15日火曜日

特許システムshareresearchからSDI配信結果を自動取得する

会社の特許システムは日立の shareresearch という特許検索用Webシステム。

使いやすいシステムなのだが、SDI検索配信(事前に検索式を登録しておくと、週次でメール配信される)の際に、複数の検索式を登録しておくと、重複する特許がある場合が多い。

いままでは一つずつみていたのだが、面倒なので重複する特許を自動で取り除いた結果を自動取得するPerlスクリプトを書いた。

流れは、WWW:Mechanize で自動ログイン→SDI配信結果ページ→結果をたどって行きTableを取得→HTML::TreeBuilderでリスト化→重複特許を除いたリストを出力という手順。
参考になったのはこれらの書籍。


ソースは以下。ただし、配信結果が最新のもののみで、たどったページが1ページのときしか取得出来ないと思われます。

#!/usr/bin/perl

use WWW::Mechanize;
use Data::Dumper;
use HTML::TreeBuilder;

my $login = 'http://hostname/SR-C/Login/Login.aspx';
my $header = 'http://hostname/SR-C/Main/Header/Header.aspx';
my $id = 'ID'; #登録アドレス
my $pass = 'password'; #登録パスワード

my $mech = new WWW::Mechanize(autocheck => 1,cookie_jar => {});
$mech->agent_alias('Windows IE 6'); #IE6になりすます


$mech->get($login); #ログインページにアクセス
$mech->submit_form(
form_name => "Form1",
fields => {
G02_TextBox1 => $id, #ID入力
G02_TextBox2 => $pass, #パスワード入力
},
button => "Button1" #ログインボタンを押す
);

$mech->get("http://hostname/SR-C/Main/Search/ReservationSearchResult2.aspx"); #SDI配信結果ページへ
$txt = $mech->content;

@line = split("\n",$txt); #ページを行で分割
@btn = ();

foreach $row (@line){
if($row =~ m/javascript:PostBack_Btn1\((.+?)\)/){ #配信結果IDを取得
$no = $1;
push(@btn,$no);
}
}

foreach $docno (@btn){
$mech->get("http://hostname/SR-C/Main/Search/ReservationSearchResult2.aspx");
# SDI配信結果ページへ
$mech->submit_form(
form_name => "Form1",
fields => {
DocView => $docno
}
);
$mech->follow_link(tag=>"frame",name=>"main"); #フレームなのでメインページへ
$content = $mech->content; #結果の取得

my $tree = HTML::TreeBuilder->new();
$tree->parse($content);

@Kouho = $tree->look_down("class","Item_BunkenNo"); #公報番号
@Title = $tree->look_down("class", "Item_Hatsumei"); #発明
@Author = $tree->look_down("class", "Item_Syutugannin"); #出願人

foreach $kouhou_no (@Kouho){
$no = $kouhou_no->as_text;
$kouhou_title = shift(@Title);
$tit = $kouhou_title->as_text;
$kouhou_author = shift(@Author);
$aut = $kouhou_author->as_text;
$kouhou_row = $no.",".$tit.",".$aut; #CSV化
push(@list,$kouhou_row);
}
}

my %count;
@list = grep {!$count{$_}++} @list; #重複削除

foreach $out(@list){
print $out,"\n";
}

#ログアウト
$mech->get("http://hostname/SR-C/Main/Header/Header.aspx");
$mech->submit_form(
form_name => "Form1",
button => "Button0"
);
$mech->get("../../Login/Logout.aspx?LogoutButton=yes&LANG=ja");
exit;

0 件のコメント:

コメントを投稿