- 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'
- Newer: RubyでTwitter
- Older: Good luck new year!
Comments:0
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 週刊(月刊?)プレカリアート














