概要
・Yahoo!ニュースの記事一覧からトピックス一覧を取得 ・取得したものを、FlaskでWebアプリ化スクレイピングをしてデータを取得しよう
Flaskでアプリを構築する前に、取得したいデータをスクレイピングで取ってきます( jupyterなどで実行すると良い!) 必要なライブラリをインポートしますimport requests
from bs4 import BeautifulSoup
requests: URLにアクセスします
BeautifulSoup: ページのhtmlタグから情報を取得します
では早速情報を取ってきましょう。今回はトピック一覧-Yahoo!ニュースから情報を取得します。
欲しいデータは、
1. 国内、国際、経済、エンタメ、スポーツ、ITなどのカテゴリ
2. カテゴリごとのURL
3. カテゴリごとのトップ8個の記事
4. 3のURL
まず、requestsとBeautifulSoupの準備を行いましょう。
# urlは今回ターゲットとなるURL
url = 'https://news.yahoo.co.jp/topics'
# requests.getでurlにアクセス
r = requests.get(url)
# htmlからのデータ取得を可能にする
soup = BeautifulSoup(r.text, 'html.parser')
これで準備が完了したので、カテゴリ名とURLを取っていきます。
# pタグで、クラス名が"sc-hqyNC iOQlXg"となっている部分にカテゴリの情報が存在する
categories = soup.find_all('p', class_='sc-hqyNC iOQlXg')
# カテゴリ名を格納するリスト
category_names = []
for category in categories:
print(category.get_text())
# category_namesに、カテゴリ名を追加(append)する
category_names.append(category.get_text()) # get_text()とすることで、htmlタグの表示を削除できます
同じ容量でカテゴリに対応するURLも取得していきます。
# カテゴリのURLを格納するリスト
category_links = []
for category in categories:
# aタグからは/categories/{カテゴリ名}しか入手できないため、
# 'https://news.yahoo.co.jp'と結合することで、URLを作成する
category_link = 'https://news.yahoo.co.jp' + category.find('a').get('href')
category_links.append(category_link)
続いて、記事を取得します。トピック一覧-Yahoo!ニュースを見て貰えば分かりますが、本来ならカテゴリごとに8件づつ記事が表示されています。
しかし、取得する際にはカテゴリ関係なく記事を取得してしまいます。
これに関しては、アプリを構築する際に解決するので、とりあえずデータを全部取ってきましょう。
# liタグで、クラス名が"sc-ksYbfQ gSBRIC"となっている部分に記事情報が存在する
li_lists = soup.find_all('li', class_="sc-ksYbfQ gSBRIC")
# 記事の名前を格納するリスト
article_names = []
for li_list in li_lists:
article_name = li_list.find('a').get_text()
article_names.append(article_name)
同じ容量で記事に対応するURLも取得していきます。
# 記事のURLを格納するリスト
article_links = []
for li_list in li_lists:
article_link = li_list.find('a').get('href')
article_links.append(article_link)
以上で必要な情報は全て取得できました!
では実際にこれまでのデータを整理して表示してみましょう。
少し複雑なコードですが、表示させたいだけなので説明は省きます。
# カテゴリごとの記事を8件ずつ表示するため、startとendで範囲を指定する
start = 0
end = 8
for (category_list, category_link) in zip(category_names, category_links):
print(category_list, f'({category_link})\n')
for index in range(start, end):
print(' ', article_names[index], f'({article_links[index]})\n')
# startとendの更新
start += 8
end += 8
print('\n')
以上で下準備は完了しました!
コードは、説明のためにfor文を分けましたが、適宜対応してください。
次回からFlaskで実装をしていきます。
ありがとうございました🙇♂️
Flask+スクレイピングで記事一覧画面を作ろう② - Qiita