Pythonでスクレイピングをする【サンプルコードあり】

Python
ゆうすけ
ゆうすけ

Pythonでスクレイピング(Web上の情報収集)をしたいです。

資格マフィア
資格マフィア

Pythonにはスクレイピングのための便利なライブラリがあるぞ。

 

✔️ 本記事のテーマ

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

 

✔️ 読者さんへの前置きメッセージ

本記事は「Pythonのスクレイピング【サンプルコード】」について書いています。

 

インターネットにはたくさんの情報が溢れています。

 

それらの情報を全てチェックするには大きな労力が必要になりますが、
Pythonでスクレイピングすることで情報収集を自動化することができます。

 

また、Pythonにはスクレイピングするためのライブラリも用意されています。

これらのライブラリを使うことで、強力なスクレイピングを手軽に実装することができます。

 

本記事ではスクレイピングの方法やライブラリの使い方をサンプルコードとともに解説しましょう。

 

Pythonのスクレイピングとは?

Pythonのスクレイピングとは?

スクレイピングとは「Web上のデータを収集、加工すること」です。

 

英単語の scrape(こすり落とす)に由来し、
Web上から必要なデータを取ることからスクレイピングと呼ばれます。

 

機械学習、マーケティング、サービス開発などスクレイピングは幅広い領域で活用されています。

 

現在、スクレイピングには2つの方法があります。

 

1つは「有料ツールを使用する方法」です。

 

既に提供されているツールを使うことで、
お金さえかければすぐにスクレイピングを行うことができます。
また、ツールの中にはかなり高機能なものもあるので、強力なスクレイピングもできます。

 

もう一つは「自分でプログラムを組む方法」です。

 

自分でスクレイピングのプログラムを作ることで、
自分のしたいことに合わせたスクレイピングが可能になります。

Pythonにはスクレイピングのためのライブラリもあるので、
自分でプログラムを組むのもそれほど難しいことではありません。

 

次から、実際にどのようにしてスクレイピングのプログラムを作るかについて解説していきましょう。

 

Pythonでスクレイピングする【サンプルコード】

Pythonでスクレイピングする【サンプルコード】

Pythonでスクレイピングするためのサンプルコードは以下の通りです。

import requests

from bs4 import BeautifulSoup


TARGET_URL = "" # スクレイピングしたいURLをここに書く

html = requests.get(TARGET_URL)  # HTMLを取ってくる
soup = BeautifulSoup(html.content, "html.parser")  # HTMLを解析する
title = soup.find("title")  # データを抽出する

 

たったこれだけのコードでスクレイピングができます。

 

BeautifulSoup というスクレイピング用ライブラリを使っているのですが、
このライブラリはお手軽かつ強力です。

 

この BeautifulSoup ライブラリの使い方や実際のスクレイピング手法を
サンプルコードとともに解説していきましょう。

 

スクレイピングのためのPythonライブラリ:BeautifulSoup

スクレイピングのためのPythonライブラリ:BeautifulSoup

BeautifulSoup とは、お手軽なスクレイピングを可能にするPythonライブラリです。

 

BeautifulSoup を使うことで、
HTMLの中から「タグ」「html class」などの条件で指定して情報を抜き出すことができます。

 

試しに、「資格マフィア」のURLを対象にして、スクレイピングをしてみましょう。

タグで指定してデータを抽出する

BeautifulSoup では、タグで指定してデータを抽出することができます。

import requests

from bs4 import BeautifulSoup


TARGET_URL = "https://shikaku-mafia.com/"

html = requests.get(TARGET_URL)
soup = BeautifulSoup(html.content, "html.parser")
title = soup.find("title")

print(title)
# <title>資格マフィア</title>

このように、 find() の引数に “title” を指定することで、
titleタグに紐づく情報を抽出することができます。

 

ちなみに、タグごとではなく、
文字列だけを取りたい場合は .text プロパティを指定することで
対象の文字列だけを抽出することができます。

title = soup.find("title").text

print(title)
# 資格マフィア

class で指定してデータを抽出する

また、html class でデータを絞ることもできます。


例えば、このサイトのトップページにおいて、
記事部分は entry-card-wrap という html class が付けられているので、
以下のように _class で指定して find() することで記事を含むタグを抽出できます。

article = soup.find(class_="entry-card-wrap")

print(article)
# <a class="entry-card-wrap a-wrap border-element cf" href="https://shikaku-mafia.com/opencv-arrowedline/" title="【OpenCV】cv2.arrowedLine関数の使い方【矢印を描画する】"><article class="post-3278 entry-car ...

 

タグ全体の情報は不要なので、記事タイトルの「【OpenCV】cv2.arrowedLine関数の使い方【矢印を描画する】」の部分だけ抽出したい場合は、
ここにさらに get() を重ねて、 “title” を指定します。

