Python で指定したURLからHTMLを取得する

requestsモジュールの扱い方

Python を使って、Webページを取得してみましょう。
この記事では、URLを指定して接続先のHTMLを得る方法をご紹介致します。

他の Python の記事⼀覧は こちら

目次

必要なライブラリのインストール

Python のパッケージ管理システムであるpipを使用して、今回使用するライブラリをインストールしましょう。(既に環境が構築出来ていればインストール不要です。)
下記のコマンドをターミナルで実行し、今回必要な環境を構築してください。

pip install requests #HTTPリクエストを送信するためのライブラリ

pip install bs4 #HTML/XMLの解析ライブラリ

pip install lxml # HTMLなどのマークアップを解析するためのライブラリ

上記のインストールが終わりましたら、さっそくHTML取得を行ってみましょう。
(requests:HTTPリクエストを送信するためのライブラリ。多くの場合、Webページから情報を取得するために使用されます。)
(bs4:Beautiful Soupと呼ばれるHTML/XMLの解析ライブラリ。WebスクレイピングやHTML解析に利用されます。)
(lxml:XMLやHTMLを解析するための高速で柔軟なライブラリ。上記のBeautiful Soupと一緒に使用されることがよくあります。)

指定したURLから、HTMLを取得する

今回の記事では、URLからHTMLを取得するモジュールにrequestsを使用します。
requestsを利用して、Googleの公式HPからHTMLを取得してみましょう。
HTTPレスポンスの取得には、requests.get(“URL”)を使用します。
以下のscraping.pyを作成して実行してみてください。

# ◆◆◆◆◆◆HTMLの取得◆◆◆◆◆◆
import requests # URLからHTMLを取得するための外部ライブラリ
page = requests.get("https://www.google.com/") # URLを指定してHTTPレスポンスを取得
print(page)

実行してみると、ターミナルに以下の内容が出力されます。

<Response [200]>

上記の結果は、HTTPリクエストが成功し、サーバーから正常なレスポンスが返されたことを示しています。具体的には、「200」 ステータスコードがリクエストが成功したことを示しています。(失敗した場合は別のステータスコード(403、404、500等)が表示されます。)

上記の結果だけでは、URLからHTMLが取得出来たかの可否しかわかりません。print(page.text)と記載することで取得したHTMLを全て表示することが出来ますが、HTML全文は情報量が多くターミナルを埋め尽くすことになると思います。
取得したHTMLをファイルとして出力するなどの方法はありますが、今回は取得したHTMLの解析を行って、タイトルやリンクに絞ってターミナル出力してみましょう。

取得したHTMLを解析する

取得したHTMLを解析してみましょう。今回は取得したHTMLから<title>タグと<a>タグを抽出し、ターミナルに表示します。
scraping.pyに下記のHTML解析部分を追記し、再度実行してみてください。

# ◆◆◆◆◆◆HTMLの取得◆◆◆◆◆◆
import requests # URLからHTMLを取得するための外部ライブラリ
page = requests.get("https://www.google.com/") # URLを指定してHTTPレスポンスを取得
print(page)
# ◆◆◆◆◆◆HTMLの解析◆◆◆◆◆◆
from bs4 import BeautifulSoup # HTMLを解析するための外部ライブラリ
page.encoding = page.apparent_encoding # エンコードの設定
soup = BeautifulSoup(page.text, "lxml") # Webページのテキストを分析するためのオブジェクトを生成
title_tag = soup.find("title") # titleタグを探す <title>Google</title>
print(f"title_tag:{title_tag.text}") # タグのテキストを表示
a_tag = soup.find_all("a") # aタグを探す <a class="gb1" href="https://www.google.com/………
print(f"a_tag:{a_tag}")

実行してみると、ターミナルに以下の内容が出力されます。

<Response [200]>
title_tag:Google
a_tag:[<a class="gb1" href="https://www.google.com………
………
………(以降、aタグの抽出結果)

上記の出力は、取得したHTMLを解析して指定した内容(<title>タグ、<a>タグ)を探し出し、その結果をprint()でターミナルに表示させています。内容を見てみましょう。

取得したHTMLをエンコードし、オブジェクトを生成する

from bs4 import BeautifulSoup # HTMLを解析するための外部ライブラリ
page.encoding = page.apparent_encoding # エンコードの設定
soup = BeautifulSoup(page.text, "lxml") # Webページのテキストを分析するためのオブジェクトを生成

取得したHTMLを処理して解析の準備をします。正しくエンコード出来るようにapparent_encodingでエンコード設定を行い、その後BeautifulSoupクラスのオブジェクトを作成します。

現在pageには取得したHTMLが格納されていますが、テキストとして表示する際にエンコードが正しく行われなかった場合、正しく画面表示されない可能性があります。(たとえば、UTF-8でエンコードされたテキストをShift_JISとして解釈すると、日本語の文字が文字化けしてしまうことがあります。)page.apparent_encodingは、取得したテキストのパターンなどから最も適応する可能性の高いエンコード方法を自動で推測してくれます。推測した結果をpage.encodingに格納し、エンコード設定を書き換える事で正しくエンコード出来る可能性が高まります。

エンコードの設定が済んだら、解析用のオブジェクトを生成します。
オブジェクトの生成はBeautifulSoup(解析対象HTML/XML, パーサー(解析機))で行います。
今回はBeautifulSoup(page.text, “lxml”)ですので、第一引数ではpage.textで解析対象のHTMLのテキストデータを渡し、第二引数では解析器lxmlの指定を行っています。”lxml” は、高速かつ柔軟な解析器でBeautiful Soupで一般的に使用されます。

オブジェクトを解析し、結果を表示する

title_tag = soup.find("title") # titleタグを探す <title>Google</title>
print(f"title_tag:{title_tag.text}") # タグのテキストを表示
a_tag = soup.find_all("a") # aタグを探す <a class="gb1" href="https://www.google.com/………
print(f"a_tag:{a_tag}")

取得したHTMLの解析を行います。
今回は取得したHTMLの中から<title>タグの抽出と、<a>タグの抽出を行います。

find()は引数で渡されたタグで検索し、最初にヒットした1つを取得します。
title_tag = soup.find(“title”)ではtitleを引数としたので、最初にヒットした<title>タグがtitle_tagに格納されます。よって、print(f”title_tag:{title_tag.text}”)では「title_tag:Google」と表示されます。

find_all()は引数で渡されたタグで検索し、ヒットした全てを取得します。
a_tag = soup.find_all(“a”)ではaを引数としたので、全ての<a>タグのヒット結果がa_tagに格納されます。よって、print(f”a_tag:{a_tag}”)では「[<a class=”gb1″ href=”https://www.google.com………」と表示されます。

いかがでしょうか。外部URLからHTMLを取得出来れば、データ収集やタスクの自動化などへの利用が見込めます。是非習得してデータ運用に生かしてください。

(Visited 115 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次