Python

PythonでWebスクレイピングをする

By 2021年9月25日No Comments

この記事では、PythonでWebスクレイピングをする方法について解説していきます。

WebスクレイピングするとWebサイトにある必要な情報を収集することができます。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト

スクレイピングする際はWebサイトによってはスクレイピングが禁止されている場合があるので注意が必要です。Webサイトの利用規約にスクレイピングが禁止かどうかは明記されていることがほとんどになるので自分がスクレイピングしたい対象のWebサイトがスクレイピングを禁止していないかどうかは事前に確認する必要があります。

今回は、練習として本サイトの下記のURLのHTMLデータをスクレイピングしていきます。

PythonでWebサイトをスクレイピングする

PythonのライブラリであるrequestsモジュールとBeautifulSoupモジュールを使って対象のWebサイトをスクレイピングしていきます。

requestsモジュールとBeautifulSoupモジュールはWindowsならコマンドプロンプト、Macでターミナルなどのコマンドラインで下記のように指定してインストールします。

pip install requests
pip install beautifulsoup4

requestsモジュールはWebサイトの情報を取得するためのモジュールです。スクレイピングするために必要なWebページのデータを取得できます。

get( )メソッドの引数にスクレイピングする対象のWebサイトのURLを指定してページにアクセスしてサーバーからのレスポンスを取得します。

import requests

html = requests.get('https://hosl.dev/')
print(html)

出力結果:

<Response [200]>

実行結果の「200」という数字はステータスコードでサイトに正常にアクセスできていることを示します。サーバーからのレスポンスを取得する事ができました。

Webサイト内のデータのHTMLを出力するにはprint( )関数の引数に「.text」をつけます。

import requests

html = requests.get('https://hosl.dev/')
print(html.text)

出力結果:

<!DOCTYPE html>
<html lang="ja" class="no-js">
<head>
( ....途中省略)
</body>
</html>

WebサイトのデータをHTMLとして出力することができました。HTMLを取得したら次はそのHTMLからデータを抽出していきます。データを抽出するにはBeautifulSoupモジュールを使っていきます。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')
print(soup.title)

出力結果:

<title>本町オープンソースラボ -大阪でのIT勉強会多数開催!大阪本町のエンジニア向けコミュニティ-</title>

「BeautifulSoup(html, ‘html.parser’)」のコードでHTMLデータを取得して「.title」をつける事でHTMLのタイトルを取得しています。

「.title.text」とするとタイトルタグの中身のみを取得することができます。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')
print(soup.title.text)

出力結果:

本町オープンソースラボ -大阪でのIT勉強会多数開催!大阪本町のエンジニア向けコミュニティ-

上記ではタイトルのみ取得しましたが、他にも特定のタグや条件を指定してデータを取得できます。

サイト内のh2タグのデータを全て取得していきます。取得する要素が複数ありテキストのみを取得するにはforループでデータを一つ一つ抽出する必要があります。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')
a = soup.find_all("h2")
for aa in a:
    print(aa.text)

出力結果:

HOMMACHI OPEN SOURCE LAB
プログラミング初心者対象!Python入門セミナー
エンジニアドリブンで新しいサービスが生まれるインキュベーションの役割
ITセミナー・勉強会の配信会場としても利用
今まで開催されたITイベント・オーガナイザー数
備品・環境
Udemyの動画学習でもPythonを勉強しよう!

Webサイト内のh2タグのデータを全て取得することができました。

aタグのデータを取得していきます。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')
print(soup.title.text)

print(soup.find_all('a')) #すべてのaタグを出力

出力結果:

[<a data-supplied-ml="false" data-supplied-ml-starting="false" data-supplied-ml-starting-dark="false" href="https://hosl.dev" id="logo">
<img alt="本町オープンソースラボ -大阪でのIT勉強会多数開催!大阪本町のエンジニア向けコミュニティ-" class="stnd default-logo"
(...以下省略)

Webサイト内の全てのaタグのテキストデータのみを取得しています。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')

a = soup.find_all('a')
for aa in a:
    print(aa.text)

出力結果:

エンジニア転職支援サービス
Pythonセミナー
【プログラミング初心者対象】大阪開催!Python入門セミナー(オンライン) 
【環境構築できるまでサポート!】オンラインでPythonインストールと環境構築セミナー(mac/windows)
法人向けインハウスIT研修
About
Contents
Contact
本町オープンソースラボについて
セミナー情報を詳しく見る

このように「.text」をつけてテキストデータのみを取得する事ができました。次に、aタグの「href」の中身のURLのデータを取得していきます。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')

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

出力結果:

https://hosl.dev #sidewidgetarea
#https://agent.hosl.dev/
https://hosl.dev/python_seminar_for_beginners/https://agent.hosl.dev/https://hosl.dev/buld_python_env/https://hosl.dev/inhouse_seminer/

(...以下略)

このままでは「href」のURLがはいっているデータ以外も取得してしまっているのでif文で「https」から始まるデータのみを取得していきます。

from bs4 import BeautifulSoup
import requests

html = requests.get('https://hosl.dev/')
soup = BeautifulSoup(html.text, 'html.parser')

a = soup.find_all('a')
for aa in a:
    aaa = aa.get('href')
    if None == aaa:
        continue
    if "https" in aaa:
        print(aaa)

出力結果:

https://hosl.dev https://agent.hosl.dev/ https://hosl.dev/python_seminar_for_beginners/ https://hosl.dev/buld_python_env/
https://hosl.dev/inhouse_seminer/
(...以下略)

対象のWebサイトのHTMLのaタグのURLのみを全て取得する事ができました。

このようにrequestsモジュールとBeautifulSoupモジュールを使って対象のWebサイトの様々なデータをスクレイピングして取得する事ができます。

まとめ

この記事ではPythonでWebスクレイピングをする方法について解説しました。

Webスクレイピングをすると天気予報の情報を取得したりWebサイトの検索順位を取得したり、株価から株価推移を抽出したりECサイトから商品の情報を抽出したり様々なことをWebスクレイピングを通しておこなう事ができます。以上、PythonでWebスクレイピングをする方法についてでした。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL