catch-img

【広報担当者向け】複数のWEBニュースを自動キャプチャする方法【働き方改革】

広報活動の一貫として、WEBニュースなどに掲載された自社記事をキャプチャしてファイルで保存している方も多いと思います。

記事全体をキャプチャするには、PCのスクリーンショット機能を使う原始的な方法やブラウザーの拡張ツールを使う方法などが一般的ですが、サイトごとに手動で一つずつとっていくのは非常に手間です。

複数のスクリーンキャプチャを撮るには、Page2Imagesという海外ツールを使う方法もありますが、大量データの扱いは有料となるほか、サービス自体の動作が非常に不安定なため、ビジネスでは正直使えないのが実情です。

そんなときこそ、無料で使えるプログラミングツールPythonの出番です。

面倒な仕事は全てPythonに任せよう!

今回はPythonでWEBブラウザを自動的に動かし、ヤフーニュースやライブドアニュースなど複数のサイトから対象ニュースのページ全体のキャプチャを取ってきて、画像ファイルで保存する方法を解説します。

Pythonを走らせる環境はジュピターノートブックを使い、スクレイピングツールのSeleniumを活用します。PythonやSeleniumの使い方の説明は、下記本などに譲りここからは具体的なキャプチャ方法を解説します。

今回は例として、下記のWEBニュースサイト「マネーポストWEB」の「10年後にAIに仕事が奪われる? 様々な職業の人たちの本音は」という記事を例として進めていきます。

  10年後にAIに仕事が奪われる? 様々な職業の人たちの本音は | マネーポストWEB  AI(人工知能)技術の進化に伴い、私たちの未来はより便利なものになると予想されている。その一方で、従来の仕事の中にはAIに取って代わられて“なくなる仕事も多い”とまことしやかに言われているが、現在、働いている人は、どう思っているのだろうか... マネーポストWEB

このニュースは同一の内容が、アグリゲーションメディアであるヤフーニュースやgooニュースなどにも記事転載されています。これらを元サイトとともに、この3つのサイトを一発でキャプチャーする方法を解説していきたいと思います。

■ヤフーニュース
https://headlines.yahoo.co.jp/article?a=20200130-00000005-moneypost-bus_all

■gooニュース
https://news.goo.ne.jp/article/moneypost/life/moneypost-624986.html

使うコードはたったの10行

from selenium import webdriver

urls = ["https://www.moneypost.jp/624986",
        "https://headlines.yahoo.co.jp/article?a=20200130-00000005-moneypost-bus_all",
        "https://news.goo.ne.jp/article/moneypost/life/moneypost-624986.html"]

driver = webdriver.Chrome()

for url in urls:
    driver.get(url)

    page_width = driver.execute_script('return document.body.scrollWidth')
    page_height = driver.execute_script('return document.body.scrollHeight')
    driver.set_window_size(page_width, page_height)

    url_name = url.lstrip("https://" "http://" ).replace("/","_").replace("?", "_")
    driver.save_screenshot(r"C:\Users\●●\image_" + str(url_name) + ".png")

この10行ほどのコードだけで上記3サイトのキャプチャーを自動取得してPCに保存できます。それぞれ詳しく見ていきます。

サイトをキャプチャする方法

1.まずPythonを起動し、スクレイピングライブラリ Seleniumの機能を使うためインポートします。

from selenium import webdriver

2.キャプチャーしたいURLをPythonのリストに追加します

リストとはエクセルでいうところの1列ごとに配置したセルのようなもので、[ ]で囲んで表記します。キャプチャーしたいURLを文字列として" "で囲んで記述し、それぞれカンマで区切って入力していきます(カンマで改行すると見やすく整います)。

そしてURLを入れたリストを、ここでは「urls」という変数に入れてみます(変数は何でもOK)。※URLが大量になる場合の方法は後述します。

urls = ["https://www.moneypost.jp/624986","https://headlines.yahoo.co.jp/article?a=20200130-00000005-moneypost-bus_all","https://news.goo.ne.jp/article/moneypost/life/moneypost-624986.html"]

3.3つの複数URLからfor文で一つずつ取得し、ブラウザーにURLを入力しページ全体を取得する

driver = webdriver.Chrome()

