ラベル perl の投稿を表示しています。 すべての投稿を表示
ラベル perl の投稿を表示しています。 すべての投稿を表示

2015年9月7日月曜日

perl でmysql データベースに入力

perl を使って mysql を操作しています。csv ファイル(カンマ区切りのファイル)を読み込んで、mysql データベースに入力(インサート)しています。

以下は、そのサンプルです。sample.csv というファイルを1行づつ読み込み、split という機能でカンマで区切ってあるデータをそれぞれ取り出してから、mysql データベースに入力しているものです。


perl を使って mysql データベースにデータを入力する方法については、以前にも紹介させていただいたことがあります。



#!/usr/bin/perl
use strict;
use warnings;
use Web::Scraper;
use URI;
use Encode;
use strict;
use warnings;
use utf8;
use DBI;


open(IN,"sample.csv");
while( my $Meigara0 = <IN> )
{
chomp($Meigara0);

my @Meigara_list;
   $Meigara_list[0] = '';
   @Meigara_list = split(/\,/,$Meigara0);
my $price    =$Meigara_list[1];
my $kataban  = $Meigara_list[0];
my $spec = $Meigara_list[2];
my $url      = $Meigara_list[3];

my $dbuser="root";
my $dbpass="xxxx";
my $dbname="sample_db";

my $dsn = "DBI:mysql:$dbname";
my $dsh = DBI -> connect ( $dsn, $dbuser, $dbpass , { RaiseError => 0 } );
   $dsh->do("set names utf8");
my $sth;

my $sql="insert into sedori (flug,price,kataban,spec,url) values (-99,'" . $price . "','" . $kataban . "','" . $spec . "','" . $url . "');";

   $sth = $dsh->prepare($sql);
   $sth->execute;
  my $num_rows = $sth->rows;
  print "num_rows:" . $num_rows . "\n";


}

2015年5月31日日曜日

ブラウザでの作業を自動化する iMacros

FireFox などブラウザでの作業を自動化する iMacrosを使い始めました。
あるサイトに接続して情報を取り出してファイルに保存するという処理を自動化するためです。

なお同じ処理を以前は、Perlによるスクレイピングというやり方でおこなっていました。

2015年4月5日日曜日

perl と awk で標準エラー出力


perl で標準エラー出力に出力するには次のサンプルのようにします。


print STDERR "helo\n";


gawk で標準エラー出力するには次のサンプルのようにします。


print "helo"  > "/dev/stderr"



2015年4月4日土曜日

Perl でエラー処理(eval)

Perl を使って Webページのスクレイピングを行なっておりますが、パターンにマッチしなかった時にエラー終了してしまい、それをどう処理(ハンドリング)するのか悩んでおりました。

インターネットで調べたところ eval を使ってエラーハンドリングすることができることがわかりました。

以下のサンプルプログラムでは、Web::Scraper を使って、スクレイピングを行なっていますが、パターンにマッチしなかった場合には、エラーを表示したのちに、終了コード 1で終了します。





#!/usr/bin/perl

use strict;
use warnings;
use Web::Scraper;
use URI;
use Encode;

sleep(10.5);

  my $KATAKAKU = $ARGV[0];
  my $url = "http://xxxxxxxx.com/search?i=All&kwd=" . $KATAKAKU;


my $scraper = scraper {

  process '//ul[@class="item_condition_list"]/li[@class="price"]','price[]' => 'TEXT';
  process '//span[@class="item_title"]/a[@class="original_link"]','asin[]' => '@href';
  process '//span[@class="item_title"]/a[@class="original_link"]','spec[]' => 'TEXT';

};


my $res;

eval{
  $res = $scraper->scrape(URI->new($url));
};
if ($@){
print "ERROR: $@";
exit 1;
}


  my @spec;
  my @price;
  my @asin;

eval {
   @spec = @{$res->{spec}};

    @price = @{$res->{price}};
    @asin  = @{$res->{asin}};
};
if ($@){
print "ERROR: $@";
exit 1;
}

 my $length = @price;


print "xxxxxxx_spec: ".encode('sjis',$spec[0])."\n";
print "xxxxxxx_price: ".encode('sjis',$price[0])."\n";
print "xxxxxxx_asin: ".encode('sjis',$asin[0])."\n";
print "array_length: " . $length ."\n";


Perl で cpan



Perl でスクレイピングを行なうために、Web::Scraper というモジュールを cpan でインストールしようとしましたが、はじめはうまくいきませんでした。なお、使用しているOSはLubuntu14.10 です。

cpan でのインストールがうまくいかない原因は、次のようなことでした。


- cpan を実行する際にスーパーユーザになっていなかった。
- make が使用できない。




次のようにすることで解決いたしました。

- cpan を実行する前に、su コマンドでスーパーユーザになる。
- sudo apt-get install make  というコマンドにより make をインストールしておく。



2015年4月3日金曜日

Perl で LWP

Webページの情報をそのままとってきたいという要望はあると思います。

そんな時には、Perl の LWP を使うと便利です。

以下のサンプルでは、引数に指定した URL のWebページのソース情報を出力します。





#!/usr/bin/perl -w

use strict;
use warnings;

use HTTP::Request::Common;
use LWP::UserAgent;

sub get_stock_price {

  my ($code) = @_;

  my $url = sprintf($code);



  my $response = LWP::UserAgent->new->simple_request(GET $url);
     print $response->content;

   return 0;
}


  print get_stock_price($ARGV[0]) . "\n";

