Python:urllib.request.urlopenでHTMLソースコードを取得する

Python

Pythonurllib.request.urlopenを使うと簡単にWebサイトデータを取得できます。
今回は、urllib.request.urlopenを使ってHTMLソースコードを取得してみます。

urllib.request.urlopenを使ってサイトデータを取得するプログラム(生のデータ)

urlopen.py

例としてYahoo!のトップページのHTMLソースコードを取得してみます。

# -*- coding: utf-8 -*-
import urllib.request

# 取得したいサイトURL
url = "https://www.yahoo.co.jp/"

# サイトデータをオブジェクトとして取得
response = urllib.request.urlopen(url)

# 取得データを読み込む
encodeData = response.read()

# 表示
print(encodeData)

実行結果(イメージ)

b'<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<title>Yahoo! JAPAN</title><meta name="description"
content="\xe3\x81\x82\xe3\x81\xaa\xe3\x81\x9f\xe3\x81\xae\xe6\xaf\x8e\xe6\x97\xa5\xe3\x82
\x92\xe3\x82\xa2\xe3\x83\x83\xe3\x83\x97\xe3\x83\x87\xe3\x83\xbc\xe3\x83\x88\xe3\x81\x99
\xe3\x82\x8b\xe6\x83\x85\xe5\xa0\xb1\xe3\x83\x9d\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\xab\xe3\
                      :

ソースコード解説

サイトデータをURLで指定して読み込むためにimport urllib.requestが必要になります。

urllib.requestのメソッドurlopenは、引数にURLを指定するだけです。

使用例

response = urllib.request.urlopen("https://www.yahoo.co.jp/")

上記の場合、戻り値に指定した変数responseにサイトデータが取得される訳ですが、Pythonの公式マニュアル(こちら参照)によると「ファイルライクなオブジェクト」が戻り値とのことなので、そのままではprintなどで表示出来ません。

中身を見たい場合は、readメソッドで取り出します。

こんな感じ

encodeData = response.read()
print(encodeData)

ちなみに、このプログラムで取得されるデータは生のデータでありエンコードされたデータです。
エンコードされたデータとは、日本語などの全角文字なら

どんぐりと山猫

という文字列が

%E3%81%A9%E3%82%93%E3%81%90%E3%82%8A%E3%81%A8%E5%B1%B1%E7%8C%AB

のように変換されている状態ということです。
つまりエンコードは、すべて半角英数字で表記された状態ということです。(わたしたちが見たら、暗号レベルということ)

エンコードされたデータは、デコードすると元の状態に戻すことができます。(エンコードされたデータを元の状態に戻すことをデコードするという)

正直エンコードされたデータは見にくいし扱いにくいので、以下にサイトデータを取得後デコードして表示するプログラムを示します。

urllib.request.urlopenを使ってサイトデータを取得するプログラム(デコード後の見やすいデータ)

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

"""
	urllib.request.urlopenで取得したサイトデータをデコードして表示
"""

import urllib.request

# 取得したいサイトURL
url = "https://www.yahoo.co.jp/"		# 例)Yahoo!のサイト

# サイトデータをオブジェクトとして取得
response = urllib.request.urlopen(url)

# 元の情報に戻す(エンコードされたデータをデコードする)
decodeText = response.read().decode("utf-8")

# 表示
print(decodeText)

実行結果(イメージ)

<!DOCTYPE html><html lang="ja"><head><meta charSet="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<title>Yahoo! JAPAN</title>
<meta name="description" content="あなたの毎日をアップデートする情報ポータル。検索、ニュース、天気、スポーツ、メール、ショッピング、オークションなど便利なサービスを展開しています。"/>
<meta name="robots" content="noodp"/><meta name="viewport" content="width=1010"/>
<link rel="dns-prefetch" href="//s.yimg.jp"/>
<link rel="dns-prefetch" href="//yads.c.yimg.jp"/>
<meta name="google-site-verification" content="fsLMOiigp5fIpCDMEVodQnQC7jIY1K3UXW5QkQcBmVs"/>
<link rel="alternate" href="android-app://jp.co.yahoo.android.yjtop/ya
                         :

デコードして元に戻すとHTMLファイルの中身がわれわれ人間でも確認できるようになりました。

decode()メソッドについて
Pythonのdecode()メソッドは、引数に文字コードの設定が必要です。
最近のサイトは大方UTF-8の文字コードで作成されていると思うので、decode(“utf-8”)などとしましたが、文字コードが分からない場合は判別も必要になってきます。文字コードの判別はやっかいなので本記事では省いています。

以上、urllib.request.urlopenを使ってHTMLソースコードを取得する、でした。

コメント

タイトルとURLをコピーしました