【初心者向け】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ページを取得する流れに進むと、スクレイピングの理解が深まります。
-
Pythonでフォトモザイクを実装する方法をわかりやすく解説
フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン
-
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に標準で組み込ま