1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flask+スクレイピングで記事一覧画面を作ろう①

Last updated at Posted at 2021-09-08

概要

・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

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?