This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

Webスクレイピングをしてみる

Posted at

この記事はSLP KBIT Advent Calendar 2023の14日目の記事です。

はじめに

こんにちは。kakkoです。
今回、私はWebスクレイピングを用いて、Webページから書籍の題名や作者の情報のみを抽出してみたいと思います。

Webスクレイピングとは

Webスクレイピングとは、Webページのデータを取得し、そこから特定の情報を抽出するコンピュータソフトウェア技術のことです。

Webスクレイピングを行うときの注意点

  1. スクレイピングして得た情報は著作物であること
  2. Webページの利用規約によって、スクレイピングが禁止されている場合があること
  3. スクレイピングでサーバにアクセスする際、サーバに負担をかけすぎないこと

事前準備

今回は、Pythonを使ってWebスクレイピングを行うことにしました。
そのため、まずは、事前準備として"【2023年版】Python+VSCode+Windows11の環境構築 | 使える.py"を参考にしてPythonの環境構築を行いました。

次に、「Requests」と「BeautifulSoup」というライブラリをインストールしました。

Requests: Webページの情報を取得する
BeautifulSoup: 取得したWebページを分析し、指定した部分の情報を抽出する
<イメージ図>
図.png

今回はこのような形でWebスクレイピングを行っていきます。

さて、Webスクレイピングに必要な準備ができたので実際にやってみます。

実践

今回は、私の好きな漫画である「僕のヒーローアカデミア」の題名と作者をWebスクレイピングしようと思います。

↓WebスクレイピングしたサイトのURL
『僕のヒーローアカデミア』|集英社『週刊少年ジャンプ』公式サイト

Webスクレイピングする

Webスクレイピングをするプログラムを書きます。

  1. PythonでWebスクレイピングをする方法を解説!【入門…|Udemy メディア
  2. BeautifulSoup入門:Webスクレイピングの基本をマスターしよう | 自作で機械学習モデル・AIの使い方を学ぶ

を参考にして次のようなプログラムを書きました。

import requests
from bs4 import BeautifulSoup

#Webページの情報を取得する
url ="https://www.shonenjump.com/j/rensai/myhero.html"

r = requests.get(url)

#Webページのコンテンツの内容を分析する
soup = BeautifulSoup(r.content, "html.parser")

#題名と作者を取得
book = soup.select("h1 span")
#表示
print(book)

結果

kekka1.png

このように、題名と作者の部分のみを抜き出すことができました。

ここで思ったのが、[< span >~< /span >] の中身だけ取り出したい!
ということで、次はWebスクレイピングしたデータのタグを取り除いてみたいと思います。

タグを取り除く

Webスクレイピングして、抽出した情報のタグを取り除いて、表示するプログラムを書いていきます。タグを取り除く関数のコード(remove_bracket())を書く際に、"Pythonテキスト処理!文章中からHTMLタグを取り除いてみた | WATLAB -Python, 信号処理, 画像処理, AI, 工学, Web-"での方法を使わせていただきました。
書いたプログラムは以下のようになります。

#<>の部分を取り除く関数
def remove_bracket(text):
    check = True
    word_s = '<'
    word_e = '>'

    #<>が無くなるまで繰り返す
    while check == True:

        #'<'が何番目にあるかを検索
        start = text.find(word_s)

        #word_s('<')がないとき:繰り返しを終了
        if start == -1:
            check = False

        #word_s('<')があるとき
        else:
            #'>'が何番目にあるかを検索
            end = text.find(word_e)

            #word_s('>')がないとき:繰り返しを終了
            if end == -1:
                check = False
            
            #word_s('<')とword_e('>')があるとき:<>で囲まれた部分を空白に置き換える
            else:
                remove_word = text[start:end + 1]
                text = text.replace(remove_word, '')
    
    return text

import requests
from bs4 import BeautifulSoup

#Webページの情報を取得する
url ="https://www.shonenjump.com/j/rensai/myhero.html"

r = requests.get(url)

#Webページのコンテンツの内容を分析する
soup = BeautifulSoup(r.content, "html.parser")

#題名と作者を取得
book = soup.select("h1 span")

#bookを文字列に変換
book_ = str(book)

#両端の[]を空白に置き換えて削除する
book_ = book_.replace('[', '')
book_ = book_.replace(']', '')

#<>を取り除く関数を呼び出す
book_ = remove_bracket(book_)

print(book_)

結果

kekka2.png

タグと両端の"[ ]"を取り除くことができました!

おわりに

最後までご清覧ありがとうございました。
Webスクレイピングも、Pythonも初めてだったので、難しかったです。うまくいかないことも多々ありましたが、結果的にやろうとしていたことができたので良かったと思います。

参考文献

  1. PythonでWebスクレイピングをする方法を解説!【入門…|Udemy メディア

コードを書くときに他に参考にしたもの

  1. CSSセレクタについて
    【初心者向け】CSSセレクタとは?セレクタの種類や指定方法を解説!(基礎編) : ビジネスとIT活用に役立つ情報(株式会社アーティス)
  2. replace()関数について
    Pythonで文字列の一部を削除(stripなど) | note.nkmk.me
  3. str()関数について
    【Python入門】文字列(String)について,Python3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up