phpQueryを使って、commandlinefu.comからCommandLine Tipsを取得してみる

2019-02-07PHP

背景

コマンドラインからWebサイトのスクレイピングを行う必要がありました。

Goutte を使ってスクレイピングを行ったことがありました。
けれどもあまり直感的に実装できずハマった思いがあるため、もう少し使いやすいライブラリはないものかと探してみました。
代わりに良さそうなライブラリを見つけたのでこちら ( electrolinux/phpquery · GitHub ) を使ってみることにしました。

検証を兼ねて、 commandlinefu.com から CommandLine Tips を抜き出してみることにしました。

2019-02-07 追記

  • commandlinefu.com のHTMLの構成が変更されているみたいです。ご注意ください。

環境

$ bash -version
GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ php -v
PHP 5.5.28 (cli) (built: Aug 31 2015 12:17:07)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies

インストール

事前準備

Composer がインストールされていることが前提となります。
インストールされていない場合はすぐにインストールしましょう!

準備ができたら

以下のコマンドを実行します。
少し時間がかかるので、気長に待ちましょう。

$ composer global require electrolinux/phpquery

正常にインストールできましたら早速スクリプトをコーディングしてみましょう。

スクリプトをコーディング

はじめの6行はほぼ固定です。
スクレイピング対象のWebページのURLだけが毎回変わることになるでしょう。

コードの詳細までは説明しませんが、 jQuery を使ってWebページをゴニョゴニョしたことがある方には馴染み深いものになっています。

#terminal-display-main 要素内の .one-liner というdivタグが、1つ1つのtipsになっています。

<?php

require getenv('HOME') . '/.composer/vendor/autoload.php';
$dom = phpQuery::newDocument(file_get_contents(
    'http://www.commandlinefu.com/commands/browse/25'
));
pq($dom)->find('#terminal-display-main')->find('.one-liner')->each(function ($it) {
    echo '========================================', PHP_EOL;
    echo '$ ', trim(pq($it)->find('div.command')->text()), PHP_EOL;
    echo '', PHP_EOL;
    echo trim(pq($it)->find('div.summary')->text()), PHP_EOL;
    echo '', PHP_EOL;
    echo '', PHP_EOL;
});

結果

実行してみます。

$ php commandlinefu.php

========================================
$ rename 's/ //g' *
remove all spaces from all files in current folder
========================================
$ ls -1 | while read a; do mv "$a" `echo $a | sed -e 's/\ //g'`; done
remove all spaces from all files in current folder
========================================
$ grep -Pooh .*t..r,.* /etc/init.d/*
Get a quote from Pooh
========================================
$ debsecan --format detail
List known debian vulnerabilities on your system -- many of which may not yet be patched.
========================================
$ bar() { foo=$(ls -rt|tail -1) && read -ep "cat $foo? <y/n> " a && [[ $a != "n" ]] && eval "cat $foo" ;}
do anything with the last created (touched, accessed) file in the current dir
...

あまり表示されすぎるので、ある程度切ったほうがよいかもしれません。

ひとこと

Goutte よりは組みやすいです。

2019-02-07PHP