【WordCloud入門】スクレイピングと組み合わせて遊んでみる♬

WordCloud、文章の見出しにどうよということで、記事をスクレイピングしてその文章で作成してみた。
スクレイピングってちょっとやってみるのは簡単なのだが、どうしてもhtmlの解析したりして面倒だったが、記事を取得する分には簡単に出来るようになったので、記事にしておこうと思う。
【参考】
①[pythonで「Yahoo! News」の主要ニュースタイトルをスクレイピングしてみた](https://qiita.com/cutenkey/items/d33d1212a8048eb1483b)
②[Python3で日本経済新聞のタイトルを取得する](https://crieit.net/posts/Python3)
###やったこと
・簡単なスクレイピング
・YahooのNews見出しを取得する
・日経記事をWCしてみる
###・簡単なスクレイピング
参考①はやりたいことは応用できそうというもので、まんまは動きませんでしたが、参考②はまんま動きかつわかりやすいのでこちらから入ります。
ということで、参考②を見てから、参考①を参考にすると以下のコードがかけます。

```py
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
import urllib3
import re

url = "http://www.nikkei.com/"
"""
# requestsを使うならこっち
r = requests.get(url)
print(r.headers)
print("--------")
print(r.encoding)
print(r.content)
print(r.text)
soup = BeautifulSoup(r.text, 'html.parser')
#print(soup)
"""

# urllib3を使うならこっち
http = urllib3.PoolManager()
r = http.request('GET', url)

soup = BeautifulSoup(r.data, 'html.parser')
#print(soup)
# タイトル要素を取得する → <title>経済、株価、ビジネス、政治のニュース:日経電子版</title>
title_tag = soup.title
# 要素の文字列を取得する → 経済、株価、ビジネス、政治のニュース:日経電子版
title = title_tag.string
# タイトル要素を出力
print(title_tag)
# タイトルを文字列を出力
print(title)
```
requestsでも同じ結果になる。
BeautifulSoupの引数がrが異なるので、少し異なる。
結果は

``` http://www.nikkei.com/
<title>日本経済新聞</title>
日本経済新聞
```
日経の記事のページを取得すると以下となる

```https://www.nikkei.com/article/DGXMZO56522090X00C20A3000000/
<title>新型コロナ感染10万人超　3カ月で世界的流行に　（写真=ロイター）　:日本経済新聞</title>
新型コロナ感染10万人超　3カ月で世界的流行に　（写真=ロイター）　:日本経済新聞
```
###・YahooのNews見出しを取得する
```py
# -*- coding: utf-8 -*-

url = "https://news.yahoo.co.jp"
# urllib3を使うならこっち
http = urllib3.PoolManager()
r = http.request('GET', url)

soup = BeautifulSoup(r.data, 'html.parser')
# タイトル要素を取得する 
title_tag = soup.title
# 要素の文字列を取得する
title = title_tag.string
# タイトル要素を出力
print(title_tag)
# タイトルを文字列を出力
print(title)

# 以下追記
for title in soup.select("p"):
    print(title.getText())
```
以下のとおり、それらしい結果が得られた。ただし、トップページを見ているつもりだが、実際に並んでいるものとは少し違うのでよくわからない。

```https://news.yahoo.co.jp　結果.
<title>Yahoo!ニュース</title>
Yahoo!ニュース
キーワード：
検索
IDでもっと便利に新規取得
ログイン
現在JavaScriptが無効になっています。Yahoo!ニュースのすべての機能を利用するためには、JavaScriptの設定を有効にしてください。JavaScriptの設定を変更する方法はこちら。
もっと見る
全カテゴリのトピックス一覧
無観客競馬 1番人気馬に有利?
なぜ？アマゾンに自分の住所…出品業者の所在地として掲載　「心配でたまらない」女性に不信感
「船から飛び降りたい」　個室待機で訴え相次ぐ　新型コロナ
駆け込み帰国、送別会は中止「どうすればいいの」　中韓の在留邦人ら悲鳴
日本の入国制限に韓国激怒、矛盾だらけの“反日”対抗策
指に刺さったトゲは心臓まで行く？　自分で抜くなら5円玉で
Yahoo! JAPAN 特設ページ
新型コロナウイルス感染症まとめ
静岡県議、ネットにマスク大量出品　「転売品でなく、問題ない」と主張【新型コロナ】
群馬県で初の感染確認　新型コロナウイルス
広島で初の感染者　１か月前から“せき”
広島で初の感染者　１か月前から“せき”
新型コロナ、国内感染 ６日だけで５６人
「異物混入」と嘘　その時の店員が別の店で見つけ…
消えた元AKB48「渡辺麻友」　「UTAGE！」も欠席、彼女の身に何が起きているのか
新型コロナ感染の懸念　歯科医院の5割が危ない理由
コロナで我を失う愚か者たちのバカすぎる行動
ついに日本は終わった
なぜ「新幹線のトビラ」はこんなに狭いのか…？その納得の理由
```
ということで、日経の記事を出力してみよう
こちらは、なんとなく[このページの情報](https://www.nikkei.com/article/DGXMZO56522090X00C20A3000000/)を取得している。

```https://www.nikkei.com/article/DGXMZO56522090X00C20A3000000/
<title>新型コロナ感染10万人超　3カ月で世界的流行に　（写真=ロイター）　:日本経済新聞</title>
新型コロナ感染10万人超　3カ月で世界的流行に　（写真=ロイター）　:日本経済新聞
記事保存
有料会員の方のみご利用になれます。保存した記事はスマホやタブレットでもご覧いただけます。
＞ 新規会員登録
＞ ログイン
Evernote保存
ご利用には会員登録が必要です
＞ 新規会員登録
＞ ログイン
企業での記事共有や会議資料への転載・複製、注文印刷などをご希望の方は、リンク先をご覧ください。
詳しくはこちら

イランでも新型コロナウイルスの感染者が急増している（首都テヘラン）=ロイター
【ジュネーブ=細川倫太郎】世界の新型コロナウイルスの感染者数が10万人を超えた。2019年12月に中国湖北省武漢で初の患者が出てから約3カ月で他のアジアや欧米にも急速に広がった。現在も感染拡大が収束する見通しはたたず、渡航制限や大規模イベントの中止などが相次ぐ。ウイルスの脅威が暮らしや企業活動に大きな影を落としている。

感染者数は2002～03年に流行した重症急性呼吸器症候群（SARS）や、12年に発生した中東呼吸器症候群（MERS）を大きく上回り、世界的な流行となった。
米ジョンズ・ホプキンス大学の集計データによると、世界の感染者数は約10万2千人（日本時間7日午前6時時点）。このうち約8割は中国（本土）が占める。中国以外では韓国が最も多く、約6600人。次いでイラン（約4750人）、イタリア（約4640人）と続く。日本は400人を超えた。
最近は中国で新たな感染者数が減ってきた半面、それ以外の国・地域での感染が急増している。6日に記者会見した世界保健機関（WHO）のテドロス事務局長は世界的な広がりについて「深く憂慮している」と述べた。特に医療インフラが脆弱な途上国への感染拡大に強い懸念を表明した。「すべての国がウイルスの封じ込めを最優先事項にしてほしい」と訴え、医療態勢や水際対策の強化など一段の措置を講じるよう求めた。
各国ではワクチンや治療薬の研究が動き出している。WHOによると、現在は20のワクチンが開発中で、治療薬も多くの臨床研究が進行している。ただ、新型コロナは感染力など不明な点も多い。これから夏に向けて気温の上昇とともに感染が鈍化するとの声もある。ただ、WHOは「夏にウイルスがなくなるという証拠はなく、拡散能力を持ち続けると想定しておくべきだ」と警戒を緩めないように訴えた。
新型コロナの感染拡大を受け、各国では渡航制限や出張・旅行のキャンセルが広がっている。感染が急増するイタリア北部では自動車部品の工場が操業停止に追い込まれた。ヒトやモノの動きが急速に停滞しており、世界経済に深刻な打撃となると懸念する声は多い。国際通貨基金（IMF）は20年の世界経済の成長率予測について、金融危機直後の09年以来、11年ぶりの低成長になる可能性を示した。
WHOは1月30日に新型コロナについて「国際的に懸念される公衆衛生の緊急事態」と宣言した。約1カ月後の2月28日には、世界全体の危険度を4段階で最高レベルの「非常に高い」に引き上げた。
WHOによると、感染を防ぐには手洗いの徹底や、パソコンなどを消毒剤で定期的にふき掃除することが重要になる。一方で、症状がない人は予防目的でマスクを着用する必要はないとし、過度な使用を控えるよう求めている。

無料・有料プランを選択
会員の方はこちら
記事保存
有料会員の方のみご利用になれます。保存した記事はスマホやタブレットでもご覧いただけます。
＞ 新規会員登録
＞ ログイン
Evernote保存
ご利用には会員登録が必要です
＞ 新規会員登録
＞ ログイン
企業での記事共有や会議資料への転載・複製、注文印刷などをご希望の方は、リンク先をご覧ください。
詳しくはこちら
電子版トップ
プレスリリース
台風19号 救援募金受け付け
電子版は最初の1カ月が無料！詳細はこちら
天気
プレスリリース検索
アカウント一覧
訂正・おわび
```
###・日経記事をWCしてみる
ここまで来ると、あとは、WCのためのコードを追加するだけです。
[WordCloud/yahoo_title.py](https://github.com/MuAuan/WordCloud/blob/master/yahoo_title.py)


```py
#$ python3 yahoo_title.py -d /usr/lib/aarch64-linux-gnu/mecab/dic/mecab-ipadic-neologd conversation_anzen.csv -s stop_words.txt

import requests
from bs4 import BeautifulSoup
import urllib3
import re
import argparse
from MeCab import Tagger
from wordcloud import WordCloud
import matplotlib.pyplot as plt

parser = argparse.ArgumentParser(description="convert csv")
parser.add_argument("input", type=str, help="csv file")
parser.add_argument("--dictionary", "-d", type=str, help="mecab dictionary")
parser.add_argument("--stop_words", "-s", type=str, help="stop words list")
args = parser.parse_args()

t = Tagger(" -d " + args.dictionary)

#url = "https://news.yahoo.co.jp"
url = "https://www.nikkei.com/article/DGXMZO56522090X00C20A3000000/"

stop_words = []
if args.stop_words:
    for line in open(args.stop_words, "r", encoding="utf-8"):
        stop_words.append(line.strip())

# リストを文字列に変換する関数
def join_list_str(list):
    return ' '.join(list)

# ストップワード除外関数
def exclude_stopword(text):
    changed_text = [token for token in text.lower().split(" ") if token != "" if token not in stop_words]
    # 上記のままだとリスト形式になってしまうため、空白区切の文字列に変換
    changed_text = join_list_str(changed_text)
    return changed_text

# urllib3を使う
http = urllib3.PoolManager()
r = http.request('GET', url)
yahoo = BeautifulSoup(r.data, 'html.parser')

wc = WordCloud(font_path="/home/muauan/.fonts/NotoSansCJKjp-Regular.otf")
sk=0
for title in yahoo.select("p"):
    title = title.getText()
    title = re.sub(r"[^一-龥ぁ-んァ-ン0-9]", "", title)
    
    if len(title)>50:
        print("content{};{}".format(sk,title))
        splitted = " ".join([x.split("\t")[0] for x in t.parse(title).splitlines()[:-1] if x.split("\t")[1].split(",")[0] not in ["助詞", "助動詞", "副詞", "連体詞", "動詞"]])
        splitted = exclude_stopword(splitted)
        wc.generate(splitted)
        plt.axis("off")
        plt.title("content_{};".format(sk))
        plt.tight_layout()
        plt.imshow(wc)
        plt.pause(0.05)
        plt.savefig('./output_yahoo/yahoo{}_{}.png'.format(sk,title[0:10])) 
        plt.close()
        sk += 1
```
stopwordsとして、今回も前回のjapanese.txtを利用しています。

| 項番 |　文章 | WordCloud|
|:-:|:--|:-:|
|content0|ジュネブ細川倫太郎世界の新型コロナウイルスの感染者数が10万人を超えた2019年12月に中国湖北省武漢で初の患者が出てから約3カ月で他のアジアや欧米にも急速に広がった現在も感染拡大が収束する見通しはたたず渡航制限や大規模イベントの中止などが相次ぐウイルスの脅威が暮らしや企業活動に大きな影を落としている|![yahoo0_ジュネブ細川倫太郎世.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/7d15bb3e-1754-996c-c389-2d3da9a44585.png)|
|content1|感染者数は200203年に流行した重症急性呼吸器症候群や12年に発生した中東呼吸器症候群を大きく上回り世界的な流行となった|![yahoo1_感染者数は20020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/7dcbc636-2098-0bde-c424-b6deab38a397.png)|
|content2|米ジョンズホプキンス大学の集計デタによると世界の感染者数は約10万2千人日本時間7日午前6時時点このうち約8割は中国本土が占める中国以外では韓国が最も多く約6600人次いでイラン約4750人イタリア約4640人と続く日本は400人を超えた|![yahoo2_米ジョンズホプキンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/e7533132-ad3c-2293-0452-eca480e28b60.png)|
|content3|最近は中国で新たな感染者数が減ってきた半面それ以外の国地域での感染が急増している6日に記者会見した世界保健機関のテドロス事務局長は世界的な広がりについて深く憂慮していると述べた特に医療インフラが脆弱な途上国への感染拡大に強い懸念を表明したすべての国がウイルスの封じ込めを最優先事項にしてほしいと訴え医療態勢や水際対策の強化など一段の措置を講じるよう求めた|![yahoo3_最近は中国で新たな感.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/adca81c4-8eb7-e86d-6019-d4030c8b40f4.png)|
|content4|各国ではワクチンや治療薬の研究が動き出しているによると現在は20のワクチンが開発中で治療薬も多くの臨床研究が進行しているただ新型コロナは感染力など不明な点も多いこれから夏に向けて気温の上昇とともに感染が鈍化するとの声もあるただは夏にウイルスがなくなるという証拠はなく拡散能力を持ち続けると想定しておくべきだと警戒を緩めないように訴えた|![yahoo4_各国ではワクチンや治.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/d628f29d-8d58-4f8c-8500-eb20c9507b0b.png)|
|content5|新型コロナの感染拡大を受け各国では渡航制限や出張旅行のキャンセルが広がっている感染が急増するイタリア北部では自動車部品の工場が操業停止に追い込まれたヒトやモノの動きが急速に停滞しており世界経済に深刻な打撃となると懸念する声は多い国際通貨基金は20年の世界経済の成長率予測について金融危機直後の09年以来11年ぶりの低成長になる可能性を示した|![yahoo5_新型コロナの感染拡大.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/052b477f-da0a-266a-86dc-d48c8834b237.png)|
|content6|は1月30日に新型コロナについて国際的に懸念される公衆衛生の緊急事態と宣言した約1カ月後の2月28日には世界全体の危険度を4段階で最高レベルの非常に高いに引き上げた|![yahoo6_は1月30日に新型コ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/76a83cb6-7045-34eb-816b-b625de1b0864.png)|
|content7|によると感染を防ぐには手洗いの徹底やパソコンなどを消毒剤で定期的にふき掃除することが重要になる一方で症状がない人は予防目的でマスクを着用する必要はないとし過度な使用を控えるよう求めている|![yahoo7_によると感染を防ぐに.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/020e92eb-abe7-c50f-562c-e20b9ac8a2e3.png)|
すごく満足というほどではないが一応文章を代表する単語を示していると思う。
どこまで行けば満足かといえば、最初の文章はジュネーブとか人の名前より、イベント中止や感染拡大の収束が見えないなどをもっと大きく扱ってほしい。。。
###まとめ
・スクレイピングしてニュース記事をWordCloudしてみた
・ほぼリアルタイムで変換できることがわかった

・さらにアクティブな利用をしたいと思う
・スクレイピングの応用を広げる