はじめに
Googleのニュースサイト( https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en )のデータを取得し、翻訳し、Firebaseに保管する方法について、まとめていきます。
Pythonを用いていきます。適宜、必要なライブラリは、インストールします。
必要なライブラリは、下の二つです。
- beautifulsoup4
- requests
目次
- ニュースサイト情報
- スクレイピングのコード
- 参考文献
ニュースサイト情報
ニュース記事は、https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en から取得します。開いたイメージは次のようになっています。
urlを変化させることで、検索ワードに関する記事を取得できる他、ニュースサイトの指定、期間の指定を行えます。具体的な手法は、下を参考にしてください。
参考: Google News Rss(API)
スクレイピングのコード
スクレイピングには、主に2種類の方法が存在します。あくまで、使ってみた経験で話していきます。
- urllib.requestとBeautifulSoupを使う方法
- Seleniumを使う方法
1 を使うのは、比較的簡単なWebページの場合に限られます。現在のWebページの多くは、Java Scriptなどを用いた、動的なページが多いです。動的なページでは、うまく種得できません。今回のニュースページは、明らかに、人が閲覧するためのサイトではなく、スクレイピングするためのページです。ですので、今回は1 を使っていきます。
2 を使う場合が多いと、個人的には感じています。2 は、Google Chromeで検証ページに表示されるHTMLをそのまま、取得できます。汎用的な方法で、あらゆるタイプのサイトに使えます。しかし、処理が遅いことや、Chrome driverを適切なバージョンにしておかなければなりません。
実際のコードは次のようになります。
from urllib import request
from bs4 import BeautifulSoup
url = "https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en"
response = request.urlopen(url)
soup = BeautifulSoup(response,"xml")
response.close()
articles = soup.find_all("item")
- urlを定義する
- urlのページを開いた情報を取得する
- 取得した情報をxml形式で、情報変化する
- その中で、itemタグを持つデータを抜き出す
itemタグで、記事のデータがまとめられている。取得すると、一つ一つの記事は、次のようになっています。タイトルとid、投稿日時、説明、ソースがまとめられています。
<item>
<title>Biden says he's "not sure" about voting bills' future after Sinema reiterates opposition to rule change - CBS News</title>
<link>https://news.google.com/__i/rss/rd/articles/CBMiTmh0dHBzOi8vd3d3LmNic25ld3MuY29tL25ld3Mva3lyc3Rlbi1zaW5lbWEtdm90aW5nLXJpZ2h0cy1zZW5hdGUtcnVsZXMtc3BlZWNoL9IBAA?oc=5</link>
<guid isPermaLink="false">1222244172</guid>
<pubDate>Thu, 13 Jan 2022 23:58:00 GMT</pubDate>
<description>説明部分は長いので、省略</description>
<source url="https://www.cbsnews.com">CBS News</source>
</item>,
そして、この記事ごとのデータを取得する方法としては、下に示します。下では、タイトルを取得する方法です。"title"の部分を、linkやsourceに変えて、欲しいデータを取得します。
title = item.find("title").getText()