catch-img

ヤフーニュースのコメントをスクレイピングで自動取得する方法

ヤフーニュースへの掲載方法については過去のブログでも記載しましたが、実際に自社関連のニュースが掲載された際、ユーザーコメントをしっかりと把握・分析できているでしょうか。

サイト内で公式口コミが発生するニュースキュレーションメディアは、現時点ではヤフーニュースとNewsPicksのみとなり、この2メディアで発生した口コミは貴重なマーケティングデータとなります。

広報担当者でも意外と着手できていないのが、こうしたUGC(User Generated Content)の取得・分析です。

特にヤフートップページに掲載される「ヤフートピックス」に掲載された場合、ニュース閲覧と共に大量のコメントが付くケースが多く、ニュース内容についての反応がリアルにつかめるので、こうしたデータをしっかりと取得してマーケティングに活かしていきましょう。
※朝日新聞デジタルなど、一部コメントが元々付けられないヤフーニュースもあります。

WEBサイトのデータを自動で取得する方法

数件のコメントであれば目視してコピペ保存も良いですが、数が多くなるととても面倒です。こうした時に役立つのが「スクレイピング」です。

スクレイピングとは、普段人間がアナログで行っているWEBサイトの閲覧行動を、プログラミングで自動化して行うことで、ニュースサイトの情報を集めたり、ビッグデータ解析の際の元データを収集したりするなど、非常に効率的に情報収集を行うことができます。

このスクレイピングをヤフーニュースにも適応することで、何千というコメントを自動で取得することができます。

スクレイピングを実施する方法

スクレイピングを実施する方法としては、主に2種類挙げられます。

①スクレイピングサービスを活用する

スクレイピングはマクロなどと同様、実行プログラムの作成が必要となりますが、import.ioなどのスクレイピングツールを使えば、プログラミングを書くことなく、WEBサイトの情報を取得することができます。

こうしたWEB上のサービスは設定さえしてしまえば、PCを閉じているときでもデータを取得できる一方、日本語に対応していないサービスも多く、有料サービスとなる場合が多いです。

※import.ioは最近価格変更があったようで、現在は1,000件までは無料で、それ以上のデータ取得に関しては個別見積もりとなるようです。

  Web Data Integration - Import.io - Data Extraction, Web Data, Web Harvesting, Data Preparation, Data Integration Web Data Integration - Import.io - Data Extraction, Web Data, Web Harvesting, Data Preparation, Data Integration Import.io


②プログラムを組んで実装する

最も基本となるのがプログラミングを組んで実施する方法です。近年では無料で使える様々なライブラリが登場し、短いコードを書くだけで簡単にスクレイピングができるようになりました。

特にPythonなどのプログラミング言語は、分かりやすい短いコードで習得もしやすく、機械学習などの便利なライブラリも非常に多いので、これからのマーケターの必須ツールとも言われています。

Python × Seleniumでヤフーニュースコメントを抽出

ここからはプログラミングで実際のヤフーニュースのコメントを元データとして、Pythonを使ったスクレイピングを行っていきたいと思います。

  ゴーン被告弁護団が辞任検討 「来週にも連絡取りたい」 レバノン逃走(時事通信) - Yahoo!ニュース 日産自動車の前会長カルロス・ゴーン被告(65)がレバノンに逃走した事件で、弁護人の弘中惇一郎弁護士は4日、取材に応じ、弁護団が辞任を検討していることを明らかにした。 来週、被告との接触を図り、被告の - Yahoo!ニュース(時事通信) Yahoo!ニュース

上記のゴーン被告についてのヤフーニュースには現在5,000件以上のコメントが付いています。このニュースを元に、スクレイピングツールの一つであるSeleniumを活用して、コメントを自動で取得する方法を解説してみたいと思います。

Pythonを走らせる環境構築としては、最近ではGoogleコラボラトリーが一番簡素だと言われていますが、今回はJupyter Notebook 上での環境を想定しています。

※事前にSeleniumとChromeDriverのインストールが必要となりますがここでは省略します

まずはPythonを起動させ、ライブラリのSeleniumをインポートし、Chromeを指定ブラウザに設定します。

from selenium import webdriver
driver = webdriver.Chrome()

そして情報を格納する6個の空リストを作り、そちらに取得した情報を追加していきます。

