route127の日記: Webdriverで画像URL一覧(edge時代のスクレイピング)
配信だけだと思ってたシェンムーが唐突にMX火曜19時台(ジーズフレーム枠)で放送開始されて録画予約してたがHDDに余裕がなく、今夜のMXDBZ(フリーザ編大詰め)を録画しつつチバテレで白黒アンジャッシュを見る為に「早く帰って録画したシェンムー見ねば」と思いながら残業していた。
それはそうと先日のMSIEスレでIEがCOMサーバとしては生き残ってる云々の話があったけれどもスクレイピングでもその内使われなくなっていくんじゃないかなあとは思った。
というのも既に標準搭載となったcurlとMSが提供するmsedgedriverを用いればedgeが操作できるんだよな。
(だからといって急にIEの代替が進むというわけではないと思うが。)
などと知ったかぶって書いてはみたが、curlでwebdriverが操作できると知ったのは割と最近だったので腕試しにperlとchromedriverでyahooのトップページから画像URLを一覧するスクリプトを書いてみた。
use strict;
use warnings;
use JSON::PP;
use Data::Dumper;
my $port = '9515';
my $json;
my $hash;
$json = `curl -sS localhost:$port/session -d "{""capabilities"":{}}"` || die "can't start session.\n";
#print $json;
#print Dumper decode_json $json;
$hash = decode_json $json;
my $session = $hash->{value}{sessionId} || die "missing session ID.\n";
#die $session;
my $url = 'https://www.yahoo.co.jp';
`curl -sS localhost:$port/session/$session/url -d "{""url"":""$url""}"`;
$json = `curl -sS localhost:$port/session/$session/elements -d "{""using"":""css selector"",""value"":""img""}"`;
#die $json;
$hash = decode_json $json;
print join qq/\n/,
map{$_->{value}}
map{decode_json $_}
map{`curl -sS $_`}
map{"localhost:$port/session/$session/element/$_/attribute/src"}
map{values %$_}@{$hash->{value}};
バッククォートではなくCapture::Tinyとか使うほうがお上品かもしれないがまあ練習なので。
webdriverにcurlでjsonを投げ付けて帰ってきたjsonをパース、というのを繰り返しているだけではある。
perlにもWebDriver::Tinyがあったりするが敢えてそれを用いずバッククォートでcurl繰り出してたらひとまずedge & msedgedriver & VBAでスクレイピングできそうな気はしてきた。
webdriverというのはSeleniumのパーツみたく思ってたけどW3Cで標準化されてたのか。
だからchromiumベースではないFF向けにもgeckodriverなんかがあるのか。
試してみたが若干挙動が違う。
Webdriverで画像URL一覧(edge時代のスクレイピング) More ログイン