【広報担当者向け】複数のWEBニュースを自動キャプチャする方法【働き方改革】
広報活動の一貫として、WEBニュースなどに掲載された自社記事をキャプチャしてファイルで保存している方も多いと思います。
記事全体をキャプチャするには、PCのスクリーンショット機能を使う原始的な方法やブラウザーの拡張ツールを使う方法などが一般的ですが、サイトごとに手動で一つずつとっていくのは非常に手間です。
複数のスクリーンキャプチャを撮るには、Page2Imagesという海外ツールを使う方法もありますが、大量データの扱いは有料となるほか、サービス自体の動作が非常に不安定なため、ビジネスでは正直使えないのが実情です。
そんなときこそ、無料で使えるプログラミングツールPythonの出番です。
面倒な仕事は全てPythonに任せよう!
今回はPythonでWEBブラウザを自動的に動かし、ヤフーニュースやライブドアニュースなど複数のサイトから対象ニュースのページ全体のキャプチャを取ってきて、画像ファイルで保存する方法を解説します。
Pythonを走らせる環境はジュピターノートブックを使い、スクレイピングツールのSeleniumを活用します。PythonやSeleniumの使い方の説明は、下記本などに譲りここからは具体的なキャプチャ方法を解説します。
今回は例として、下記のWEBニュースサイト「マネーポストWEB」の「10年後にAIに仕事が奪われる? 様々な職業の人たちの本音は」という記事を例として進めていきます。
このニュースは同一の内容が、アグリゲーションメディアであるヤフーニュースや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行
この10行ほどのコードだけで上記3サイトのキャプチャーを自動取得してPCに保存できます。それぞれ詳しく見ていきます。
サイトをキャプチャする方法
1.まずPythonを起動し、スクレイピングライブラリ Seleniumの機能を使うためインポートします。
2.キャプチャーしたいURLをPythonのリストに追加します
リストとはエクセルでいうところの1列ごとに配置したセルのようなもので、[ ]で囲んで表記します。キャプチャーしたいURLを文字列として" "で囲んで記述し、それぞれカンマで区切って入力していきます(カンマで改行すると見やすく整います)。
そしてURLを入れたリストを、ここでは「urls」という変数に入れてみます(変数は何でもOK)。※URLが大量になる場合の方法は後述します。
3.3つの複数URLからfor文で一つずつ取得し、ブラウザーにURLを入力しページ全体を取得する
>> 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を使います。
1行目でpandasをインポートし、2行目でcsvファイルを読み取りdataという変数に代入しておきます。3行目のlist()で、読み取ったdataの0番目(=1列目)のデータをPythonのリストとして変換し、urlsに代入しておきます。
あとは先程のコードのfor文以下を実行すれば、複数のURLでも一発でキャプチャが取れます。
(補足)ブラウザを起動せずにキャプチャを取る方法
上記コードだとブラウザが起動してしまうため、ブラウザを起動させずに裏でスクレイピングさせる「ヘッドレスモード」を使うのも良いでしょう。for文の前にこの4行のコードを追加しておけば、ブラウザを立ち上げること無く裏でキャプチャーを取得できます。
以上のようにPythonは面倒な広報・PR業務を大幅に改善することができます。令和時代は面倒なことは全てコンピューターに任せ、労働生産性を上げていくことがより重要となるでしょう。