※随時追加中
ブログの過去記事全てのタイトルと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ブログ
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ブログ
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によっては、記事一覧ページを取得できませんでした。(調査中)
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にエンコードします。
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