Python
 Computer >> コンピューター >  >> プログラミング >> Python

【初心者向け】PythonとBeautifulSoupでWebスクレイピングを始める方法

BeautifulSoupは、Pythonのbs4モジュールに含まれるクラスです。HTMLやXMLドキュメントを解析(パース)することを主な目的として設計されており、Webスクレイピングを行う際に最も広く使われているライブラリの一つです。この記事では、bs4のインストール方法から、実際にリンクを抽出するサンプルコードまで、初心者にもわかりやすく解説します。

bs4(BeautifulSoup)のインストール方法

bs4はpipを使えば簡単にインストールできます。コマンドライン(ターミナル)で以下のコマンドを実行してください。

pip install bs4

コマンドを実行すると、ターミナルには以下のような出力が表示されます。

C:\Users\rajesh>pip install bs4
Collecting bs4
Downloading https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Requirement already satisfied: beautifulsoup4 in c:\python\python361\lib\site-packages (from bs4) (4.6.0)
Building wheels for collected packages: bs4
Building wheel for bs4 (setup.py) ... done
Stored in directory: C:\Users\rajesh\AppData\Local\pip\Cache\wheels\a0\b0\b2\4f80b9456b87abedbc0bf2d52235414c3467d8889be38dd472
Successfully built bs4
Installing collected packages: bs4
Successfully installed bs4-0.0.1

インストールの確認

BeautifulSoupが正しくインストールされたかどうかを確認するには、同じターミナル上で以下のようにPythonインタプリタを起動し、モジュールをインポートしてみましょう。

C:\Users\rajesh>python
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup
>>>

エラーが表示されずにプロンプトが戻ってくれば、インストールは成功です。

例1:HTMLドキュメントからすべてのリンクを抽出する

まず、HTMLドキュメント内のすべての参照リンクを収集するケースを考えてみましょう。ここでは、対象となるHTMLを文字列として変数に格納します。

html_doc='''<a href='www.Tutorialspoint.com'/a>
<a href='www.nseindia.com.com'/a>
<a href='www.codesdope.com'/a>
<a href='www.google.com'/a>
<a href='www.facebook.com'/a>
<a href='www.wikipedia.org'/a>
<a href='www.twitter.com'/a>
<a href='www.microsoft.com'/a>
<a href='www.github.com'/a>
<a href='www.nytimes.com'/a>
<a href='www.youtube.com'/a>
<a href='www.reddit.com'/a>
<a href='www.python.org'/a>
<a href='www.stackoverflow.com'/a>
<a href='www.amazon.com'/a>
<a href='www.rediff.com'/a>'''

次に、この変数html_docをBeautifulSoupのイニシャライザに渡して、soupオブジェクトを作成します。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

soupオブジェクトができたら、BeautifulSoupクラスの各メソッドを適用できるようになります。たとえば、find_all()メソッドを使えば、指定したタグやその属性値をすべて取得できます。

for tag in soup.find_all('a'):
    print(tag.get('href'))

このコードでは、ループ処理によってhtml_doc内のすべての<a>タグを順番に取り出し、それぞれからhref属性の値を取得しています。

以下が、HTMLドキュメントから全リンクを抽出する完全なコードです。

from bs4 import BeautifulSoup

html_doc='''<a href='www.Tutorialspoint.com'/a>
<a href='www.nseindia.com.com'/a>
<a href='www.codesdope.com'/a>
<a href='www.google.com'/a>
<a href='www.facebook.com'/a>
<a href='www.wikipedia.org'/a>
<a href='www.twitter.com'/a>
<a href='www.microsoft.com'/a>
<a href='www.github.com'/a>
<a href='www.nytimes.com'/a>
<a href='www.youtube.com'/a>
<a href='www.reddit.com'/a>
<a href='www.python.org'/a>
<a href='www.stackoverflow.com'/a>
<a href='www.amazon.com'/a>
<a href='www.rediff.com'/a>'''

soup = BeautifulSoup(html_doc, 'html.parser')

for tag in soup.find_all('a'):
    print(tag.get('href'))

実行結果

www.Tutorialspoint.com
www.nseindia.com.com
www.codesdope.com
www.google.com
www.facebook.com
www.wikipedia.org
www.twitter.com
www.microsoft.com
www.github.com
www.nytimes.com
www.youtube.com
www.reddit.com
www.python.org
www.stackoverflow.com
www.amazon.com
www.rediff.com

