Originality is all I want.

とある大学院生の雑多なブログ

【TED トークの推薦システム 】トピックのクローリング

f:id:sm_8612:20201024183634j:plain
トピックのクローリング

今回は、TED トークのトピックをクローリングしていきます。

実際にクローリングする HTML 構造の中で、着目するべき HTML タグを画像を出しながら説明します。

まずはソースコードをご覧ください。

import requests
from bs4 import BeautifulSoup
from itertools import chain


if __name__ == "__main__":
    # クローリング先の URL
    url = 'https://www.ted.com/topics'

    # クローリングしたトピックを保存するリスト
    all_topics = []

    # HTML 解析オブジェクト soup
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')

    # (1) ol タグを取得
    ol_tag = soup.find('ol', class_='sl')

    # (2) li タグを取得
    # (li タグのそれぞれの要素が各アルファベットから始まるトピックの一覧になっている)
    li_tags = ol_tag.find_all('li', class_='b-t:scanline', recursive=False)

    for li_tag in li_tags:
        # (3) 各トピックは span タグ内にあるため、span タグ指定で OK
        span_tags = li_tag.find_all('span')

        # .text によってタグからテキスト (=トピック) を取得可能
        # .strip() で前後の余分な空白を削除
        topics = [tag.text.strip() for tag in span_tags]

        all_topics.append(topics)
    
    # リストを平坦化
    all_topics = list(chain.from_iterable(all_topics))

    # ファイルに保存
    with open('ted_topics.txt', 'w') as f:
        # リストの要素を改行文字で連結させて 1 つの文字列として保存
        f.write('\n'.join(all_topics))

クローリングするときは、まずはクローリングしたいサイトの HTML の構造を確認します。

ソースコード内の (1), (2), (3) が重要なポイントになっています。

f:id:sm_8612:20201024215728p:plain
(1) ol タグ

f:id:sm_8612:20201024215720p:plain
(2) li タグ

f:id:sm_8612:20201024215712p:plain
(3) span タグ

それぞれのタグが、トピック全体のリスト、各アルファベットから始まるトピックのリスト、各トピックの名称になっているのが分かるかと思います。

今回の TED トークのトピックのクローリングはとてもシンプルだったので、初めてクローリングをする人にとっては良い練習になるのではないでしょうか。

次は、各トピックのスピーチの URL 一覧を取得するためにクローリングをしていきたいと思います。