webスクレイピングで英単語の和訳を取得する

webスクレイピング

webサイトのソースをインターネット経由で引っ張ってきて、HTML構造を分析し、目的の要素を取得すること。

今回は、ejje.weblio.jpからスクレイピングさせていただきます。

準備

言語:Python3
ライブラリ:Beautiful Soup 4 (bs4)

bs4のインストール
pip install beautifulsoup4

動作

とりあえず、動きを見てみます。

import requests
from bs4 import BeautifulSoup

print("\"0\" If you enter the end.")

while True:
    # 入力
    spell = input("spell: ")

    if spell == "0":
        break

    # アクセス先URL
    url = "https://ejje.weblio.jp/content/" + spell

    # データ取得&エンコード設定
    source = requests.get(url)
    source.encoding = source.apparent_encoding

    # ビューティフルスープで抽出
    data = BeautifulSoup(source.text, "html.parser")
    explanation_list = data.select("td.content-explanation")

    # 表示
    for idx, txt in enumerate(explanation_list):
        print("(success) " + explanation_list[idx].text)

    if len(explanation_list) == 0:
        print("(error) explanation is not found")

シンプルなCUI操作で試せます。英単語を入れれば和訳が返ってきます。

実装方法

ejje.weblio.jpではhttps://ejje.weblio.jp/content/[英単語]で解説ページにアクセスできます。

「主な意味」の内容を取得したいです。

ソースをのぞいて、目的の個所を探します。

目的のクラスを探します。一応重複チェックしておきます。他の箇所でも使われているクラスであれば、正しく抽出できません。

URLを組み立てます。

# アクセス先URL
url = "https://ejje.weblio.jp/content/" + spell

URL先にアクセスし、ソースを取得します。

# データ取得&エンコード設定
source = requests.get(url)
source.encoding = source.apparent_encoding

BeautifulSoup形式に変換し、tdタグのclass=content-explanationの中身を取得します。形式はスカラー配列です。

# ビューティフルスープで抽出
data = BeautifulSoup(source.text, "html.parser")
explanation_list = data.select("td.content-explanation")

textメソッドでHTMLタグを除去し、そのまま出力。

# 表示
for idx, txt in enumerate(explanation_list):
	print("(success) " + explanation_list[idx].text)

注意

スクレイピングを行う際は、以下のことを注意しなければいけません(抜粋)

  1. 取得した情報には著作権がある
  2. サーバー負荷を考え、連続したスクレイピングの場合はスリープ関数などでクールタイムを設ける (最低でも1秒以上)
  3. 500番台のステータスが出たらスクレイピングを中止するなどの措置
  4. など

(参考) Python による Web スクレイピング:
https://creasys.org/rambo/articles/84fc91dd1071f59e83e3

The present writer kazz.

関連記事

+‪ラズパイと温度センサ(LM75B)で室温の推移をグラフ化する‬
+LINEBOTで画像文字起こしと有害検出
+socket.ioで簡易チャットアプリ作った
+Markdownで講義ノートを書くためのノート
+「これ1冊でできる!ラズベリーパイ超入門」を読んで