deep link 連絡先 過去ログ検索 いろいろ upload トイレ チャット 2ショット アンケ−ト 2 掲示板 envcheck @フるセえリ メモちょう
文字コードによるURLエンコード結果の違い 例:「あした」 shift-jis→%82%a0%82%b5%82%bd euc-jp →%a4%a2%a4%b7%a4%bf utf-8 →%e3%81%82%e3%81%97%e3%81%9f
> $urlで指定したサイトの内容を$dataに。
> use LWP::UserAgent;
> my $ua = LWP::UserAgent->new;
> $ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
> local $data='';
> my $request = HTTP::Request->new('GET' , $url);
> $request->header('Referer', $url);
> my $response = $ua->request($request , sub {$data .= shift;} , 4096);
> print $response->status_line;
> print "\n";
こうだな
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
my $request = HTTP::Request->new('GET' , $url);
$request->header('Referer', $url);
my $response = $ua->request($request);
my $data = $response->content;
print $response->status_line;
print "\n";
参考:2004/10/03(日)06時14分00秒
つーか use LWP::Simple; my $data=get($url); でいいだろ(笑)よくないか
$urlで指定したサイトの内容を$dataに。
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
local $data='';
my $request = HTTP::Request->new('GET' , $url);
$request->header('Referer', $url);
my $response = $ua->request($request , sub {$data .= shift;} , 4096);
print $response->status_line;
print "\n";
参考:2003/11/12(水)20時46分58秒
どんな文字コードでもutf8に変換 guess_encodingはutf8のときには落ちるので、 !ref($enc)ならutf8と強引に解釈。 use Encode qw/ from_to /; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; my $enc = guess_encoding( $data ); from_to( $data , $enc->name , 'utf8' ) if ( ref($enc) );
フォーム入力データの受け取りとデコード。
とりあえずutf8もsjisもうまくいった。euc-jpも大丈夫でしょう
use CGI;
$CGI::POST_MAX=400; #POSTデータサイズの上限(バイト)
$CGI::DISABLE_UPLOADS = 1; #ファイルアップロードのPOSTを拒否
my $query = new CGI;
my $data = $query->param('form_name');
まちがえた。ただしくはこっちだ。
@bに含まれるものを@aから除外する
my %temp_b = map { $_ => 1 } @b;
@a = grep {! exists $temp_b{$_}} @a;
@bに含まれるものを@aから除外する
%temp_b = map { $_ => 1 } @b;
@a = grep {! exists $b{$_}} @a;
> やっとくと何気に見た目が良くなるかもしれない処理 修正 $text =~ s/<.*?>//gi; $text =~ s/^\s+//; $text =~ s/\s+$//; $text =~ s/\s\s+/ /g; $text =~ s/"|"|"/"/g; $text =~ s/'|'/'/g; $text =~ s/ / /g; $text =~ s/</</g; $text =~ s/>/>/g; $text =~ s/&/&/g; 参考:2003/11/12(水)21時13分36秒
配列から重複した要素を取り除く。さらに登場回数をカウント
my %count;
@array = grep(!$count{$_}++, @array);
http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique
マルチスレッド処理 http://derangeworld.hp.infoseek.co.jp/source/multithread.txt
文字列を比較するときに全角半角の違い、大文字小文字を違いを意識したくない
なら、比較直前に半角にそろえて英文字は全部小文字にしなきゃいけない。けど、
シフトJISだとなかなかうまくいかないのよねー。だからEUCにするよ、おれは。
--------------------
my $from = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!”#$%&’()=^¥|{}:;+*?_/<>−';
my $to = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@!"#$%&\'()=^\|{}:;+*?_/<>-';
&jcode::convert ( \$from , 'euc' );
&jcode::convert ( \$data , 'euc' );
&jcode::tr( \$data , $from , $to);
$soft =~ tr/A-Z/a-z/;
--------------------
やっとくと何気に見た目が良くなるかもしれない処理 -------------------- $data =~ s/\"\;/\"/g; $data =~ s/\ \;/ /g; $data =~ s/\&\;/\&/g; $data =~ s/\<\;/</g; $data =~ s/\>\;/>/g; $data =~ s/^\s+//; $data =~ s/\s+$//; $data =~ s/\s\s+/ /g; $data =~ s/<.*?>//gi; --------------------
で、肝心のデータの抜き出し処理だけどなにげに一番めんどくさい。 一番簡単なのがHTMLファイルをそのまま配列に入れて、 1行ずつマッチングさせていくだけで済むとき。 きれいなHTMLならこれで大丈夫。 でも汚いときはchompで改行コードを取っていったん全部くっつけて 1つの変数に入れる。その後、特徴的な部分でsplitして配列に入れる。 (例えば抜き出したい各項目の先頭に●があるなら/●/でsplit)。 その後、1つずつマッチングさせていく。 -------------------- JISとかEUCのときは、 &jcode::convert ( \$data , 'sjis' ); で、シフトJISに変換してからマッチング(ほかのに合わせてもいいけど)。 UTF-8のときは、 use Encode qw/ from_to /; from_to( $data, 'UTF-8', 'shiftjis' );
メール送信はこんなかんじで。mimew.plはどこかで手にいれとくこと。 $bodyに本文、$subjectに題名 -------------------- require "./mimew.pl"; #SMTPサーバ名 my $mailhost='localhost'; #自分のメールアドレス my $mailadd =''; #送信先のメールアドレス my $toadd = ''; #メールソフトの名前 my $mailer ='Becky! ver. 2.06.02'; $subject = mimeencode( jcode'jis($subject) ); $body = jcode'jis($body); my $head = "From: $mailadd\nTo: $toadd\nX-Mailer: $mailer\nSubject: $subject\nContent-Type: text/plain; charset=iso-2022-jp\n\n"; my $send = "$head$body\n"; use Net::SMTP; my $smtp = Net::SMTP->new($mailhost); $smtp->mail($mailadd); $smtp->to($toadd); $smtp->data(); $smtp->datasend($send); $smtp->dataend(); $smtp->quit; --------------------
プロクシ通したいときは(例では、プロクシは127.0.0.1:8080にしとく)
LWP::UserAgentの場合は
$ua->proxy('http', 'http://127.0.0.1:8080/');
をmy $ua = LWP::UserAgent->new;のあとにでも追加。
HTTP::Liteの場合は
$http->proxy ( '127.0.0.1:8080' );
を$http->reset();のあとにでも追加。
で、最近はPPMでインストールしなくても使えるLWPをメインに使ってます。
------------------
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
my $request = HTTP::Request->new('GET' , $url);
$request->header('Referer', $url);
my $response = $ua->request($request , $file);
#return ($response->status_line);
print $response->status_line;
print "\n";
------------------
RefererとかUserAgentをいじらないなら
LWP::Simple;
my $response = getstore($url, $file);
で動くはず。
(ためしてない)
最初にウェブからのデータ取得だけども、SOCKSたたくのも面倒なんで、ActivePerlのPPMでHTTP::Liteを入れて作ったのがこんなもん。
$urlと$referer渡せば$fileで指定したファイルにデータが保存されます。
------------------
use HTTP::Lite;
my $http = new HTTP::Lite();
$http->reset();
$http->add_req_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$http->add_req_header('Referer', "$referer");
my $request = $http->request("$url");
if ($request eq "200") {
my $data = $http->body();
open (OUT,">$file");
binmode (OUT);
print OUT $data;
close(OUT);
}
------------------
スクリプトの種類によっては$requestが302のときに
$http->headers_array()からLocationヘッダからURL取って再接続してます
いろんなサイトからデータを取得して、ウェブにアップロードしたりメールしたり してるわけですが、Perlスクリプトを書いて、それをwindowsのタスクに登録して 自動で動かしてます。スクリプトの書き方のまー分からないこと(笑)。とはいえ、 せっかくちょっとはノウハウがたまったので多少は披露しようかと。 環境はwindows2000+ActivePerl。面倒くさいっていうかよく分からないので、 オブジェクトとかクラスとかそういうのはほとんど使ってないし、速く動かすた めの最適化もしてません。とりあえず動けばいいしさ。例外処理もタイムアウト もほとんどしてないしね。
以上は、現在登録されている新着順1番目から19番目までの記事です。これ以下の記事はありません。
くずはすくりぷと Final Beta #3 (Preview Release 2)+α