4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Ruby]Google News RSSからニュースを取得してJSONで返す

Last updated at Posted at 2019-09-28

はじめに

趣味で作っているWebアプリケーションでニュースAPIを叩きたくて調べてみました。
日本語のニュースを取得できるAPIは、newsAPI(日本語版)などがありますが、取得方法everythingに対応しておらず、top-headlinesだと20件のみしかとってきてくれないようです。

取得方法everythingはエラーになります。

$ curl 'https://newsapi.org/v2/everything?country=jp&apiKey={YOUR_API_KEY}'
{"status":"error","code":"parameterInvalid","message":"The country param is not currently supported on the /everything endpoint."}

一方、top-headlinesは取れますが、20件までしか取得できないです。

$ curl 'https://newsapi.org/v2/top-headlines?country=jp&apiKey={YOUR_API_KEY}' 
{"status":"ok","totalResults":30,"articles":[{"source":{"id":"engadget","name":"Engadget"},"author":"Ittousai","title":"速報:マイクラアースは10月配信開始、アーリーアクセスの事前登録を受付 #MinecraftEarth - Engadget 日本版","description":"マイクロソフトが基本無料のスマホAR版マインクラフト Minecraft Earthの...()

なので、category指定とかもできますが、どのカテゴリも2, 3件しかない状態なので、使いづらいなと思っていました。

大量のニュースを取得できて、かつカテゴリ指定や検索ができるAPIがないかなと思っていたのですが、なさそうなので、タイトルの通りGoogle News RSSからとってきてJSONで返すAPIを自作すればいいのかなと思いました。

コード

試しで書いてみたら取得することができました。
クエリストリングでカテゴリや検索ワードを指定できるみたいです。
ここでは一旦カテゴリだけ指定してみます。

news_to_json.rb
# frozen_string_literal: true

require 'rss'
require 'active_support'
require 'active_support/core_ext'

category = ARGV[0]
base_url = 'https://news.google.com/rss/search'
query_string = "?hl=ja&q=#{category}&hl=ja&gl=JP&ceid=JP:ja"

rss = RSS::Parser.parse(base_url + query_string)
news_hash = Hash.from_xml(rss.to_xml)
news_json = news_hash.to_json

puts news_json

$ ruby news_to_json.rb health

{"rss":{"version":"2.0","xmlns:content":"http://purl.org/rss/1.0/modules/content/","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:itunes":"http://www.itunes.com/dtds/podcast-1.0.dtd","xmlns:trackback":"http://madskills.com/public/xml/rss/mod...(略)

おわりに

こんな感じのAPI自作して、フロントエンドで呼び出せばWebで便利に使えるのかなと思いました。
ただ、Google News RSSはニュースの画像を返してくれないので、画像が欲しい場合はスクレイピングして、OGP画像のリンクを取得する。OGPがなければフロントエンドでデフォルトの画像を表示する、といった実装が必要そうです。

スクレイピングは、【rails】urlからサイトの情報を引き出す。【スクレイピング】を参考に、<meta property="og:image"> をとってくればできそうです。

4
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?