PythonとBeautiful Soupで簡単スクレイピング

2019.09.20

2021.08.12

Fabeee社員ブログ


はじめまして、バターです!(今のところニックネームがないので、よく呼ばれるバターにしてみました)
 
自己紹介


・エンジニア歴は4年目のギリ若手、前職はSES系の会社で主にJavaを使用した業務アプリケーションの開発に携わってきました
・今年4月、Fabeeeに入社しました
・現在は社内で受託開発をメインに担当しています
・髪色を派手にするのが好き
・鹿児島出身ですがお酒は苦手
 
本題


みなさんスクレイピングってご存知でしょうか。
スクレイピングは簡単にいうと「htmlファイル全体を取得しその中から目的のデータを抽出すること。」です。
そして、そのスクレイピングに特化したPythonのライブラリが「Beautiful Soup」なのです。
 
▼まずはBeautiful Soupを使えるようにする
※pythonが既にPCにインストールされているものとして進めていきます。
pip install beautifulsoup4
 
今回スクレイピングする対象は、Fabeeeのメンバー紹介ページです。
ここからメンバーの役職、氏名、紹介文をスクレイピングしてみます。
 
▼メンバー紹介ページのURLを指定してページ情報を取得

import requests
from bs4 import BeautifulSoup
def scraping():
    url = 'https://fabeee.co.jp/aboutus/team/' # スクレイピング対象のURL
    response = requests.get(url=url) # 対象のURLからページ情報を取得
    bs = BeautifulSoup(response.text, 'html.parser')

 
▼取得する要素を特定
ブラウザの機能を使用して要素を参照してみると、メンバーはそれぞれクラス名が「box-elements」というdivタグで囲まれていることがわかります。

 

 

以下のように取得したいタグ名とクラス名を指定して要素を取得します。

officers = bs.select('div.box-elements')

Beautiful Soupはこんな風にシンプルなコードで直感的にスクレイピングできるところが良いですね。
 
▼メンバーごとの役職、氏名、紹介文を取得して出力
同じように要素を参照すると、以下のようになっていることがわかります。
役職 :クラス名が「text-teamposition」のpタグ
氏名 :h3タグ
紹介文:クラス名が「text-explain」のpタグ
 

for officer in officers:
    # 役職
    position = officer.select('p.text-teamposition')
    if len(position) > 0:
        position = position[0].text.strip()
    # 氏名
    name = officer.select('h3')
    if len(name) > 0:
        name = name[0].text.strip()
    # 紹介文
    introduction = officer.select('p.text-explain')
    if len(introduction) > 0:
        introduction = introduction[0].text.strip()
    # 役職・氏名・紹介文が取得できていれば出力
    if position and name and introduction:
        print(f'役職:{position}, 氏名:{name}, 紹介文:{introduction}')
        print('')

 
▼出力結果

役職:代表取締役, 氏名:佐々木 淳, 紹介文:幼少期からプロサッカー選手を夢見て、読売日本サッカークラブJrユース(現東京ヴェルディ)に所属...
役職:取締役 COO, 氏名:櫛引 一臣, 紹介文:大学卒業後、2006年に人材サービスの株式会社ウィルグループに入社。営業職特化の...
役職:取締役 CTO, 氏名:杉森 由政, 紹介文:東京理科大学在学中は、宇宙物理学を専攻し、線形代数、統計解析やテンソル計算といった機械学習の基礎知識を習得...

 
▼最後に
無事スクレイピングできました!
スクレイピングができると、Webページから必要な情報を必要なだけ取得したりできるようになります。
今回は取得する情報が少なかったのであまりありがたみを感じられませんでしたが、取得したい情報が多ければ多いだけスクレイピングは真価を発揮します。
手作業で1つ1つ集めるよりも、スクレイピングのほうが迅速かつ正確に情報を集めることができます。
冒頭のpipでモジュールをインストールすれば誰でもすぐにPythonとBeautiful Soupでスクレイピングができるようになるので、一度やってみてはいかがでしょうか。
以上、バターでした!
 
▼今回のソースコードは以下

import requests
from bs4 import BeautifulSoup
def scraping():
    url = 'https://fabeee.co.jp/aboutus/team/' # スクレイピング対象のURL
    response = requests.get(url=url) # 対象のURLからページ情報を取得
    bs = BeautifulSoup(response.text, 'html.parser')
    officers = bs.select('div.box-elements')
    for officer in officers:
        # 役職
        position = officer.select('p.text-teamposition')
        if len(position) > 0:
            position = position[0].text.strip()
        # 氏名
        name = officer.select('h3')
        if len(name) > 0:
            name = name[0].text.strip()
        # 紹介文
        introduction = officer.select('p.text-explain')
        if len(introduction) > 0:
            introduction = introduction[0].text.strip()
        # 出力
        if position and name and introduction:
            print(f'役職:{position}, 氏名:{name}, 紹介文:{introduction}')
            print('')
if __name__ == "__main__":
    scraping()

SES/受託開発のご依頼についてはこちら

Fabeee編集部

Fabeee編集部

こちらの記事はFabeee編集部が執筆しております。