article = soup.find(class_="entry-card-wrap").get("title")
# 【OpenCV】cv2.arrowedLine関数の使い方【矢印を描画する】

 

このように html class で指定することで、
より詳細な条件でデータを抽出することができます。

 

対象のデータを全て抽出する

ここまで「タグ」「html class」で情報を抽出する方法について解説しました。

 

しかし、ここまでの方法だと、
トップページの最初の記事(=最新記事しか取得すること)することができません。

 

それは soup.find() が条件にマッチする結果を一つだけを返す仕様になっているからです。

 

ただし、条件にマッチする全ての結果を取得したい場合もあるでしょう。
例えば「トップページに表示にされている記事タイトルを全て取得したい」などのケースです。

 

そのような時には、 soup.find() の代わりに soup.find_all() を使います。

 

soup.find_all() の使い方は基本的には soup.find() と同じです。
戻り値が list に変わるだけです。

articles = soup.find_all(class_="entry-card-wrap")

for article in articles:
    print(article.get("title"))

# OpenCV】cv2.arrowedLine関数の使い方【矢印を描画する】
# 【OpenCV】cv2.HoughCircles()の使い方【円を検出する】
# 【AWS SSM】get_parametersの仕様【パラメータストアから値を取得する】
# 【OpenCV】cv2.line関数の使い方【線分を描画する】
# 【OpenCV】cv2.HoughLinesP()の使い方【直線を検出する】
# 【AWS】パラメータストアを使うメリット
# 【AWS】パラメータストアの値をLambdaから取得する
# 【OpenCV】cv2.putText関数の使い方【文字を描画する】
# 【python】listの順番を変える様々な方法
# 【OpenCV】cv2.circle関数の使い方【円を描画する】

 

このように soup.find_all() を使い、その結果でループを回すことで、
トップページ の全ての記事タイトルを取得することができます。

 

さらにスクレイピングを応用して実践的なことをする

さらに応用して実践的なことをする

次は BeautifulSoup を使って、より実践的なことをやってみましょう。

 

例えば「このサイトのトップページから最新記事を取得して、記事が更新されているかどうかを判定する」プログラムを作ってみます。

import requests
import pickle

from bs4 import BeautifulSoup
import slackweb


TARGET_URL = 'https://shikaku-mafia.com/'


# 以前の新着データを読み込む
with open('./before_article.pickle', 'rb') as f:
    before_new_article = pickle.load(f)

# Webページを取得する
html = requests.get(TARGET_URL)
soup = BeautifulSoup(html.content, "html.parser")

# 新着データを抽出する
new_article = str(soup.find(class_="entry-card-wrap").get("title"))
with open('./before_article.pickle', 'wb') as f:
    pickle.dump(before_article.pickle, f)

# 最新記事が更新されているかどうかチェック
if new_article != before_new_article:
    print('新着あり')

 

このようにすることで、対象のURLの更新の有無をチェックすることもできます。
さらに、これを cron などで定期実行しておけば、対象のURLを24時間監視することも可能です。
(ただし、定期実行による過剰なリクエストは損害賠償請求の対象となり得ます。実際に損害賠償を認めた判例もあるので、クローリング/スクレイピングは注意して行いましょう。)

 

注意点として、このプログラムを一番初めに実行するときだけ、

# 以前の新着データを読み込む
with open('./before_article.pickle', 'rb') as f:
    before_new_article = pickle.load(f)

の部分をコメントアウトして、pickleを作成してやる必要があります。
pickleがないと当然読み込むことができませんからね。

 

Pythonでのスクレイピングについて学ぶなら

もっとBeautifulSoupについてよく知るには

Pythonでスクレイピングを行う方法について解説しました。

 

スクレイピングはデータ分析などに欠かすことのできないスキルです
また、スクレイピングは、プログラミングでできることの幅を広げてくれます。

 

もし、スクレイピングについて独学でスキルをつけるなら、以下の書籍がオススメです。

 

この書籍はスクレイピングの基礎から応用までが丁寧に分かりやすく書かれています。

 

順序立てて、図解とともに書かれているので、
スクレイピングについて1から学ぶのに最適な良著です。

エンジニアとしての自身の価値をチェックする(完全無料)

エンジニアとして、

自分の価値がどれくらいのものかご存知でしょうか?

 

エンジニアとしてIT業界に身を置いていると

今の会社でずっと働くのか、フリーランスとして独立するのか …

と様々な選択肢があります。

 

どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも

自身の価値を知っておくことはとても重要です。

 

TechClips ME では、

職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。

▼▼▼▼▼

▲▲▲▲▲

しかもTechClips MEでは想定年収を企業から提示してくれるので、

自身の価値を数字で分かりやすくたしかめることができます。

 

登録はもちろん完全無料なので、一度登録してみると良いかもしれません。

 

コメント

タイトルとURLをコピーしました