2015年4月2日木曜日

Perl でスクレイピング

以前に、ヤフーのサイトから株の価格の情報を取り出すために、perl でスクレイピングを行なうサンプルを紹介させていただきました。

http://chaos-fractal.blogspot.jp/2012/12/perl-yahoo.html


最近になって、またPerl でスクレイピングを行なっております。現在、行なっているのは、ネットショップのサイトから、商品の情報を取り出して、テキスト形式のリストを作成するというものです。

「perl は言語仕様が変なので、困ることが多く、使わないほうがよいですよ。」と知人にアドバイスされたことがありますが、perl だと便利なこともあり、つい使ってしまいます。


スクレイピングのサンプル




#!/usr/bin/perl

use strict;
use warnings;
use Web::Scraper;
use URI;
use Encode;


 print STDERR "please input specail page number" ."\n";
 my $page_number = <STDIN>;
 chomp($page_number);

 my $url = 'http://shop.xxxxxxx.co.jp/dir/special/?page=' . $page_number . '&num=50';
 print STDERR $url . "\n";


my $scraper = scraper {
process '//table[@class="itemData"]/tr[1]/td[1]/input[1]','spec[]' => '@id';
process '//table[@class="itemData"]/tr[1]/td[2]','name[]' => 'TEXT';
process '//table[@class="itemData"]/tr[1]/td[3]','disc[]' => 'TEXT';
process '//table[@class="itemData"]/tr[1]/td[4]','price[]' => 'TEXT';

process '//table[@class="itemData"]/tr[1]/td[5]','fie5[]' => 'TEXT';
};

my $res = $scraper->scrape(URI->new($url));
my @spec = @{$res->{spec}};
my @name = @{$res->{name}};
my @disc = @{$res->{disc}};
my @price = @{$res->{price}};
my @fie5 = @{$res->{fie5}};
my $length = @name;

for ($_ = 0; $_ < $length; $_++){
        print encode('sjis',$spec[$_])."\n";
        print "spec: ". encode('sjis',$name[$_])."\n";
        print encode('sjis',$fie5[$_])."\n";
}







2014年7月13日日曜日

perl で sqlite データベースに接続

以下は、perl で sqlite データベースに接続するサンプルです。なお、予め cpan コマンドでDBD::SQLite を実行しておく必要がありました。







use strict;
use warnings;

use DBI;

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");

my $sth = $dbh->prepare("select * from book;");
$sth->execute;

while (my @row = $sth->fetchrow_array) {
  print join(', ', @row), "\n";
}

$dbh->disconnect;

2013年6月16日日曜日

Perl でインターネットとmysql に接続する


以下のサンプルはYahoo ファイナンスのデータから、株価のデータを取得して、それをmysql データベースに格納するためのPerl スクリプトです。

https://gist.github.com/cofearabi/5790670


mysql データベースには予め以下のようなSQL文で作成したテーブルを用意しておきます。データベース名:stock_db

DROP TABLE IF EXISTS `table_stock`;
CREATE TABLE table_stock (
  hiduke    varchar(10) NOT NULL default '2012/09/28' ,
  meigara   varchar(4 ) NOT NULL default '6954' ,
  svalue    int         ,
  hvalue    int         ,
  lvalue    int         ,
  evalue    int         ,
  amount    int         ,
  fvalue    int         ,
  UNIQUE(hiduke,meigara)
);



尚、株価を取得する銘柄を、zzz.txt という名前のファイルに書き込んでおく必要があります。以下はzzz.txtファイルの例です。4桁のコードを各行の先頭に書いておきカンマで区切ります。

------------------------------------

7203,TOYOTA,2900
6954,FANUC,12000
6753,SHARP,140
9984,SOFTBANK,2500
6758,SONY,700
6472,NTN,120
2730,EDION,300
9744,MEITEC,1500
5738,SUMIKEIKIN,60
5007,COSMO,140
4714,RISOH,5000
8001,ITOUCHUU,750
9437,NTT_DOCOMO,120000
8411,MIZUHO,120
6412,HEIWA,1200
8151,TOYOTECNIKA,800
7751,CANNON,2000
5105,TOYOGOMU,190
9501,TEPCO,120
9502,CHUUBU,800
6301,KOMATSU,1200
1306,1306,0
----------------------------------




2012年5月1日火曜日

Perl でファイルを読み込み一行づつ配列に格納するには

Perl でファイルを読み込み一行づつ配列に格納するには(以下の例では、/home/zzz.txtというファイルの中身を一行づつ読み出して表示し、配列に格納しています。最後には、格納した配列の中身を表示しています。)



例1
my @hairetu;
my $i = 0;

open(IN,"/home/zzz.txt");
while( my $Meigara = <IN> )
{
chomp($Meigara);
print $Meigara . "\n";
$hairetu[$i] = $Meigara;
$i = $i + 1

}

print @hairetu . "\n";
print $#hairetu . "\n";

$length = @hairetu;
# print $length;
for( $i=0 ; $i<@hairetu ; $i++ )
{
   print $hairetu[$i] . "\n";
}



例2
$FH = "/home/zzz.txt";
open FH;
@list = <FH>;
foreach $data_line( @list ){
 print $data_line;
}






例3
$datafile="/home/zzz.txt";
open(FH, $datafile);

@list = <FH>;

# 1行ごとに出力

foreach $data_line( @list ) {

print $data_line;

}