適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

VBAでウェブスクレイピング_WinHTTP編その3

この記事では

WinHTTPを操作するためのHTTPの最小限の理解

WinHTTPを使ってウェブサーバとデータのやりとりをするためには、HTTPの理解が必要であることを前回述べました。

今回はWinHTTPを操作するために必要と思われるHTTPの内容について説明したいと思います。

HTTPとは

HTTPとは、Hyper Text Transfer Protocolのアクロニムです。

Wikipediaによると、

HTMLなどのコンテンツの送受信に用いられる通信プロトコルである。主としてWorld Wide Webにおいて、WebブラウザとWebサーバとの間での転送に用いられる。日本標準仕様書ではハイパテキスト転送プロトコルとも呼ばれる。

HTMLを始めとした、様々なデータを送受信するための通信規約といったところでしょうか。

もともと、ウェブサーバ上の単純なテキストデータをクライアント(ブラウザ)が受信することを目的として作られた規約でした。利用者の拡大や商用利用の解禁など、当初想定されていなかった用途に使われるようになり、テキストデータ以外のデータについてもサポートが広がっていきました。

またログイン処理をしたりなど状態を管理(なかば無理やり)したり、通信を暗号化したりと色々な技術と合せて使われ、その仕様は複雑になっていきました。

これらの細かい仕様は、Request for Comments(RFC)という文書で公開されています。

各ウェブサーバとウェブブラウザはこの仕様書に基づいて作られています(基本的には)。

HTTPの通信の中の位置づけ

HTTPは、アプリケーション層と言われる層の通信規約になります。 アプリケーション層とは、通信にどういった方法がとられているかといった細かいことは一切気にする必要がない層になります。

気にするのは、クライアントとして、つまりブラウザのようにURLを使ってウェブサーバーにアクセスする方法と、ウェブサーバが返してきたデータをどう処理するかだけになります。

では、HTTPという規約=プロトコルがどのように通信をするか、その概略を見ていきたいと思います。

HTTPの通信の概略

ここでは単純なクライアントとサーバを想定します。

クライアントはサーバに対して、データを要求します。

要求のデータはこのようなデータです。
f:id:shinmai_papa:20190904092310p:plain

それに対して、返ってくるデータはこのような構成です。

f:id:shinmai_papa:20190904092305p:plain
かなり抽象的に見えますが・・・本当にこんな感じのデータが送られてきます。 順を追って見ていきましょう。

HTTPクライアントの要求

一行目は「メソッド、パス、HTTPのバージョン」です。

ここで重要なのは、メソッドとパスの二つです。

メソッドとは

メソッドとは、サーバに対して、自分の要求がどんな意味を持つかを知らせるための単語です。 8個くらいありますが、大事なのはGETPOSTの二つです。

GETとPOSTはおおよそこんなイメージです。

GETメソッド:単純にデータをくれ
POSTメソッド:条件送るから、この条件にあったデータをくれ、ログイン情報送るからログインさせてくれ

本当かよって思われるかもしれませんが、このイメージでこれまで失敗したことありませんので多分大丈夫です。

パスとは

パスは、よく目にするであろうURLに登場してきます。

https://www.tekizai.net/entry/2019/08/28/080000を例に説明します。

https://・・・プロトコル
www.tekizai.net・・・ホスト
/entry/2019/08/28/080000・・・パス

URLとは、このプロトコルで、このホスト(ウェブサーバが置いてるコンピュータ名)の、パス(フォルダとファイル名)のデータを要求します!!

というものです。

クライアントからの要求では、一行目にその中のパスを使います。

ヘッダとは

ヘッダはその要求のメタ情報です。
例えば、自分が理解できるのは日本語だけです この要求はChromやIEから送ってますよ~といった様々な情報です。

ヘッダは、キーと、値のペアです。

私の環境から、ChromでウェブサイトにGET命令を発行したときは、こんなヘッダが自動的に付けられて送信されています(一部抜粋)。
https://httpbin.org/getにブラウザからアクセスすると、ブラウザが送信した情報を表示してくれます。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3,
Accept-Encoding: gzip, deflate, br,
Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7,
Host: httpbin.org,
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36

またこのヘッダの情報を使ってログイン状態の管理を行ったりします。

ここではこれらのヘッダについての細かい解説は行いません。実際にWinHTTPを使う際に必要なヘッダについて解説する予定です。

ボディとは

ボディは、主にPOSTの時に使われます。 ログインするためのパスワードやID、また、フォームに入力した情報などをここに置いて送信します。

ウェブサーバの応答

クライアントから要求を受けたウェブサーバは、要求に応じて [evernote:1190c3e69491d862ba7ccd47c05dd8fb アップロード中] この様式でクライアントにデータを送信します。

レスポンスコードとは

HTTP/1.1 200 OK
このような形式で、その要求の処理結果のコードが返ってきます。
各コードの説明はネット上に解説がたくさんありますので割愛します。

クライアントはこのコードを見て、処理を分岐させる必要があります。

ヘッダとは

レスポンスのヘッダは基本的な考え方はクライアントの要求ヘッダと同じです。

今回返したデータのサイズはこのくらいだよ、データはhtmlだよ、文字コードはUTF8だよといった情報を送ってきます。

Content-Length: 38390
Content-Type: text/html; charset=utf-8
Date: Wed, 04 Sep 2019 00:05:18 GMT

ボディとは

ボディとは基本は、ウェブページのHTMLです。 その他のデータの場合もあります。

これがクライアントが欲しいデータになります。

まとめ

クライアントが要求して、ウェブブラウザはそれを待ち構えています。
クライアントから要求されてきたデータをウェブブラウザが解析してデータを返す。
クライアントは返ってきたデータを解析して、必要に応じてウェブサーバにまた要求する・・・。
という繰り返しでデータのやり取りが行われます。

データのやり取りをする上で、なんの約束もないといったい解析のしようもないので約束事として、上述の細かい決まり事があります。

実際にWinHTTPを使って通信をしてみると、理解が深まることもあろうかと思います。

次回は、WinHTTPを使って実践的なスクレイピングの話題に入っていきます。

ここまでお読みいただき、ありがとうございました。

www.tekizai.net