【スクレイピング編】初心者でも簡単に自然言語処理でポジネガ判定
前書き
普段、研究にて画像認識関連は非常に活用しているのですが、自然言語処理に関してはイマイチ縁がありません。
Yahoo!Newsの記事をスクレイピングしよう!と思ったのですが、
あえてYahoo!Newsのコメント部分をスクレイピングしてネガポジ判定をします。
環境構築
スクレイピングにはseleniumとchrome-driverをインストールする必要があります。
おそらく普通にインストールすると、以下のようなエラーを吐いてきます。
Message: ‘chromedriver’ executable needs to be in PATH.
ですのでこちらの記事を参考にして、ColabでもChrome-driver & Seleniumが動作するように準備します。
!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)
スクレイピング
次にスクレイピングです。
完全にこちらの方の記事を参考にしました。
以下のコードはこちらの記事の方が書いたスクリプトです。
完全に参考にさせていただきました。(笑)
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})
こんな感じで取得できました。