【スクレイピング編】初心者でも簡単に自然言語処理でポジネガ判定

前書き

普段、研究にて画像認識関連は非常に活用しているのですが、自然言語処理に関してはイマイチ縁がありません。
Yahoo!Newsの記事をスクレイピングしよう!と思ったのですが、
あえてYahoo!Newsのコメント部分をスクレイピングしてネガポジ判定をします。

開発環境

初心者で全く自然言語処理に触れたことがない!という方でも、
環境構築一切なしで実装できるように、Google Colabを使ってやってみます。

環境構築

スクレイピングにはseleniumchrome-driverをインストールする必要があります。
おそらく普通にインストールすると、以下のようなエラーを吐いてきます。

Message: ‘chromedriver’ executable needs to be in PATH. 

ですのでこちらの記事を参考にして、ColabでもChrome-driver & Seleniumが動作するように準備します。

enjoy-a-lot.com

!pip install selenium
!pip freeze
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome('chromedriver',options=options)

スクレイピング

次にスクレイピングです。
完全にこちらの方の記事を参考にしました。
以下のコードはこちらの記事の方が書いたスクリプトです。
完全に参考にさせていただきました。(笑)


gaaaon.jp

comment_boxes  = []
comments = []
names = []
dates = []
agrees = []
disagrees = []

start = 1
end = 2

for page in range(start, end):
    print(page)

    url = "https://news.yahoo.co.jp/articles/976611799514cd59ec8c5d7d97da0cd4b829bd57/comments?page={}&t=t&order=recommended".format(page)
    driver.get(url)

    iframe = driver.find_element_by_class_name("news-comment-plguin-iframe")
    driver.switch_to.frame(iframe)

    comment_boxes = driver.find_elements_by_class_name("root")
    
    for comment_box in comment_boxes:
        #コメント取得
        elem_comment = comment_box.find_element_by_class_name("cmtBody")
        comment = elem_comment.text.strip()
        comments.append(comment)
        
        #ユーザー名取得
        elem_name = comment_box.find_element_by_class_name("rapid-noclick-resp")
        name = elem_name.text
        names.append(name)
                
        #日付取得
        elem_date = comment_box.find_element_by_class_name("date")
        date = elem_date.text
        dates.append(date) 
        
        #good数取得
        agree_box = comment_box.find_element_by_class_name("good")
        elem_agree = agree_box.find_element_by_class_name("userNum")
        agree = elem_agree.text
        agrees.append(agree)

        #bad数取得
        disagree_box = comment_box.find_element_by_class_name("bad")
        elem_disagree = disagree_box.find_element_by_class_name("userNum")
        disagree = elem_disagree.text
        disagrees.append(disagree)

唯一変更した点はページ数とURLの中身です。
ページ数は一旦、手動で設定します。

スクレイピングしたい記事のコメント欄を開く→コメント欄の2ページ目へ→URLを取得。
page=2のところを可変取得できるように、以下のように設定します。

https://news.yahoo.co.jp/articles/976611799514cd59ec8c5d7d97da0cd4b829bd57/comments?page=2&t=t&order=recommended
⬇︎
"https://news.yahoo.co.jp/articles/976611799514cd59ec8c5d7d97da0cd4b829bd57/comments?page={}&t=t&order=recommended".format(page)

この記事のコメント欄は2ページ目まで「end=2」と設定します。
本当は記事のコメント欄のページ数を取得して、自動で設定する必要がありますね。
ここは今度実装して、更新しようと思います。

import pandas as pd
df = pd.DataFrame({'comment' : comments, 'name': names, 'date': dates, 'agree': agrees, 'disagree' : disagrees})

こんな感じで取得できました。

f:id:electric-city:20201217184145p:plain
取得コメント