各種ブログサービスの過去記事を全て取得する

  • 49
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

※随時追加中

ブログの過去記事全てのタイトルとURLを取得したいのですが、RSSでは最新記事数件しか取得できないので、Webスクレイピングしてしてみます。

今回はRubyでスクレイピングする際の定番ライブラリである「Nokogiri」を使います。まず初めに以下のブログ記事を読む事をおすすめします。

実際に記事一覧を取得する流れは、
(1)htmlを取得 → (2)nokogiriでパース → (3)タイトル/URL取得 → (4)次ページがあれば(1)へ戻る
みたいな感じです。

今回はあくまでタイトルとURL一覧を作りたいので、各記事の本文取得までは行っていません。
実際にスクレイピングする時は、以下の記事に目を通す事をおすすめします。

記事一覧ページまとめ

各種ブログサービスの記事一覧ページをまとめました。

サービス名 記事一覧ページURL
Amebaブログ http://ameblo.jp/:id/entrylist.html
Hatenaブログ http://:id.hatenablog.com/archive
FC2ブログ http://:id.blog.fc2.com/archives.html
SeeSaaブログ http://:id.seesaa.net/pages/user/search/?keyword=%81B

※SeeSaaブログについては後述

Amebaブログ

scraping_ameblo.rb
require 'open-uri'
require 'nokogiri'

# スクレイピングするアメブロID指定
blog_id = ''
url = "http://ameblo.jp/#{blog_id}/entrylist.html"

loop do
  # html取得
  charset = nil
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  # htmlパース
  doc = Nokogiri::HTML.parse(html, nil, charset)

  # 記事一覧
  doc.css('.contentTitleArea a').each do |node|
    p node.text  #記事タイトル
    p node.attribute('href').value  #記事URL
  end

  # 次ページがなければ終了
  unless doc.css('.pagingNext').empty?
    url = doc.css('.pagingNext').attribute('href').value
    p '---------------------------------------------'
  else
    break
  end
end

Hatenaブログ

scraping_hatena.rb
require 'open-uri'
require 'nokogiri'

# スクレイピングするhatenaID指定
blog_id = ''
url = "http://#{blog_id}.hatenablog.com/archive"

loop do
  # html取得
  charset = nil
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  # htmlパース
  doc = Nokogiri::HTML.parse(html, nil, charset)

  # 記事一覧
  doc.css('.archive-entries section h1.entry-title a').each do |node|
    p node.text  #記事タイトル
    p node.attribute('href').value  #記事URL
  end

  # 次ページがなければ終了
  unless doc.css('.pager .pager-next').empty?
    url = doc.css('.pager .pager-next a').attribute('href').value
    p '---------------------------------------------'
  else
    break
  end
end

FC2ブログ

※IDによっては、記事一覧ページを取得できませんでした。(調査中)

scraping_fc2.rb
require 'open-uri'
require 'nokogiri'

# スクレイピングするfc2ID指定
blog_id = ''
url = "http://#{blog_id}.blog.fc2.com/archives.html"

loop do
  # html取得
  charset = nil
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  # htmlパース
  doc = Nokogiri::HTML.parse(html, nil, charset)

  # 記事一覧
  doc.css('.alllog dl dt').each do |node|
    p node.css('a.entry_title').text  #記事タイトル
    p "http://#{blog_id}.blog.fc2.com/#{node.css('a.entry_title').attribute('href').value}"  #記事URL
  end

  # 次ページがなければ終了
  unless doc.css('.page a')[0].text == '<<前のページ' && doc.css('.page a')[1].nil?
    url = "http://#{blog_id}.blog.fc2.com#{doc.css('.page a').last.attribute('href').value}"
    p '---------------------------------------------'
  else
    break
  end

end

SeeSaaブログ

SeeSaaブログの場合は記事一覧ページが存在しないので、 『「。」で記事全文検索した結果ページ』 を記事一覧ページとすることにします。ほら、日本語で書かれたブログの場合、必ず「。」使いますよね?;汗

またShift-JISで返ってくるので、必ずUTF-8にエンコードします。

scraping_seesaa.rb
require 'open-uri'
require 'nokogiri'
require 'kconv'

# スクレイピングするSeeSaaID指定
blog_id = ''
url = "http://#{blog_id}.seesaa.net/pages/user/search/?keyword=%81B"

# html取得
html = open(url) do |f|
  f.read
end

# htmlパース
doc = Nokogiri::HTML.parse(html.toutf8, nil, 'utf-8')

doc.css('.blog .blogbody h3.title a').each do |node|
  p node.text #記事タイトル
  p node.attribute('href').value  #記事URL
end