MAGAZINE

ルーターマガジン

クローリング/スクレイピング

よく使うプログラミング言語はcurlです

2023.11.21
Pocket

山本ゆうごです。

学生の方との面談時に「御社でよく使うプログラミング言語は何ですか?」と聞かれた際に「実際に日常的に使うのはSQLとcurlです」と答えています。ほとんどの学生の方には「curl?」となります。スクレイピングでのビッグデータ収集ではcurlコマンドは必須となるため、正しくcurlコマンドを残せることが弊社では美しいお仕事の記録となります。

そもそもcurlとは

CUIのコマンドとして存在します。基本はHTTP通信をするためのコマンドです。

単なるコマンドなのでプログラミング言語というにはおこがましいのですが、とはいえ活躍の現場としては需要な位置にいます。

APIリファレンスに登場するcurl

APIリファレンスにもcurlはよく登場します。殆どのREST APIはcurlコマンドで再現できます。

例えばBOXのAPIリファレンスは以下のようにまずはcurlのサンプルがあります。 https://ja.developer.box.com/reference/get-metadata-templates-enterprise-securityClassification-6VMVochwUWo-schema/

SlackのAPIリファレンスにもcurlでサンプルが登場します。 https://api.slack.com/methods/files.upload

GoogleのAPIリファレンスにもcurlのサンプルが登場します。 https://cloud.google.com/vision/docs/detect-labels-image-command-line?hl=ja#local-shell

APIに関してはAPIキーがあってるか、そもそも通信が届くかなどの切り分けが必要なため、「できるだけ浅い」アーキテクチャの方が検証段階では良いです。

プログラミング言語の中で実装されたHTTP通信も裏ではlibcurlを呼び出している実装もあるため、curlは実質「インターネット語」としての位置づけとなります。curlコマンドはコマンドにも関わらずプログラミン言語と同列に位置していることを考えると「よく使うプログラミング言語」として紹介してもいいくらいです。

ChromeのCopy As Curl (これが一番よく登場する)

ChromeのDeveloperToolsのネットワークタブをみると通信内容が見えます。この中で通信内容をcurlコマンドに変換することができます。ゼロからcurlコマンドの複雑な引数を書く機会はあまりありません。copy as curl で作られたcurlコマンドを少し修正することで「ブラウザで出来ていたことを自動化」します。

抑えておくべきは以下の機能です。

  • -H を使ったHTTPヘッダの設定
    • UserAgentを設定
    • Coookieを設定
  • -d を使ったPOSTBODYの設定
    • JSONを適切にエンコード

サーバーに送るのは、HTTPヘッダとPOST BODYだけなので、非常にシンプルです。知識として大事なのはcurlコマンドよりもHTTPそのものです。

curlを使えばログイン後の動きも再現できる

MachanizeやSeleniumなどを使わずともログイン後の動きは再現できます。本エンジニアブログでも事例として紹介しています。 https://rooter.jp/web-crawling/fetch-curl-command-with-chrome-devtools/

「ログインだけはブラウザでやっておいて、その後はcurlで自動化を行う」などの引き渡しをすることでより軽い実装にすることもあります。弊社ではMachanizeもSeleniumも自動化という観点ではあまり登場せず、最下層で動くcurlコマンドでのスクレイピングかchrome_remoteを使ったブラウザそのものの自動化かの両端を押さえています。

curl to ruby , curl to python

curlコマンドは言語を超えた「HTTP通信の動く仕様書」としても使えます。そのため、機械的に別言語に書き直すことができます。curlconverter.comでは、curlコマンドをペーストするだけで、RubyやPythonのソースに変換してくれます。 こうすることで別言語に置き換えることはできますが、情報量として増えているわけではなくスクレイピングのデバッグがしやすくなるわけでもないので、curlコマンドそのものを外部コマンド呼び出しで実行するケースも多くあります。

でもWindows版はないんでしょ?

あるけど使いづらいので使わない方がいいです。弊社でのWindowsでの開発環境はWSL上のUbuntu一択です。それでもご興味の有る方は以下をお読みください。

Windowsにもcurl.exeというコマンドがあります。PowerShell上からもcurlというコマンドがあるのですがそれはPowerShellのInvoke-WebRequestへのエイリアスとなっているため別物です。オプションも全く違うので大混乱です。

したがってWindowsでは以下の選択肢があります。

  1. WSL上でUbuntuのcurlを使う
  2. Windows上でcurl.exeを使う
  3. Windows(のPowerShell)上でcurl(Invoke-WebRequestのエイリアス)を使う

一番のおすすめは「1. WSL上でUbuntuのcurlを使う」です。GUIなしの環境で動かすためのスクレイピングの開発環境を手元で再現しているだけなので、Ubuntuで動くものを作るのが正義です。

二番目は「Windows上でcurl.exeを使う」です。これはWSLが使えないWindowsユーザー向けのAPIの疎通確認として使っています。

最悪なのは「3. Windows上でcurl(Invoke-WebRequestのエイリアス)を使う」です。別のコマンドに同じエイリアスを割り当てられたので大混乱です。Windowsに慣れてるでれば、notepad.exeを起動するのにnotepadとコマンドを打つのは常識ではあるのですが、curl.exeとcurlが別物に割り当てられたことでWindowsのベテランから順に死んでいきます。2と3をWidowsユーザが区別するのはほぼ不可能なため、2も3もおすすめはできません。したがって「1. WSL上でUbuntuのcurlを使う」の一択となります。

どうしても非エンジニアのWindowsユーザにcurlコマンドでの疎通確認をしてもらいたいときには、以下のようなコマンドを渡します。

curl.exe https://www.yahoo.co.jp/ -o yahoo.html

ポイントは-oのオプションです。 これがLinuxやMacであれば以下のように記述して済ませています。

curl.exe https://www.yahoo.co.jp/ >  yahoo.html

Windowsの場合ファイルへのリダイレクトはShiftJIS扱いになります。殆どのインターネットコンテンツはUTF-8であるためファイルへのリダイレクトをすると化けます。Linuxの発想では「標準出力に出されるものは、人が見る、ファイルに出す、別のプログラムに渡す」の3択を選べるのですが、Windowsの場合はそれはSJISの世界に限られるのでファイル出力オプション-oが必須となります。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから