Edited at

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

More than 5 years have passed since last update.

※随時追加中

ブログの過去記事全てのタイトルと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