PythonにおけるWebスクレイピングについて
Python Webスクレイピングとは
「Webスクレイピング」とは、Webサイトから自分が欲しい情報を絞り込み収集する技術です。「Webクローリング」とも呼ばれています。Webスクレイピングは大きく「取得」と「解析」の二段階で構成されます。Webスクレイピングは様々なプログラミング言語で可能ですが、本記事では、Pythonを使用したWebスクレイピングの方法について紹介します。
Python Webスクレイピングの手順
1、Webサーバにページを表示する情報を取得するためのリクエストを送ります。
Pythonでは、Webサーバから情報を取得する際に必要なHTTP通信を手軽に行うためのサードパーティ製の「requests」ライブラリを使用します。
2、受け取ったレスポンスのHTMLから自分の欲しい情報を見つけます。
情報を取得した段階では、ページ全体が取得され必要な情報以外の情報が多く含まれ、タグ記法が入り組んだ状態のためそのまま読み取ることは困難です。Pythonでは、HTMLやXML形式を解析し扱いやすい形態に絞り込むために便利な「BeautifulSoup」ライブラリを使用して、HTMLな中から自分に必要な情報を見つけ出し、絞り込みます。
3、見つけ出した必要な情報を使いやすい形式で出力します。
自分に必要な情報を抜き出すことができたら、そのデータを活用するために、データを扱いやすい形式に変換し、表示したり、ファイルやデータベースに保存する作業が必要です。
出力形式にもよりますが、「format」メソッドを使用し表示したり、テキストファイルへの書き出し、ライブラリを用いたエクセルファイルやデータベースへの保存など様々な方法があります。
Webスクレイピング プログラムを書き始める前の準備
<「requests」ライブラリのインストール>
Pythonの「requests」ライブラリをインストールするため、ターミナルから以下のコマンドを実行します。
> pip install requests
※macOSの場合は「pip3 install」と入力し実行します。
インストール完了後、インタラクティブシェル(対話型シェル)を起動しライブラリの動きを確認します。
(インタラクティブシェルを起動)
> python
※macOSの場合は「python3」と入力し実行します。
<requestライブラリのインポート>
>>> import request
>>>
インポート実行後、何も出力されなければインストール成功です。エラーメッセージが表示された場合インストールに失敗しているので再度ターミナルからインストールを試みます。
(インタラクティブシェルの終了)
>>> quit()
<「BeautifulSoup」ライブラリのインストール>
Pythonの「BeautifulSoup」ライブラリをインストールするため、ターミナルから以下のコマンドを実行します。最新版は「BeautifulSoup4」という名称でPyPIに登録されています。
> pip install BeautifulSoup4
※macOSの場合は「pip3 install」と入力し実行します。
インストール完了後、インタラクティブシェル(対話型シェル)を起動しライブラリの動きを確認します。
(インタラクティブシェルを起動)
> python
※macOSの場合は「python3」と入力し実行します。
(BeautifulSoupライブラリのインポート)
>>> from bs4 import BeautifulSoup
>>>
「BeautifulSoup」ライブラリは「bs4」パッケージに入っていますので「from bs4」を指定します。「requests」ライブラリ同様、何も出力されなければインストール成功です。
Webスクレイピング Webページからテキスト情報を取得する方法
「requests.get」の引数にWebページのURLを指定し、結果を変数(result)に代入します。実行後「response[200]」と実行結果表示されれば問題なく処理されています。
>>> result = requests.get(‘ URL ‘)
変数に「.text」を使用することでテキスト情報を取得することができます。
>>> result .text
ここまでをPython実行形式ファイル(.py)にすると下記の通りです。
import requests
result = requests.get(‘ URL ‘)
print(result.text)
作成したPython実行形式ファイル(.py)を「Documents」に保存し、ターミナルでスクリプトファイルとして実行すると、ファイル内で指定されたWebページのHTMLが表示されます。
>python Document/ [ファイル名].py
※macOSの場合は「python3」と入力し実行します。
Webスクレイピング 取得した情報を解析・出力する方法
Pythonを用いて情報を取得しただけでは余計な情報が多く、そのままでは読み取ることが困難です。そのため先ほど取得したHTMLの解析をPythonのサードパーティ製ライブラリである「BeautifulSoup」を使用して行っていきます。
「BeautifulSoup」は2つの引数を指定します。第一引数には、解析対象のHTMLを文字列で指定します。この時、「requests」ライブラリで取得したHTML情報を渡します。「.text」をつけることで文字列を取り出すことができます。第二引数では、解析の際の処理の種類を指定します。処理の種類には、標準ライブラリ( html.parser等)の他にサードパーティ製(lxml、html5lib等)のものがあります。それぞれ処理速度や得意な処理等が異なっています。「BeautifulSoup」から返される結果のオブジェクトを変数(data1)に代入します。
>>> data1=BeautifulSoup(result.text,‘html.parser’)
HTMLの中からメソッドを使用して要素を探します。
メソッド | 機能 |
find() | 引数で指定したHTMLタグを検索して最初に一致したもの を返します。 |
find_all() | 引数で指定したHTMLタグを検索して一致したもの全て を格納したリストを返します。 |
select() | 引数をCSS Selectorとして検索を行い一致したもの全て を格納したリストを返します。 |
select_one() | 引数をCSS SelectorというHTMLの構造をとる方法として検索を行い最初に一致したものを返します。 |
例として、「find_all()」メソッドを使用して、Webサイトから画像リンク(imgタグ)を抜き出す場合には下記となります。
>>> data1.find_all(‘img’)
テキスト検索を行う場合は、基本的にBautifulSoupでは完全一致で検索が行われます。この方法では正規表現やワイルドカード等は使用できません。
>>> data1.find_all(text=‘検索したいテキスト’)
「BeautifulSoup」では「find_all()」等のメソッドを利用し、「id属性」(「id=」+’id名’)や「class属性」(「class_=」+’クラス名’)を指定することで、範囲を絞り込んで検索することが可能です。divタグで「classがpresentation」に該当する部分をHTMLから抜き出そうとすると下記になります。
>>> data1.find_all(‘div’,class_=’presentation’)
検索結果を変数(p)に代入します。
>>> data2=data1.find_all(‘div’,class_=’presentation’)
検索結果のオブジェクトに「.タグ名」で1階層下の要素に絞り込むことができます。
例えばタイトルに使用されるh3タグの検索は下記になります。
>>> data2.h3
HTMLのタグ以外のテキスト部分だけを結果表示したい場合には「get_text()」を使用します。
>>> data2.h3.get_text()
ここまでをPython実行形式ファイル(.py)にすると下記の通りで、PythonによるWebスクレイピングの基本プログラムになります。
import requests
from bs4 import BeautifulSoup
result=requests.get('URL')
data1=BeautifulSoup(result.text,'html.parser')
data2=data1.find_all('div',class_='presentation')
for data3 in data2:
print(data3.h3.get_text())