for url in urls:
    driver.get(url)

    page_width = driver.execute_script('return document.body.scrollWidth')
    page_height = driver.execute_script('return document.body.scrollHeight')
    driver.set_window_size(page_width, page_height)

    url_name = url.replace(":","_").replace("/","_").replace("?", "_")
    driver.save_screenshot(r"C:\Users\●●\image_" + str(url_name) + ".png")

>> driver = webdriver.Chrome()

上記でブラウザーをGoogleクロームに指定し、ブラウザを開きます。

そしてここから少し複雑になりますが、繰り返しの処理となるfor文を使い、先程設定した3つのURLを一つずつ読み込んでいきます。driver.get(●)の中にキャプチャしたいURLが入り、SeleniumがそのURLを読み取ります。

>> page_width = driver.execute_script('return document.body.scrollWidth')
>> page_height = driver.execute_script('return document.body.scrollHeight')
>> driver.set_window_size(page_width, page_height)

キャプチャーする際は画面領域だけでなく、ページ全体を取得したいものです。上記コードを入れることで、ページ全体をスクロールすることができます。

>> url_name = url.replace(":","_").replace("/","_").replace("?", "_")

スクリーンショットを取る前に、保存するファイルの名前を決めておきます。同じ名前だと上書きされてしまうので、出力した日付/時間(秒数)などをファイル名にする方法などが一般的ですが、ここではシンプルにサイトURLをそのままファイル名に活用してみたいと思います(全く同じURLがあると上書きされる)。

URLには「/」や「?」などファイル名にそのまま使うとエラーになる文字があるため、それら文字をreplace()という機能で「_」に置換し、url_nameという変数に代入しておきます。

>> driver.save_screenshot(r"C:\Users\●●\image_" + url_name + ".png")

最後の行で、実際にスクリーンショットを取得してファイルに保存します。

>> driver.save_screenshot(●)

この●には保存するファイル名を入れます。ここではCドライブの特定のフォルダーに、先程設定した変数「url_name」を代入し、最後に画像の拡張子「.png」を設定しています。ここはjpgでもgifでも問題ないかと思います。これらは自分のPC環境に合わせて保存先を変えてください。

繰り返し作業をするfor文の一部なので最終行まで進んだら、再度2つ目のURLを取得して、また同じ作業を繰り返します。

スクリーンショットしたファイルは指定したフォルダーに自動追加されます。

取得したファイルを開くとこのようにサイト下部までしっかりと取れています。


キャプチャーしたいURLが大量にある場合

ここまではURLを直打ちで入力する方法を解説しました。ここからはURLが多い場合にエクセルから一発で入力する方法を解説します。

まずはエクセルの列に取得したいURLをまとめて入力しておき、CSVファイル(仮に名前はurls.csvとします)として保存しておきます。

続いて、このCSVファイルを読み取り、Pythonのリストに変換するため、データ解析ライブラリの一つpandasを使います。

import pandas as pd
data = pd.read_csv("urls.csv", header=None)
urls = list(data[0])

1行目でpandasをインポートし、2行目でcsvファイルを読み取りdataという変数に代入しておきます。3行目のlist()で、読み取ったdataの0番目(=1列目)のデータをPythonのリストとして変換し、urlsに代入しておきます。

あとは先程のコードのfor文以下を実行すれば、複数のURLでも一発でキャプチャが取れます。


(補足)ブラウザを起動せずにキャプチャを取る方法

上記コードだとブラウザが起動してしまうため、ブラウザを起動させずに裏でスクレイピングさせる「ヘッドレスモード」を使うのも良いでしょう。for文の前にこの4行のコードを追加しておけば、ブラウザを立ち上げること無く裏でキャプチャーを取得できます。

from selenium.webdriver.chrome.options import Options

# ヘッドレスモードを設定
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)


以上のようにPythonは面倒な広報・PR業務を大幅に改善することができます。令和時代は面倒なことは全てコンピューターに任せ、労働生産性を上げていくことがより重要となるでしょう。

  ヤフーニュースのコメントをスクレイピングで自動で取得する方法 | 広報・PR支援の株式会社ガーオン プログラミングを活用してヤフーニュースのコメントを自動取得する方法を解説します。 広報・PR支援の株式会社ガーオン
  NewsPicksのコメントをスクレイピングで自動取得する方法 | 広報・PR支援の株式会社ガーオン NewsPicksのコメント欄をプログラミングで自動で取得する方法を解説します。 広報・PR支援の株式会社ガーオン



関連記事

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