curlはHTTPをはじめとした様々な通信プロトコルに対応したデータ転送ツールです。
本日紹介する「CurlyQ」は、このcurlを内部的に利用するRuby製のスクリプトで、画像やリンクの抽出、要素の検索、ヘッダー情報の取得など、便利な追加機能を提供します。
出力は構造化データ「JSON」または「YAML」として出力され、必要なデータを簡単に抽出できるように設計されています。
以下、使用方法を説明します。
CurlyQの使用方法
CurlyQはRubyGemsとして作成されており、gemコマンドでインストールすることができます。
gem install curlyq
Homebrewを使用している場合、brew-gemによってインストールすることもできます。
brew install brew-gem brew gem install curlyq
curlyqの使用方法はcurlyq help
で確認可能です。
NAME curlyq - A scriptable interface to curl SYNOPSIS curlyq [global options] command [command options] [arguments...] VERSION 0.0.11 GLOBAL OPTIONS --help - Show this message --[no-]pretty - Output "pretty" JSON (default: enabled) --version - Display the program version -y, --[no-]yaml - Output YAML instead of json COMMANDS extract - Extract contents between two regular expressions headlinks - Return all links on URL's page help - Shows a list of commands or help for one command html, curl - Curl URL and output its elements, multiple URLs allowed images - Extract all images from a URL json - Get a JSON response from a URL, multiple URLs allowed links - Return all links on a URL's page scrape - Scrape a page using a web browser, for dynamic (JS) pages. Be sure to have the selected --browser installed. screenshot - Save a screenshot of a URL tags - Extract all instances of a tag
基本的には、curlyq コマンド オプション
という形式で実行します。
以下のようなコマンドが存在します:
- extract - 2つの正規表現間の内容を抽出する
- headlinks - URLのページにあるすべてのリンクを返す
- help - コマンドのリスト、または1つのコマンドのヘルプを表示する
- html, curl - URLをCurlし、その要素を出力する。
- images - URLからすべての画像を抽出する
- json - URLからJSONレスポンスを取得する。
- links - URLのページにあるすべてのリンクを返す
- scrape - ウェブブラウザを使ってページをスクレイプする。必ず選択された--browserがインストールされている必要があります。
- screenshot - URLのスクリーンショットを保存する。
- tags - あるタグのすべてのインスタンスを抽出する
オプションは--search(-s)
と--query(-q)
が重要です。--search
はCSSかXPath構文のどちらかを使って要素を探すためのものです。idがmainという要素を探したい場合、-s '#main'
となります。
-q
は出力を調整するためのオプションです。例えばhtml
コマンドの出力にはimages
というキーが含まれているため、-q 'images'
で、画像に関する情報だけを出力することができます。
これを踏まえ、例えばcurlyq tags --search 'h2' https://softantenna.com
を実行すると次のような結果が得られます。これは、https://softantenna.com
に含まれるh2
タグの情報を取得するという意味です。
$ curlyq tags --search 'h2' https://softantenna.com [ { "tag": "h2", "source": "<h2 class=\"mb-4\"><a href=\"/folders/all\">ソフトライブラリ</a></h2>", "attrs": { "class": [ "mb-4" ] }, "content": "ソフトライブラリ", "tags": [ { "tag": "a", "source": "<a href=\"/folders/all\">ソフトライブラリ</a>", "attrs": { "href": "/folders/all" }, "content": "ソフトライブラリ", "tags": [ ] } ] }, { "tag": "h2", "source": "<h2 class=\"mt-4 mb-2\">お知らせ</h2>", "attrs": { "class": [ "mt-4", "mb-2" ] }, "content": "お知らせ", "tags": [ ] }, { "tag": "h2", "source": "<h2 class=\"mt-5 mb-4\">ソフト更新情報 - 最新9日分(1/3)</h2>", "attrs": { "class": [ "mt-5", "mb-4" ] }, "content": "ソフト更新情報 - 最新9日分(1/3)", "tags": [ ] } ]
この中からsource
の情報が取得したい場合、--query 'source'
を追加します。
$ curlyq tags --search 'h2' --query 'source' https://softantenna.com [ "<h2 class=\"mb-4\"><a href=\"/folders/all\">ソフトライブラリ</a></h2>", "<h2 class=\"mt-4 mb-2\">お知らせ</h2>", "<h2 class=\"mt-5 mb-4\">ソフト更新情報 - 最新9日分(1/3)</h2>" ]%
その他以下のような例が掲載されています。
headlinksの例:
curlyq headlinks -q '[rel=stylesheet]' https://brettterpstra.com
<head>
からすべての<link>
を取り出し、-q
を使ってrel="stylesheet"
を持つリンクだけを表示する。
htmlの例:
curlyq html -s '#main article .aligncenter' -q 'images[1]' 'https://brettterpstra.com'
ページの全htmlを照会し、--search
を使って要素を絞り込み、その結果から2番目の画像を取り出す。
imagesの例:
curlyq images -t img -q '[alt$=screenshot]' https://brettterpstra.com
<img>
タグの画像の配列を取得し、alt属性がscreenshotで終わるものだけを表示する。
CurlyQには多数のコマンドやオプションが存在します。詳細はGitHubにて確認可能です。
まとめ
CurlyQはcurlをさらに便利化するツールです。一度にすべての機能を使いこなすのは大変ですが、簡単な例から少しずつオプションを追加していくことで慣れていくことができます。