PR ライブラリ 業務効率化

requests + BeautifulSoupを使ったWebスクレイピングのやり方 3stepでわかりやすく解説!

※本サイトの記事には、アフィリエイト広告が含まれる場合があります。

  • Pythonの基礎を勉強したけど、次に何しよう?
  • Webスクレイピングってどうやるんだろう?
  • サイトから情報収集するのに、コピペに時間がかかって困る。効率化できないかな?

こんな悩みを解決します!!

Webスクレイピングってご存じですか?

簡単に言うと、Webサイトの情報を自動で取得することです。

取得できる情報はWebサイトのタイトルや本文、画像、リンクURLなどで、Webサイト上に表示されている情報はほぼ取得できます。

Webスクレイピングは流れがわかればすぐできるようになります。

そのため、Pythonの基礎を覚えた後に挑戦する題材としては適していると思います。

また、複数のページから情報を取得するできるため、仕事でWeb上から情報収集する際、データを何度もコピペする必要がなくなります!

ココナラでWebスクレイピングの案件も出品されているので、うまくいけば副業として収益を得ることもできます。

本記事では、PythonでのWebスクレイピングのやり方を3stepでわかりやすく解説します。

Webスクレイピングをする際の注意点も記載しているので、最後まで読んでいただけると嬉しいです!!


\ 学習時間をムダにしたくないなら /

おすすめオンラインスクール

Pythonを効率的に学習するには、オンラインスクールを活用するのがおすすめです。
おすすめオンラインスクールはこちらの記事で紹介しています。  

コスト重視:デイトラPythonコース 紹介記事はコチラ

AIスキル重視:Aidemy PREMIUM 紹介記事はコチラ

転職重視:キカガク長期コース 紹介記事はコチラ

Python ソースコード例

ライブラリのインストール

「requests」と「beautifulsoup」をインストールしていない方は下記コマンドをコマンドプロンプトで実行しましょう。

pip install requests
pip install beautifulsoup4

ソースコード例

今回は私のプロフィール文を抽出するコードです。

############################
## ライブラリのインポート ##
############################
# スクレイピング用
from time import sleep

from bs4 import BeautifulSoup
import requests

# データ保存用
import pandas as pd

####################
## スクレイピング ##
####################
# 対象サイトのURLを格納する
url = "https://pythonsoba.tech/profile/"

# requestsを使用して、htmlを取得。変数rに格納
r = requests.get(url)

# 対象サイトへ負荷をかけないように、1sec待機
sleep(1)

# 取得結果を解析してsoupに格納
soup = BeautifulSoup(r.content, "html.parser")

# 本文が入っている「entry-content」クラスを抽出
contents = soup.find("div", class_="entry-content")

# 本文を抽出
data_list = contents.find_all("p")

# データフレームに格納するため、抽出結果をまとめる
data_result = []

for data in data_list:
    # 抽出した本文を辞書に格納する
    data_set = {
        '本文': data.text
    }

    # 取得した辞書をd_listに格納する
    data_result.append(data_set)

##################
## データを保存 ##
##################
# data_resultを、データフレームに格納
df = pd.DataFrame(data_result)

# to_csv()を使って、データフレームをCSV出力する
df.to_csv("test.csv",index=None,encoding="utf-8-sig")

【重要】Webスクレイピングを始める前に

Webスクレイピングについて、おさらいです。

Webスクレイピングとは、Webサイトの情報を自動で取得することです。

取得できる情報はWebサイトのタイトルや本文、画像、リンクURLなどです。

Webスクレイピングをうまく活用できれば、仕事や趣味などでの情報収集を効率的に行えます。

Webスクレイピングの流れ次の通りです。

  1. Webサイトのhtmlを取得
  2. データ抽出
  3. 抽出したデータを保存

Webスクレイピングしても大丈夫なサイトか確認

WebスクレイピングNGなサイト例

  • Amazon
  • 楽天市場
  • Twitter
  • Instagram
  • YouTube
  • Facebook
  • Yahoo!ファイナンス
  • Wantedly
  • NewsPicks
  • メルカリ  など

今回紹介する方法でのWebスクレイピングがNGでも、専用APIを使用すればデータ抽出できるサイトもあります。

WebスクレイピングNGか確認する方法

①Webサイトの利用規約を確認する。

検索キーワード例

  • 自動
  • ロボット
  • クローリング
  • スクレイピング
  • auto
  • robot
  • crawling
  • scraping など

②robot.txtを確認する

robots.txt とは、検索エンジンのクローラに対して、Webサイトのどこ にアクセスしてよいかを伝えるファイルのことです。

クローラとは、Webサイトを自動的に巡回して、公開されている文書や画像などのデータを収集するプログラムのことです。

robots.txt には自動でアクセスしてよいURLが記載されているので、スクレイピングする前に確認してください。

STEP1 Webサイトのhtmlを取得

ポイント

  • requests.get()でWebサイトのhtmlを取得する
  • スリープを入れる

requests.get()でWebサイトのhtmlを取得する

# 対象サイトのURLを格納する
url = "https://pythonsoba.tech/profile/"

# requestsを使用して、htmlを取得。変数rに格納
r = requests.get(url)