例2:特定のキーワードを含むリンクだけを抽出する

次に、より実践的な例として、Webサイトから「python」というキーワードを含むURLだけを抽出してみましょう。urllib.requestモジュールでページのHTMLを取得し、正規表現(reモジュール)でフィルタリングします。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re

html = urlopen("https://www.python.org")
content = html.read()
soup = BeautifulSoup(content)
for a in soup.findAll('a', href=True):
    if re.findall('python', a['href']):
        print("Python URL:", a['href'])

このプログラムは、指定したWebサイト(ここではpython.org)からすべての<a>タグを取得し、href属性に「python」という文字列が含まれるURLのみを出力します。

実行結果

Python URL: https://docs.python.org
Python URL: https://pypi.python.org/
Python URL: https://www.facebook.com/pythonlang?fref=ts
Python URL: https://brochure.getpython.info/
Python URL: https://docs.python.org/3/license.html
Python URL: https://wiki.python.org/moin/BeginnersGuide
Python URL: https://devguide.python.org/
Python URL: https://docs.python.org/faq/
Python URL: https://wiki.python.org/moin/Languages
Python URL: https://python.org/dev/peps/
Python URL: https://wiki.python.org/moin/PythonBooks
Python URL: https://wiki.python.org/moin/
Python URL: https://www.python.org/psf/codeofconduct/
Python URL: https://planetpython.org/
Python URL: /events/python-events
Python URL: /events/python-user-group/
Python URL: /events/python-events/past/
Python URL: /events/python-user-group/past/
Python URL: https://wiki.python.org/moin/PythonEventsCalendar#Submitting_an_Event
Python URL: //docs.python.org/3/tutorial/controlflow.html#defining-functions
Python URL: //docs.python.org/3/tutorial/introduction.html#lists
Python URL: https://docs.python.org/3/tutorial/introduction.html#using-python-as-a-calculator
Python URL: //docs.python.org/3/tutorial/
Python URL: //docs.python.org/3/tutorial/controlflow.html
Python URL: /downloads/release/python-373/
Python URL: https://docs.python.org
Python URL: //jobs.python.org
Python URL: https://blog.python.org
Python URL: https://feedproxy.google.com/~r/PythonInsider/~3/Joo0vg55HKo/python-373-is-now-available.html
Python URL: https://feedproxy.google.com/~r/PythonInsider/~3/N5tvkDIQ47g/python-3410-is-now-available.html
Python URL: https://feedproxy.google.com/~r/PythonInsider/~3/n0mOibtx6_A/python-3.html
Python URL: /events/python-events/805/
Python URL: /events/python-events/817/
Python URL: /events/python-user-group/814/
Python URL: /events/python-events/789/
Python URL: /events/python-events/831/
Python URL: /success-stories/building-an-open-source-and-cross-platform-azure-cli-with-python/
Python URL: https://wiki.python.org/moin/TkInter
Python URL: https://www.wxpython.org/
Python URL: https://ipython.org
Python URL: #python-network
Python URL: https://bugs.python.org/
Python URL: https://mail.python.org/mailman/listinfo/python-dev
Python URL: https://github.com/python/pythondotorg/issues
Python URL: https://status.python.org/

まとめ

このように、BeautifulSoupを使えば数行のコードでHTMLの解析やリンク抽出が簡単に行えます。find_all()やfindAll()などの検索メソッドと、reモジュールによる正規表現を組み合わせることで、目的のデータだけを効率的に取り出すことが可能です。まずはローカルのHTMLファイルで練習し、その後urllibなどで実際のWebページを取得する流れに進むと、スクレイピングの理解が深まります。

  1. Pythonでフォトモザイクを実装する方法をわかりやすく解説

    フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン

  2. PythonでWebスクレイピング!主要ライブラリ6選の特徴と使い方を徹底解説

    Webスクレイピングとは コンピュータサイエンスにおけるWebスクレイピング(Web Scraping)とは、Webサイトからデータを抽出する技術のことです。この手法を活用することで、Web上に散在する非構造化データを、分析や加工がしやすい構造化データへと変換できます。 Python 3でよく使われる代表的なスクレイピングツールは以下の6つです。 Urllib(urllib.request) Requests BeautifulSoup Lxml Selenium MechanicalSoup 1. Urllib(urllib.request) UrllibはPythonに標準で組み込ま