ビールとプリンとプログラミング。

頭の悪いプログラマのぼやき。

Pythonはじてみた#02-Webページを取得してみる

Pythonをはじめたは良いものの何をしようか。

ちゃんと学習するのであれば、体系的に文法を追うべきなんでしょう。
が、しかし、それではつまらない。

ということで、
何か適当なものを作りつつ、
わからないことはその都度調べていくスタイルで進めることに。

公式ドキュメントの日本語訳も充実していることですし、
ここではJavaristaである僕が気になったことだけメモしていこうかと思います。

公式のドキュメント(日本語訳)
https://docs.python.jp/3/index.html


さて、今回は、

Webページを取得して遊んでみます。

ライブラリの探索

では、早速例の公式ドキュメントを。

Webページを取得するので、なんか、こう、
HttpClientとかHttpConectionとかそんなのないかなあ、なんて探すとあったあった。

http.client
https://docs.python.jp/3/library/http.client.html

http.clientという標準ライブラリ。
早速公式ページを開いてみると

『より高水準の HTTP クライアントインターフェイスとしては Requests パッケージ がお奨めです。』

とか、公式に堂々とサードパーティ製ライブラリの推奨が。おおう。

では、今回はRequests パッケージとやらで遊ばせていただくことにしましょう。

インストール

まずはドキュメント。

Requests: HTTP for Humans — Requests 2.18.4 documentation

Pythonでライブラリを使用する際は、pipというパッケージ管理システムが便利なようです。
pipはPythonインストール時に同梱されているはずですので、コマンドでRequestsパッケージをインストールしちゃいましょう。

pip - Wikipedia

pip install requests

インストールが終われば準備オーケー。

使ってみる

習うより慣れろ!
まずは使ってみましょう。こんな感じ。

# -*- coding: utf-8 -*-

import requests

# GoogleのWebサイトにGETメソッドでリクエストを投げる。
res = requests.get("https://www.google.co.jp/", timeout=10)

# 返ってきたオブジェクトの型を確認
print(type(res))			# <class 'requests.models.Response'>

# ====================================
# == 【memo】
# == Pythonではすべてがオブジェクト。
# == オブジェクトの型はtype(object)で確認できる。
# ====================================

# ステータスコードを確認。
print(res.status_code)		# 200

# Body部を確認
print(res.text)			# GoogleのWebサイト(HTML)


概ねコメントをご覧頂ければ内容はわかるかと思います。
requests#getで指定したURLにリクエストを投げます。
戻り値はrequests.models.Responseクラスのようです。

今後も度々『型』を確認するつもりですが、これは普段Javaを使用しているがための悲しい性ですかね。戻ってきた型が何なのかわからないと、気持ち悪くてしょうがないので確認しています。これが、Javaなら明示的に型を指定しないといけないし、第一javadocを見ればすべてが分かる。
・・・残念なことに、どんなに非効率だと言われようが、他の言語を触る度にJavaが恋しくなる古くて硬い脳みそなのです。

さて、requests.models.Responseクラスからは様々な情報を引き出せるようですが、ここではステータスとBody部を確認しています。Body部はもりもりHTMLが表示されました。

取得成功ですな。

取得できないとき

実際にRequestsパッケージを使って何かを作る時に気になる、取得できないときはどうなるの?というところについても確認してみた。

(省略)
# 存在しないURLにGETメソッドでリクエストを投げる。
res = requests.get("http://megane-s24.hatenablog.com/entry/2018/03/11/162331xxx/", timeout=10)

# ステータスコードを確認。
print(res.status_code)		# 404


存在していないページを叩いてみました。
しっかりステータスコード「404」が返ってきました。
では、そもそも、ドメインも間違っているような場合はどうなるか?

(省略)
# 存在しないドメインにGETメソッドでリクエストを投げる。
res = requests.get("http://localhost/", timeout=10)		# socket.timeout: timed out


これまでrequests#getに2つの引数を指定していました。
1つは見てそのままURLですね。

で、もう一つの引数。

Pythonでは、引数を渡す方法として、順序どおりに引数を指定する方法の他に、引数のキーワードを指定して渡すことができるようです。
まさにここでやっていることがそれで、上の例では「timeout」というキーワードを指定し、「10」という値を渡しています。
このキーワードで渡す、というのはなかなか良いですよね。

さて、この「10」が何を意味するのか。
これは、タイムアウトの秒数を指定しています。
つまり、10秒たって繋がらなかったら、諦めますよ~。ということですね。
で、実際に10秒後「socket.timeout: timed out」といった感じで例外が発生しました。

このtimeoutを指定しない場合、いつまでも繋げようと頑張ってしまうので、ほぼほぼ必須ですかね。


おわりに

ということで、今回はRequestsパッケージを使ってWebページを取得してみました。
ライブラリを使用すると簡単ですね。

次回は取得した内容をゴニョゴニョするための何かを学びます。

以上、yusuke_s24でした。