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.

python Yahooニュースの指定したワードのみをスクレイピング

Posted at

yahooニュースをいちいち確認するのが面倒と思ったので、Webスクレイピングを使ったプログラムを書いてみました。

今回は、コロナのニュースを表示させるものとなっています。


from bs4 import BeautifulSoup
import requests as req
import pandas as pd
import re

# 処理をクラスにまとめる   
class List:
    
    #コンストラクタにURL+ページの数を呼べるようにする
    def __init__(self, page):
        self.url = "https://news.yahoo.co.jp/topics/top-picks?page="+str(page)
    
    #以下処理メソッドをまとめる
    def yahoo_s(self):
        
        #ヤフーニュースの情報を取得する
        res = req.get(self.url)
        #print(res)
        
        #BeautifulSoupにヤフーニュースのページ内容を読み込ませる
        yahoo_html = BeautifulSoup(res.text,'html.parser')
        #ヤフーニュースのタイトルとURLの情報を取得する
        news_list = []
        url_list = []
        data_list = yahoo_html.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
    
        #ヤフーニューズのタイトルをリストに格納
        for yahoo_data in yahoo_html.select('.newsFeed_item_title'):
            news_list.append(yahoo_data.string)
        # print(news_list)
        return news_list


#二次元内包表記にてリストに格納
all_list = []
all_coronalist = []
for i in range(10):
    page = List(page=i+1)
    plist = page.yahoo_s()
    all_list.append(plist)
    
    #リスト内の,コロナに関係するワードのみを格納
    l_in = [s for s in plist if 'コロナ' in s or '感染' in s]

    all_coronalist.append(l_in)

#print(allcoronalist)

#二次元リストを一次元にして格納
all_corona_news = sum(all_coronalist, [])

#データフレーム
title_list_corona = pd.DataFrame({'Title':all_corona_news})

title_list_corona

取得したニュースをデータフレームに格納して、それをフォルダにCSVにして保存するプログラムです。
今回は、合計11件のニュースになっていますが上限は決めておらず、「#二次元内包表記にてリストに格納」のforループした範囲のすべてを取得するものになっています。

↓が今回のデータフレームです。
data_ff.jpg

##LINEに取得したタイトルを送る

#取得したトークン
Token = 'afUaL44902wfil2Xshx4bd53sYpb47CSygCAuISpjc4'
#APIのURL
api_url ='https://notify-api.line.me/api/notify'
#通知内容
send_title = all_corona_news


#情報を辞書型にする
Token_dic = {'Authorization':'Bearer' + ' ' + Token}
send_dic = {'message': send_title}
print(Token_dic)
print(send_dic)

#LINE通知を送る(200: 成功時、400: リクエストが不正、401: アクセストークンが無効: 公式より)
#()内は、アクセスするWEB APIのURL、認証情報、送りたい内容
req.post(api_url, headers=Token_dic, data=send_dic)

こちらとWindowsのタスクスケジューラを使い決まった時間に、LINEでニュースをチェックできるようにしました。

###工夫した点

  • ニュースの中から特定のワードのみを取得するプログラムが書けたこと。
  • 他のワードにも対応できる書き方が出来たところ。

###妥協点

  • 本当はURLも一緒に取得したかったのですが、指定したタイトルのURLのみを取得することが出来なかった点。
  • 思っていたよりコードが長くなってしまった点。
  • LINEに送るとき、データフレームの綺麗な状態で送りたかったが、それが出来なかったので、一次元リストにして送ることにしたので、文字列が綺麗に送れなかった点。

###次回実装したい点
- もっと見やすく
- URL追加
- データフレームの画像化

もし、何か改善点があればコメントにてご教授していただけると幸いです。

###参考
スクレイピング - https://www.youtube.com/watch?v=LgZ8Li97yoM&list=PLavQwENTsEBWylZ9HrWXejSYs4eTjvVm7&index=11

1
2
2

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?