Linuxコマンド.NETLinuxコマンド.NETLinuxコマンドを中心にIT技術関係の情報を発信します。Linuxコマンドについてはできるだけ実行例と実行結果を紹介したいと思います。LinuxコマンドcurlコマンドはURLでデータ通信を行うことができます。サポートしているプロトコルはHTTP,FTP,SMTP等で、様々な通信に対して利用することができます。ここでは主にHTTPでのWebページ取得方法について紹介します。参考curlコマンドの紹介の前にこの記事では、curlコマンドの利用するために、CGIが動作する簡単なWebサーバをローカル環境で構築しています。CGIが動作する簡単なWebサーバはpythonのバージョン2系のCGIHTTPServerモジュールを用いて構築します。3000と実行するだけで、カレントディレクトリをドキュメントルートとしてローカル環境に簡単なWebサーバを構築できます。3000の数字はポート番号を表しています(ポート番号を省略するとデフォルトでは8000番ポートになります)。CGIが動作するディレクトリは決められていて、cgi-bin/又はhtbin/の中に存在するファイルがCGIスクリプトとして扱われます。python3では、http.serverモジュールを用いてWebサーバを構築できます。--cgiオプションを用いると同様にCGIが動作するWebサーバを構築できます。3000PythonワンライナーでWebサーバを構築しCGIプログラムを動かしてみるApache等を使わずにPythonがインストールされていれば、一行のコマンドでローカル環境でWebサーバを作成できます。00:52curlコマンドの利用例GETメソッドによるWebページの取得curlコマンドは、引数にURLを入力することで、GETメソッドでWebページを取得することができます。wgetコマンドと違い、Webページは標準出力されます。そのため、パイプでコマンドを繋げることができ、sedやawk等のコマンドと組み合わせて、結果の出力の編集を行うことが出来ます。World</h1></body></html>シェルのように'{}'や'[]'を利用することで、複数のWebページを取得することも可能です。/><title>test2.html</title></head><body><p>test2.html</p></body></html>取得したWebページをファイルに保存(-oオプション)-oオプションを用いることで、取得したWebページを指定したファイルに保存することができます。出力がファイルやパイプ等のように端末でない場合、curlコマンドは基本的に進捗バーを表示します。126k$$lsfile.htmlまた、'{}'や'[]'を用いて、複数のファイルをダウンロードする場合、使用した括弧の数に従って、'#1','#2','#3'...を用いることで、置き換えられる文字列を使用して、ファイルをダウンロードできます。ccctest2.htmlGETメソッドによるクエリ文字列の送信GETメソッドでデータを送信する方法として、URLにクエリ文字列を追加して送信する方法があります。記述方法はhttp://www.example.com/?aaa=testのように、URLの後に'?'を記述し、その後にname=value&name2=value2のように記述することでデータを送信することができます。curlコマンドでクエリ文字列を記述する場合は、シェルに解釈されないように一部の文字列はエスケープする必要があります。method)を指定することができます。この-Xオプションを用いて、GETメソッドの他にPOST,PUT,DELETE等のリクエストメソッドを指定することができます。POSTメソッドはHTMLのフォームのデータ送信、掲示板でのメッセージ投稿処理などに利用されます。ここでは、例としてCGIプログラムにPOSTメソッドを用います。$postdatafi実行結果name=taro&value=871name=taro&value=87CGIプログラムにPOSTメソッドを用いてデータを送信する場合、CGIプログラムは送信されたデータを標準入力として受け取ります。この標準入力は、CONTENT_LENGTHの値を読み取って、データを受け取ります。Cookieの保存-cオプションを用いることでWebサイトから送信されるCookieを保存することができます。Cookieとは、HTTPで状態(state)を保存するために利用されます。状態とは、あるサイトでのログイン状態や言語設定などが挙げられます。ここでは、CGIプログラムにCookieヘッダーをセットし、それを保存する例を示します。Mechanismになります。Cookieの利用-bオプションを用いることで、Cookieとしてデータを送信することができます。Cookieとしてデータを送る場合、文字列またはファイルを指定します。value=987curlコマンドの応用xmllintコマンドと組み合わせWebスクレイピングWebスクレイピングとは、ウェブサイトから欲しい情報を抽出することを言います。curlコマンドとxmllintコマンドを組み合わせることでウェブサイトから欲しい情報を抽出することが出来ます。xmllintコマンドはxmlやhtmlを解析できるコマンドになります。このxmllintコマンドの--htmlオプションと--xpathオプションを用いてHTMLから任意のタグの要素を抽出することが出来ます。XPathの構文仕様はW3CのXPathの仕様に規定されています。XPathの構文について、あまり知らなくても、ブラウザから欲しい要素のXPathをコピーすることも出来ます。Chromeでは情報が欲しい箇所に右クリックを押し、「検証」をクリックすることで、デベロッパーツールを開くことができ、さらにそのデベロッパーツールの画面で欲しい要素に対して、右クリックを押し、「コピー」から「XPathをコピーする」項目があります。ここから簡単にXPathを取得することできます。xmllintコマンドで要素を抽出することができたら、抽出した文字列を編集していき、欲しい文字列に整形していきます。欲しい文字列に整形するためにはsedやawk等のコマンドを用いることが出来ます。以下に簡単なWebスクレイピングのコマンド例と実行結果を示します。コマンド例はこのサイトのトップページから3ページまで記事タイトルとそのURLを表示する例になります。ファイルチェック・値の比較をするコマンド例の簡単な解説を行います。初めにcurlコマンドでWebページの取得を行います。"https://linuxcommand.net/page/[2-3]/"その後に、パイプ(|)で繋いでxmllintで取得したい要素を抽出します。これはHTMLのソースと比較しながら行っていきます。xmllintは引数にファイルを指定する必要がありますが、標準入力を指定する場合は、'-'を指定します。xmllintでHTMLタグとして解釈されないタグがある場合、エラーメッセージが出力されるため、2>/dev/nullでエラーメッセージを捨てています。抽出した要素を編集するために次のsedコマンドにパイプで渡します。2>/dev/nullsedコマンドでは、-nオプションで明示的な出力のみを出力するようにし、(1)aタグのhref属性からリンクの出力(2)HTMLのソースが圧縮されているため、aタグの閉じタグを用いて改行の追加(3)全てのタグを削除(4)出力を行っています。sedコマンドのスクリプトの区切り文字として、's/pattern/replacement/'の形式をよく見ますが、HTMLタグにある'/'と混同しやすいため、's!pattern!replacement!'のように別の区切り文字を使用しています。テキストの置換や編集をするsedコマンドは、主にテキストにある文字列を別の文字列に置換することによく使われます。11:42最後に出力に行番号をつけるためにnlコマンドを用いています。行番号を追加するnlコマンドは、ファイルの内容や標準入力の内容に行番号を追加することができます。15:03ウェブサイトから欲しい情報を抽出するためにcurlコマンドとxmllintコマンドを利用することはとても有用です。JavaScriptでWebページを動的に作成していくようなサイトの情報を抽出するにはまた別のテクニックが必要になります。Automation)。コメントをキャンセルメールアドレスが公開されることはありません。*次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Linuxコマンド.NET.。