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)
実行してみると、ターミナルに以下の内容が出力されます。
![python_requestsモジュール_<Response [200]>](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_785,h_26/https://se-media.jp/wp-content/uploads/2024/06/python_requests1.png)
上記の結果は、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を取得出来れば、データ収集やタスクの自動化などへの利用が見込めます。是非習得してデータ運用に生かしてください。
コメント