2018年12月20日木曜日

JavaScript実行後のHTMLソースを取得する

とあるブログ(blog.jpドメインのlivedoorブログ)を定期的に確認し、更新があったら保存するような仕組みを作りたくなり、シェルスクリプトとwgetでなんとかしようと試行錯誤したのですが、取得したHTMLから記事のURLを抽出できませんでした。

おかしいなと思って取得したHTMLソースを見たところ、記事の中身や写真はすべてJavaScriptでレンダリングされているようです。
多分クローラー避けなんでしょうが、最近はこういうサイトが多くて嫌になります。

残念ながらwgetはJavaScriptを処理してくれないため、このままでは記事を抜き出すことは不可能です。
ということで、JavaScriptを実行した後のHTMLを取得する方法を調べてみたのですが、PhantomJSを使うのが一番簡単そうなので試してみました。

PhantomJSは、様々なOSのディストリビューションでパッケージとして提供されています。

Xubuntuでは、
sudo apt install phantomjs
FreeBSDでは、
pkg install phantomjs
でインストールすることが可能です。

使い方はこんな感じです。
phantomjs script.js ${url_target} ${user_agent}
「script.js」は、以下のような感じで記述します。
var system=require('system');
var webpage=require('webpage');
var url=system.args[1];
var user_agent=system.args[2];
var delay=3000;
var page=webpage.create();
page.settings.userAgent=user_agent;
page.open(url,function(status){
    setTimeout(function(){var html=page.evaluate(function()
    {return document.documentElement.outerHTML;});
    system.stdout.write(html);phantom.exit(0);},delay);})
PhantomJSが第一引数で指定した上記JavaScriptを実行してコンテンツを取得、保存します。

保存したHTMLから、無事に記事のURLを抽出できるようになりました。

尚、PhantomJSを使う以外にも、「Selenium+WebDriver+ブラウザ(ヘッドレスモード)」っていう選択肢もあるようです。
(ブラウザを実行させるためにXなどのGPU環境が必要になるなど、若干重た目かも…)

このように便利はPhantomJSですが、既に開発が終了しているようで、ちょっと残念です。

以下のページを参考にしました、ありがとうございました。
https://teratail.com/questions/19039

0 件のコメント:

コメントを投稿