本連載では、「大人の自由研究」と称してさまざまな企業の技術を活用して、本業とは少し異なる取り組みを紹介してきた。今回はオンラインでプログラミング学習サービスを提供する「Progate」を使って、マイナビニュース TECH+編集部に所属する筆者らがプログラミングに挑戦した。

Pythonは簡単だと聞いていたけれど

前回、筆者らはProgateを使用してPythonを学習する過程を紹介した。今回は編集部における業務課題の解決を想定して、各社がニュースリリースを配信しているページから最新のものを取得する仕組みの構築に取り組む。具体的には、スクレイピングという技術を使って、まずは自社のニュースリリースサイト(https://www.mynavi.jp/news/)から直近のリリースを取得する。

まず筆者がつまずいたのは、開発環境の準備である。Progateはブラウザで動くため、勉強の開始に際してはPCに何もインストールせずに手軽に始められる。しかし、自分の手でコードを記述する際にはエディタやIDE(統合開発環境)が必要となる。IDEといえば、MicrosoftのVisual Studio Code(VSCode)やAppleのXcodeなどが有名だ。

VSCodeを使用しようと思ったのだが、会社支給のPCではそもそもインストールがうまくいかなかったため、今回はPCにインストールすることなくブラウザから直接Pythonを記述し実行できる「Google Colaboratory」を使うことにした。これで、ようやく作業を開始できる。

実際にコードを書いてみよう

スクレイピングはWebページのHTMLから必要な情報を抽出する技術だ。今回のように最新のニュースを取得するほかにも、商品価格の比較や口コミの取得などに使われる。スクレイピングで広く使われる「BeautifulSoup」と「Requests」ライブラリを活用してみる。


!pip install requests
!pip install beautifulsoup4
  • コード実行結果

    コード実行結果

続いて、HTMLを取得するWebページ(今回は当社ホームページのニュースリリース)を指定し、BeautifulSoupで解析してみる。出力すると、無事にHTMLを取得できていそうなことが分かる。


url = "https://www.mynavi.jp/news/"
r= requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")

print(soup)

  • 無事にHTML情報を取得できていそうだ

    無事にHTML情報を取得できていそうだ

次に必要なHTMLタグを確認する。取得したHTML情報からも確認できるほか、Google Chromeの場合は右クリックで「検証」を開くか、キーボードの「F12」を押すことでデベロッパーツールから確認できる。

今回の場合、取得したい日時とリリースのタイトルはどちらもpタグが使われており、class属性がそれぞれ「date」「txt」となっている。

  • HTMLから確認できる

    HTML情報から確認できる

  • ブラウザから確認した
  • ブラウザから確認できた

    ブラウザから確認できた

最後に、class属性を指定してpタグの情報を抜き出してみる。


print(soup.find("p", class="date"))
print(soup.find("p", class="txt"))
  • 実行結果、最新のニュースを無事に抽出できた

    実行結果、最新のニュースを無事に抽出できた

余談

なんとか自分でコードを記述し、目標だった「スクレイピングで最新のニュースを取得する」ところまでたどり着いた。せっかくなので、もう少しこのコードを改良してみようと思う。

テキストだけを出力する

上記のコード実行結果では、目的の情報と一緒にHTMLタグも抜き出されている。そこで必要なテキストのみを出力する。


print(soup.find("p", class="date").text)
print(soup.find("p", class="txt").text)
  • 実行結果

複数のニュースを抽出する

日々発表されるニュースリリースは1本とは限らない。複数のニュースリリースが発表されたら見逃してしまう場合もある。そこで、上から5本のリリースを抽出した。


for i in soup.findall("p", class="txt",limit=5):
  print(i.text)
  • 実行結果

加えて、せっかくなので日付と共にリリースタイトルを抽出した。


for i in soup.findall("p",class=["date","txt"],limit=10):
    print(i.text)
  • 実行結果

さらなる目標

閑話休題。初心者ながら、ここまでようやく完成できただけでも達成感でいっぱいだ。プログラミング自体が初の経験とあって、これまでに経験したことのない疲労にも襲われた。記事では紹介しきれなかったが、無数のエラーが吐き出され、その都度修正を繰り返した。

そして、日々多くのニュースリリースや記者説明会の案内を受け取るマイナビニュース TECH+編集部としては、まだまだこれだけでは使い物にならない。早い話が、実際にニュースリリースが掲載されるWebページを検索して見た方がずっと楽なのだ。

そこで今後の新たな目標もできた。今後は複数サイトの最新ニュースを取得する仕組みや、ページが更新されたら自動で通知される仕組みなどにも挑戦してみたいと思う。今回の自由研究を通じて、自分で書いたコードが実際に動く感動を味わえたので、日々の業務を効率化するためにもさらに勉強を続けたい。