この記事では、Pythonで任意のURLからそのサイトのHTMLを文字列型で取得する方法を解説します。
HTMLを文字列で取得することでlxmlライブラリなどを使ってサイトを解析したり、スクレイピングしたりできます。
それでは、URLからHTMLを文字列として取得する方法を見ていきましょう!
任意のURLをソースコード内から開くには、以下の2通りの方法があります。
標準モジュールしか使用できないような状況ではurllib
モジュールを使い、それ以外はRequests
パッケージを使いましょう!
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
パッケージは標準モジュールではないので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は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 >
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()
などを使って負荷がかからないようにしましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