【Python応用】BeautifulSoupを用いた基本的なスクレイピング方法

Python

Pythonを学び始めると「Webスクレイピング」という言葉をよく耳にすると思います。Webスクレイピングとは、インターネット上のWebページから情報を自動的に取得する技術のことです。ニュース記事の見出しをまとめたり、株価を取得したり、レシピサイトから材料リストを収集したりと、さまざまな活用が可能です。

この記事では、初心者向けにPythonのBeautifulSoupライブラリを使った基本的なスクレイピング方法を解説します。

この記事の対象

  • スクレイピングに挑戦したい方
  • BeautifulSoupの使用方法を知りたい方
  • Webスクレイピング方法を知りたい方
スポンサーリンク
スポンサーリンク

BeautifulSoupとは?

スクレイピングをする上で任意の情報を抽出するライブラリが「BeautifulSoup」です。HTML、XMLから任意の情報を抽出するための解析を行います。ただし、データのダウンロードを行うわけではないのがポイントです。ダウンロードを行う場合は「urllib」を使用します。

BeautifulSoupのダウンロード

BeautifulSoup」は標準ライブラリではないので、ライブラリをダウンロードする必要があります。PyPIからpipでダウンロードします。

#BeautifulSoupのダウンロード
pip install beautifulsoup4

基本的なスクレイピング手順

要素名・属性(id)での抽出

要素の抽出方法にはいくつか種類があります。以下では「要素名」「属性」で抽出する方法について解析しています。

プログラムの流れ

プログラムの大まかな流れです。

  1. BeautifulSoup(ライブラリ)のインポート
  2. パーサーの指定(html.parser)
  3. 抽出(h1,h2,p)

プログラム

#1---ライブラリのimport
from bs4 import BeautifulSoup
#2---解析内容
analytics = """
<html><body>
 <h1>【Python応用】BeautifulSoupを用いた基本的なスクレイピング方法</h1>
 <h2>BeautifulSoupとは</h2>
 <p>スクレイピングをする上で任意の情報を抽出するライブラリが「BeautifulSoup」です。</p>
</html></body>
"""
#3---パーサーの指定
soup = BeautifulSoup(analytics,'html.parser')
#4---抽出
h1 = soup.html.body.h1
h2 = soup.html.body.h2
p = soup.html.body.p
#4---抽出した文字の出力
print("h1 : ",h1.string)
print("h2 : ",h2.string)
print("p : ",p.string)

上記のプログラムでは、ウェブから情報をスクレイピングしていません。HTMLをプログラム内で記述して、その内容を解析するものとなっています。

2の部分で解析したいHTMLを指定しています。内容としては「h1」「h2」「p」です。3の部分はBeautifulSoup(引数1,引数2)メソッドです。引数1にHTMLを指定、引数2にパーサーを指定しています。4の部分は任意の部分を抽出しています。「h1」「h2」「p」を抽出しています。「soup.html.body.h1」はh1がどこにあるのか指定しています。5の部分は文字を取得しています。

結果
#h1 :  【Python応用】BeautifulSoupを用いた基本的なスクレイピング方法
#h2 :  BeautifulSoupとは
#p :  スクレイピングをする上で任意の情報を抽出するライブラリが「BeautifulSoup」です。

>>>「BeautifulSoup」におけるidを指定して要素抽出する方法

CSSセレクタでの抽出

抽出方法には、CSSセレクタを指定して抽出する方法もあります。以下ではCSSセレクタを用いた抽出方法を紹介しています。

プログラムの流れ

プログラムの大まかな流れです。

  1. URLの指定
  2. パーサーの指定(html.parser)
  3. selectを用いて抽出(h2)

プログラム

from bs4 import BeautifulSoup
import urllib.request as urreq

#1---URL指定
url = "https://www.hobby-happymylife.com/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/python_scraping_beautifulsoup_id/"
ans = urreq.urlopen(url)
#2---パーサー指定
soup = BeautifulSoup(ans,'html.parser')
#3---h2の抽出
all_h2 = soup.select('h2')
for i in range(3):#3つ抽出
    cell = all_h2[i].string
    print(cell)

上記のプログラムは、Web(本サイト)から情報を取得して解析するものになります。

1の部分では、URLを指定しています。次に2の部分ではパーサーを指定しています。3の部分では「select」を用いて「h2」の抽出をしています。

結果
id属性とは
find()メソッドを用いた要素探索
find_all()メソッドを用いた要素探索

>>>「BeautifulSoup」におけるCSSセレクタを操作する方法

よくあるエラーと回避方法

  • エラー1: AttributeError: 'NoneType' object has no attribute 'get_text'
    select_oneで要素が見つからなかった場合に発生します。サイト構造が変更されていないか確認しましょう。
  • エラー2: アクセス拒否(403エラー)
    headersを指定してブラウザからのアクセスに見せかけると回避できる場合があります。
headers = {"User-Agent": "Mozilla/5.0"}
requests.get(url, headers=headers)

まとめ

BeautifulSoupを使うことで、Python初心者でも数行のコードでWebサイトから情報を取得できます。

  • requestsでページ取得
  • BeautifulSoupで解析
  • find_allselectでデータ抽出

初心者の方はまずニュース記事や株価取得などの簡単なところから試し、徐々に応用していきましょう。

BeautifulSoupの操作

項目内容
BeautifulSoupにおけるidでの要素探索BeautifulSoupではHTML内のid属性をfind()メソッドを用いて解析することが可能です。ここでは、find()メソッドを用いた解析方法について解説しています。
BeautifulSoupとurlopenによるスクレイピングBeautifulSoupは解析するもので、単体ではスクレイピングが成立しません。そこで、ウェブサイトから情報を抽出するにはurlopenを用いてサイトにアクセスする必要があります。ここでは、urlopenとBeautifulSoupを用いたスクレイピングについて解説しています。
BeautifulSoupにおけるCSSセレクタの操作BeautifulSoupを用いた解析において、CSSセレクタを用いた探索方法があります。「soup.select_one()」などを用いることで要素を抽出できます。ここでは、「soup.select_one()」を用いて解説しています。

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