Home > Ruby > Rubyスクレーピング本を出したい

Rubyスクレーピング本を出したい

  • 2010-05-03 (月) 2:18
  • Ruby

というわけで、原稿を書きためることにする。手元に原稿を置いてもいいけど、ブログにまとめた方がモチベーションが上がりそう。あまり細かいことに拘らず、とにかく色々書く。

2chの板をスクレーピングする

2chのスレッドから情報を得たいとする。スレッドは板と呼ばれるグループに所属している。ここでは例として「台湾」板から情報を得る。各々の板にはsubject.txtというファイルがある。内容は

1141905139.dat<>韓国より台湾だと思う人→ (718)
1236575332.dat<>麻煩ね~青木由香 堂々と不法就労で警察沙汰 (753)
1268142329.dat<>■中山北路2段93巷17号ビル名「小室哲哉」■ (32)
1249183264.dat<>牛肉麺 (200)

のようなデータがたくさん入っている。subject.txtから、スレッドのタイトルと、スレッドが格納されているファイル名、レス数がわかる。<>が区切り文字になっている。

次にスレッドを取得する。スレッドはdatというディレクトリの中にある。スレッドを取得するときは、http://academy6.2ch.net/taiwan/dat/1141905139.datのようにリクエストすればいい。ダウンロードをするときにはmechanizeでもよいが、差分ダウンロードなどの機能を考えるとwgetが便利である。

wgetの-Nオプションはファイルのタイムスタンプを比較して、差分ダウンロードを試みる。2chのスレッドのように少しずつ新しい内容が付け足されていくタイプのファイルをダウンロードする場合には差分でダウンロードする方がよい。

datファイルの中身は

美麗島の名無桑<>sage<>2006/03/09(木) 20:52:19 <> 台湾わ日本を尊敬してるから偉いな <>韓国より台湾だと思う人→
美麗島の名無桑<>sage<>2006/03/09(木) 21:03:28 <> それよりもまずナガノ <>
美麗島の名無桑<><>2006/03/11(土) 23:19:10 <> 観光・グルメ・安全性の面で台湾が上だな。
漢字だから日本と違和感無いし。 <>
美麗島の名無桑<><>2006/03/12(日) 03:05:12 <> 台湾マンセーヽ(‘Д’)人(‘Д’)人(‘Д’)人(‘Д’)/ <>

このようになっている。1行が1レスになる。subject.txtと同様に区切りは<>である。

コード

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'nokogiri'
require 'mechanize'
require 'kconv'

HOST = "http://academy6.2ch.net/taiwan/"
SUBJECT = "/subject.txt"
DAT = "/dat/"

agent = Mechanize.new
agent.get(HOST + SUBJECT)
agent.page.body.toutf8.each do |line|
	array = line.split(/<>/)
	command = "wget -N " + HOST + DAT + array[0]
	puts array[1].chomp + "をダウンロードします"
	system(command)
	sleep(10)
	exit
end

コードの説明

取得したsubject.txtを1行ずつeachで見ていく。区切り文字が<>なので、それでsplitする。全てのスレッドを取得することもできるが、サンプルなので1回ダウンロードしたらexitで抜けるようにしてある。あまり連続してアクセスするのはサーバに負担をかけるので1回につき10秒の待ちを入れてある。

実行例

[onaneet@PC ~/Desktop/Ruby本]# ruby 2ch.rb
韓国より台湾だと思う人→ (718)をダウンロードします
--2010-05-03 02:02:10--  http://academy6.2ch.net/taiwan//dat/1141905139.dat
Resolving academy6.2ch.net (academy6.2ch.net)... 206.223.152.60
Connecting to academy6.2ch.net (academy6.2ch.net)|206.223.152.60|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 226448 (221K) [text/plain]
Saving to: `1141905139.dat'

Comments:0

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://blog.neoneet.jp/2010/05/03/ruby%e3%82%b9%e3%82%af%e3%83%ac%e3%83%bc%e3%83%94%e3%83%b3%e3%82%b0%e6%9c%ac%e3%82%92%e5%87%ba%e3%81%97%e3%81%9f%e3%81%84/trackback/
Listed below are links to weblogs that reference
Rubyスクレーピング本を出したい from 週刊(月刊?)プレカリアート

Home > Ruby > Rubyスクレーピング本を出したい

Search
Feeds
Meta

Page Top