今回は、保険といったらなんですがどちらかがうまくいかなかった場合に備え、二手に分かれて平行で作業を行いましたので此方の方で作業をしたものを記しておきます。(もう片方の作業はぜひ2班の他の方のサイトをご覧ください!)
・youtubeの広告スキップを自動化できないか(ソースコードはできたものの導入しなければならないツールが怪しいものでインストールしない方がよいと判断した為断念)
・ファイル内の画像を全て同一の拡張子に変換を自動化できないか
・ショートカットキーをより使いやすいものにできないか
・トレンドワードなど話題になっているニュースを収集し、調べやすくすることはできないか(これについて記載)
取り組んだのはwebスクレイピングと呼ばれるものです。
スクレイピングとは簡単に表現するとインターネット上の情報をソースコードを実行することで勝手に集めてきてくれるといったところでしょうか。
今回はYaHooニュースをスクレイピングするソースコードの作業をしました。
スクレイピングとは↓(外部サイト)
スクレイピングとは?活用方法や注意点、確認すべきことを徹底解説!|ITトレンド
import requests
from bs4 import BeautifulSoup
# ライブラリ requests と BeautifulSoup4 をインポート
import re
import pandas as pd
import unicodedata
import math
import string
# 記号文字は分析をするにあたって邪魔になるため、記号を取り除く関数を定義します。
# 下のYahooNews関数で使用します。
def symbol_removal(soup):
soup = unicodedata.normalize("NFKC", soup)
exclusion = "「」『』【】《》≪≫、。・◇◆" + "\\n" + "\\r" + "\\u3000" # 除去する記号文字を指定
soup = soup.translate(str.maketrans("", "", string.punctuation + exclusion))
return soup
# Yahooニュースをスクレイピングする関数です。
# 引数で指定した数の記事をとってきてデータフレームを返します。
def YahooNews(n=30):
url = "<https://news.yahoo.co.jp/topics/top-picks>"
URL = "<https://news.yahoo.co.jp/>"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
all_page_links = []
all_page_links.append(url)
all_links = []
i = 0
while True:
try:
next = soup.find("li", class_="pagination_item-next").find("a")["href"]
next_link = URL + next
all_page_links.append(next_link)
next_res = requests.get(next_link)
soup = BeautifulSoup(next_res.text, "html.parser")
i += 1
print(i)
except:
break
title_list = []
category_list = []
text_list = []
for url in all_page_links: # all_page_links: 全てのニュースのリスト
res = requests.get(url) # url: ⅹ個分のニュースのリスト
soup = BeautifulSoup(res.text, "html.parser")
page_soup = soup.find_all("a", class_="newsFeed_item_link")
for href in page_soup:
link = href["href"] # link: 一つのニュースのリンク(本文は一部のみ)
all_links.append(link)
if len(all_links) <= n:
n = len(all_links)
i = 0
for link in all_links:
link_res = requests.get(link)
href_soup = BeautifulSoup(link_res.text, "html.parser")
try:
title = href_soup.find("h1", class_=re.compile("^sc")).string
except:
continue
# title_link = href_soup.find("a", class_="sc-eAyhxF")["href"] # title_link: 本文
title_link = href_soup.find("a", class_="sc-jZIEzD dDYrOe")["href"] # title_link: 本文
res = requests.get(title_link)
soup = BeautifulSoup(res.text, "html.parser")
category = soup.find_all("li", class_="current")
# category = category[1].string
for tag in soup.find_all(["a"]):
tag.decompose()
try:
soup = soup.find("div", class_="article_body").get_text()
soup = symbol_removal(soup)
text_list.append(soup)
title_list.append(title)
category_list.append(category)
i += 1 # 本文が正常に保存できたことをトリガーにしてカウントを一つ増やすことにします。
# 進捗バーを表示させます。
pro_bar = ('=' * math.ceil(i / (n / 20))) + (' ' * int((n / (n / 20)) - math.ceil(i / (n / 20))))
print('\\r[{0}] {1}記事'.format(pro_bar, i), end='')
if i >= n:
df = pd.DataFrame({'title': title_list, 'category': category_list, 'text': text_list})
return df
except:
continue
df = pd.DataFrame({'title': title_list, 'category': category_list, 'text': text_list})
return df
# (ⅹ)内の件数が保存する記事数
# 実行すると./YahooNews.csvがpython project内に保存される。
df = YahooNews(15)
df.to_csv('./YahooNews.csv', index=False, encoding='utf-8-sig')
このコードを実行するとこのようなcsvファイルが保存されます。(Excelで開くことができます。)
(↑上記のcsvファイルのリンクです。)