CurlyQ - curlを利用したWebスクレイピングツール

[PR]記事内のアフィリエイトリンクから収入を得る場合があります
  • URLをコピーしました!

S 20240202 115206

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>"
]%

S 20240202 133442

その他以下のような例が掲載されています。

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をさらに便利化するツールです。一度にすべての機能を使いこなすのは大変ですが、簡単な例から少しずつオプションを追加していくことで慣れていくことができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次