Webサイトに直接アクセスして、指定したURLのhtmlを取得します。

変数 r に格納したURLを確認したいときは、r.textやr.contentで出力します。

スリープを入れる

# 対象サイトへ負荷をかけないように、1sec待機
sleep(1)

Webサイトに連続でアクセスすると、サーバーに負荷がかかります。

サーバーに負荷をかけすぎると、サーバーが落ちる可能性があります。

また、悪質な行為と判断されればサーバーからブロックされたり、最悪、罪に問われる可能性もあります。

必ず1秒程度のスリープを入れましょう。

STEP2 データ抽出 BeautifulSoup

ポイント

  • requestsで取得したhtmlを解析する
  • 欲しい情報がhtml内のどこにあるか確認する
  • 情報を抽出する

requestsで取得したhtmlを解析する

# 取得結果を解析してsoupに格納
soup = BeautifulSoup(r.content, "html.parser")

BeautifulSoupを使用して、変数 soup に解析結果を格納します。

html.parse は解析手段をしているのですが、基本はこのままでOKです。

欲しい情報がhtml内のどこにあるか確認する

欲しい情報がhtml内のどこにあるか確認するには、ブラウザ(edgeやchromeなど)で直接htmlを見る必要があります。

本記事ではchromeで説明します。

確認したいWebサイト上で右クリックをし、「検証」を押します。

右側にWebサイトのhtmlが表示されるので、下記赤枠のボタンを押します。

Webサイトの文章などにカーソルを合わせると、htmlのどこに書かれているか表示されるので、タグ(<dev class="entry-content">や<p>のこと)を確認します。

情報を抽出する

# 本文が入っている「entry-content」クラスを抽出
contents = soup.find("div", class_="entry-content")

# 本文を抽出
data_list = contents.find_all("p")

# データフレームに格納するため、抽出結果をまとめる
data_result = []

for data in data_list:
    # 抽出した本文を辞書に格納する
    data_set = {
        '本文': data.text
    }

    # 取得した辞書をd_listに格納する
    data_result.append(data_set)

欲しい情報のタグを確認したら、find()やfind_all()でデータを抽出します。

  • find()  : データを最初の1つだけ抽出します。
  • find_all() : 該当するすべてのデータを抽出します。抽出結果はリストとして出力されます。

find()やfind_all()で取得したデータは 「.text」 でテキストデータを抽出することができます

今回の例では取得したい本文がタグ<p>内にあり、本文以外のデータを抽出したくなかったため、2段階で抽出をしています。タグ<dev>のクラス"entry-content"を抽出してから、その結果からさらにタグ<p>を抽出する流れです。

抽出した結果は後で保存しやすいように、辞書に格納しています。

STEP3 抽出したデータの保存

ポイント

  • pandasのデータフレームを使用して、csvに保存する

pandasのデータフレームを使用して、csvに保存する

# data_resultを、データフレームに格納
df = pd.DataFrame(data_result)

# to_csv()を使って、データフレームをCSV出力する
df.to_csv("test.csv",index=None,encoding="utf-8-sig")

SETP2で抽出したデータをデータフレームにしてから、csvで保存します。

保蔵方法は今回紹介している方法以外でもOKです。

活用しやすいように、データ処理や保存をしましょう!

よくある質問

Webスクレイピングって何?

Webスクレイピングは、ウェブサイトからデータを自動的に収集する技術のこと。

Pythonには、HTMLやXMLからデータを抽出するためのライブラリが多数あり、これらを利用してWebページの情報を取得し、解析することができます。

Webスクレイピングのメリットは?

Webサイトから手動で情報を取得するよりも、効率的に情報を取得することができます。

Webスクレイピングをするには、どんなライブラリを使うの?

PythonのWebスクレイピングでは、BeautifulSoupやScrapy、Requests、Seleniumなどのライブラリを使用します。

Webスクレイピングをするときに注意すべきことは?

Webスクレイピングをするときは、Webサイトの利用規約に従うように注意してください。

また、Webサイトのサーバーに負荷をかけないように、適切な時間間隔を設定することも大切です。

まとめ

PythonでのWebスクレイピングのやり方を3stepでわかりやすく解説しました。

  1. Webサイトのhtmlを取得
  2. データ抽出
  3. 抽出したデータを保存

Webサイトに合わせて、「2.データ抽出」で工夫が必要ですが、基本の流れは変わりません。

また、Webスクレイピングする際は下記注意点を意識してください。

  • WebスクレイピングNGか確認する
  • スリープを入れる

最後まで読んでいただきありがとうございます!

ご意見、ご感想があれば、コメントを頂けるとうれしいです!!

  • この記事を書いた人

よすけ

☆Pythonプログラマー ☆副業で業務改善ツール作成実績あり ☆noteでサンプルコード公開中 https://note.com/pythonsoba ☆デイトラPythonコース受講 ☆A.I.、機械学習を日々勉強中 ☆基本情報技術者、ソフトウェア開発技術者 取得 ☆趣味はスノーボード、ボルダリング、ドライブ

-ライブラリ, 業務効率化
-, , ,

業務効率化ツールのサンプルコードを多数公開中!
サンプルコードをみる
業務効率化ツールのサンプルコードを多数公開中!
コードをみる