一般ユーザーで任意のperlバージョンを導入・実行できるperlbrewを導入しました。
その中のモジュールでWeb::Scraperという物があります。任意のページをスクレイプする時に利用する物なのですが、インストールした際に通常はscraperというコマンドも同時に組み込まれるはずなのですがperlbrew環境ではインストールされません。
今回はそのscraperを導入するというお話です。
と言ってもこのハックはもう既にこの世に存在しています。
このページには、同じく一般ユーザーで任意のperlバージョンを実行できるplenvというperlbrewに似たシステムにscraperを導入するやり方が書かれています。
perlbrewの場合は”scraper コマンドを作成”の配置するパスを~/perl5/perlbrew/binで作成します。これで一応scraperは実行できます。
”よしよしこれでスクレイピングが捗るぞ”と色々やっていたのですが、とあるサイトで落とし穴が。元々のWeb::Scraperではスクレイプできないソースもあるのです。困った困った。
色々と原因を探っていたのですが、どうもソースをスクレイプしようとすると日本語のエンコードに問題があるらしくうまく動いてくれませんでした。
どうにかならないかと別角度で検索していたらこちらの方が代替え出来る方法を書かれておりました。
元々は高速化する為に書かれているのですがソースを改変するとうまく動いてくれたので紹介しようと思います。
このページをよく読むと元々のソースに2行程追加すると良いとの事。早速導入してみましょう。
~/perl5/perlbrew/bin/scraperを改変します。元のソースからのdiffです。
--- scraper.org 2021-06-24 22:53:36.802370005 +0900 +++ scraper 2021-06-24 22:54:28.163558703 +0900 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl use strict; use warnings; @@ -8,7 +8,13 @@ use Data::Dumper; use HTML::Entities; use URI; use Web::Scraper; +use HTML::TreeBuilder::LibXML; use YAML; +use utf8; + +HTML::TreeBuilder::LibXML->replace_original(); + +binmode STDOUT, ":utf8"; sub WARN() { return sub { @@ -33,7 +39,8 @@ my(@stack, $source); my $stuff = process_args($ARGV[0]) or die "Usage: scraper [URI-or-filename]\n"; -my $term = Term::ReadLine->new("Web::Scraper"); +#my $term = Term::ReadLine->new("Web::Scraper"); +my $term = Term::ReadLine->new("HTML::TreeBuilder::LibXML"); my $scraper = scraper { run_loop($_[0], $term) }; $scraper->user_agent->env_proxy; @@ -95,8 +102,11 @@ return <<CODE; #!$Config{perlpath} use strict; use Web::Scraper; +use HTML::TreeBuilder::LibXML; use URI; +HTML::TreeBuilder::LibXML->replace_original(); + my $var = $stuff; my \$scraper = scraper { $code_stack
必要ないかもしれないコードもあるかと思いますが私の環境では動いてくれました。
高速化&エンコード関連でお困りの方はぜひ導入してみて下さい。
コメント