Python

【Python】任意のサイトのHTMLを文字列で取得する方法

この記事では、Pythonで任意のURLからそのサイトのHTMLを文字列型で取得する方法を解説します。HTMLを文字列で取得することで lxml ライブラリなどを使ってサイトを解析したり、スクレイピングしたりできます。

URLを開く

任意のURLをソースコード内から開くには、以下の2通りの方法があります。

  • urllib.requestモジュールを使う
  • Requestsパッケージを使う

標準モジュールしか使用できないような状況ではurllibモジュールを使い、それ以外はRequestsパッケージを使うようにしましょう!

urllib.requestモジュールで開く

urllib.requestモジュールのurlopen()関数を使ってURLを開きます。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

試しに適当なURLを開いてみましょう!

import urllib.request

# 適当なURL
url = 'https://yumarublog.com/python/str'

# URLを開く
r = urllib.request.urlopen(url)

# 出力
print(r)
print(type(r))

# URLを閉じる
r.close()

実行結果

<http.client.HTTPResponse object at 0x106c2d430>
<class 'http.client.HTTPResponse'>

URLを閉じる後処理が必要なのでwith文を使った方が安全です。

import urllib.request

# 適当なURL
url = 'https://yumarublog.com/python/str'

# URLを開く
with urllib.request.urlopen(url) as r:
    # 出力
    print(r)
    print(type(r))

Requestsパッケージで開く

Requestsパッケージは標準モジュールではないのでpipを使ってインストールします。

ターミナル、またはコマンドプロンプト

python -m pip install requests

そしたら、requests.get()を使ってURLを開きます。

requests.get(url, params=None, **kwargs)

試しに適当なURLを開いてみます。

import requests

# 適当なURL
url = 'https://yumarublog.com/python/str'

# # URLを開く
r = requests.get(url)

# 出力
print(r)
print(type(r))

実行結果

<Response [200]>
<class 'requests.models.Response'>

HTMLを文字列で取得

開いたページのHTMLを文字列として取得してみます。HTMLはbytes型で取得されるので文字列型にデコードする必要があります。

RequestsではURLを開いた時に生成したレスポンスのtext属性から文字列型のHTMLを取得できます。

import requests

# 適当なURL
url = 'https://yumarublog.com/python/str'

# URLを開く
r = requests.get(url)

# bytes型でHTMLを取得
print(r.text)

実行結果

<!DOCTYPE html>
<html lang="ja">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- ここからOGP -->
<meta property="og:type" content="blog">
...省略

urllib.requestでは、レスポンスからread()メソッドを呼び出すことでbytes型のHTMLを取得できます。bytes型なので文字列にデコードする必要があります。

import urllib.request

# 適当なURL
url = 'https://yumarublog.com/python/str'

# URLを開く
with urllib.request.urlopen(url) as r: 
    # bytes型で取得   
    print(r.read())
    # デコード
    print(r.read().decode('UTF-8'))

Requestsでbytes型のHTMLを取得したい場合はcontent属性から取得できます。

まとめ

この記事では、urllib.requestモジュールとRequestsパッケージを使ってURLからHTMLを文字列で取得する方法を解説しました。

HTMLを文字列で取得することでサイトのデータを収集することができます。

ただし、サイトを高速で開いたりするとサーバーに負荷がかかるので、timeモジュールのsleep()などを使って負荷がかからないようにしましょう!

【Python】HTMLParserを使ってHTML文字列を解析する方法この記事では、Pythonの標準モジュールであるhtml.parserモジュールのHTMLParserクラスを使ってHTML文字列を解析する方法を解説します。HTMLParserを使うことでタグのタグ名や属性、タグ内の要素を取得することができます。...

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』