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


**※随時追加中**

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

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

- [Nokogiri の基本(翻訳版) - ENGINE YARD BLOG](http://www.engineyard.co.jp/blog/2012/getting-started-with-nokogiri/)

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

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

- [Webスクレイピングの注意事項一覧 - Qiita](http://qiita.com/nezuq/items/c5e827e1827e7cb29011)

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

|サービス名|記事一覧ページ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ブログ

```ruby: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ブログ

```ruby: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によっては、記事一覧ページを取得できませんでした。(調査中)

```ruby: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にエンコードします。

```ruby: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
```