(注)ヤフーニュースのURLは頻繁に変更されるようなので、最新のclass指定を確認して実行してください。

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

start = 1
end = 500

for page in range(start, end):
    url = "https://headlines.yahoo.co.jp/cm/main?d=20200104-00000060-jij-soci&s=lost_points&o=desc&t=t&p={}".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)

ヤフーニュースは10件のコメントごとに末尾のURLの数字が1ずつ変化します。まずはターゲット記事の「全てのコメントを読む」をクリックし、2ページ目以降のページナンバーをクリックして、末尾の数字だけが変わる基本URLを取得しましょう。

上記記事でいうと、
https://headlines.yahoo.co.jp/cm/main?d=20200104-00000060-jij-soci&s=lost_points&o=desc&t=t&p= 
が基本URLとなります。

最終ページ数は目視で確認する必要があり、開始ページと終了ページを手動で設定します。ここでは開始ページとして1をstartに、終了ページとして500(リスト形式なので実際は499となる)をendに代入しています。

このプログラムでは、for文でformat関数でURLの末尾を1~500まで代入し、さらにrootタグで囲まれたクラスをそれぞれのページで10ユーザーごとに繰り返し取得する内容となっています。

ヤフーニュースのコメント欄をスクレイピングする際の注意事項

コメント欄にはiframeというフレームが使われているので、通常のスクレイピングコードとは多少異なります。iframe内を取得するために下記2行を追加しています。

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

またhtmlのクラス名などは環境によって異なるようなので、Seleniumで開いたブラウザーから確認するとよいかと思います。

※ヤフーオーサーがコメントしている際は、取得するクラスが若干変わりますのでご注意ください(good/badボタンが無くなり、参考になったボタンに変更される)。

取得されたデータを確認

取得したデータはPython上でひと目で把握することができるほか、csv等で出力も可能です。下記は実際に取得したデータです。上記のコードでgood数やbad数なども取得することができ、5,000件以上のデータであっても、サクサク簡単に確認することができます。

※実際にスクレイピングにかかった時間は5,000件のデータで1時間ほどでした。

ヤフーニュースコメント

取得したデータはPython上で様々な視点から分析できるほか、下記のように形容詞を抽出してワードクラウドにかければ、コメント傾向をビジュアル的に掴むこともできます。


このニュースでは憤慨しているユーザーが多いことが分かります。ちなみにヤフーニュースは意外にも、40代・50代がボリュームゾーンになるため、コメントもそうした年齢傾向やバイアスがかかっている点に留意しておいたほうが良いかと思います。

ヤフー

以上、Pythonを使ったヤフーニュースコメントの取得方法でした。

Pythonなどのプログラミングを学習する際は、書籍よりも下記のUdemyなどの動画で学ぶのが最適かと思います。下記の講座を見れば上記コーディングは一通りできると思います。

広報やマーケティング担当はもちろんのこと、プログラミングは全てのビジネスパーソンの業務効率を大幅に改善します。令和時代はプログラミングを駆使して、効率的に情報分析・データ収集をしていきましょう。

スクレイピングや広報代行のご依頼は、問い合わせフォームよりお気軽にご依頼ください。

  PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】 Seleniumを用いて、自動ログイン、テキストの抽出、画像データの収集を行ってみよう。データの収集方法を学ぶことで、定期的なデータ収集を効率良く行うことができます。 Udemy
  Amazonの人工知能を使ってSNS等の口コミを感情分析する方法 | 広報・PR支援の株式会社ガーオン アマゾンの自然言語処理サービス Amazon Comprehendを使って口コミを分析してみます。 広報・PR支援の株式会社ガーオン


  1万件のヤフートピックスを分析して分かった傾向と対策(前編) 1万件のヤフートピックスのデータから、傾向と対策、サイトの仕組みなどに迫ってみたいと思います。 広報・PR支援の株式会社ガーオン


  ヤフーニュースに取り上げてもらう方法 月間50億PVと言われているヤフーニュース。そのヤフーニュースはどのように作られているのでしょうか。 広報・PR支援の株式会社ガーオン


関連記事

広報・PRやプレスリリースまわりでお困りのことはございませんか?
多数の企業サポートを行ってきた当社が解決いたします。
お気軽にお問合せください。