| 1 | #!/usr/bin/ruby |
|---|
| 2 | |
|---|
| 3 | # 47news.jpの地方記事一覧からスクレイピングしていってrssにして保存 |
|---|
| 4 | # それと新たにスクレイピングしたものを比較していって新しければ |
|---|
| 5 | # twitterにupdate |
|---|
| 6 | |
|---|
| 7 | require 'rexml/document' |
|---|
| 8 | require 'rubygems' |
|---|
| 9 | require 'scrapi' |
|---|
| 10 | require 'open-uri' |
|---|
| 11 | require 'nkf' |
|---|
| 12 | require 'pp' |
|---|
| 13 | require 'kconv' |
|---|
| 14 | require 'date' |
|---|
| 15 | require 'rss' |
|---|
| 16 | require 'rubygems' |
|---|
| 17 | gem 'twitter' |
|---|
| 18 | require 'twitter' |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | $KCODE = 'u' |
|---|
| 22 | DIR_ROOT = '/var/www/html/lab/twitter/47news/' |
|---|
| 23 | |
|---|
| 24 | location = ARGV[0] |
|---|
| 25 | rss_path = ARGV[1] |
|---|
| 26 | mail = ARGV[2] |
|---|
| 27 | user = ARGV[3] |
|---|
| 28 | |
|---|
| 29 | scraper = Scraper.define { |
|---|
| 30 | process 'div.frameline > div.topContent > ul > li > a', "a[href]", "urls[]"=>"@href","titles[]"=>:text |
|---|
| 31 | result :urls,:titles |
|---|
| 32 | } |
|---|
| 33 | begin |
|---|
| 34 | res = open('http://www.47news.jp/localnews/'+location+'/archives.php').read |
|---|
| 35 | rescue OpenURI::HTTPError
|
|---|
| 36 | exit! |
|---|
| 37 | end
|
|---|
| 38 | |
|---|
| 39 | html = NKF::nkf('-w -m0', res) |
|---|
| 40 | |
|---|
| 41 | news = scraper.scrape(html, :parser => :html_parser) |
|---|
| 42 | |
|---|
| 43 | #comp |
|---|
| 44 | |
|---|
| 45 | if news.titles && news.urls |
|---|
| 46 | #RSS read |
|---|
| 47 | local_rss = rss_path + location + '.xml' #RSS |
|---|
| 48 | |
|---|
| 49 | local_rss = open(local_rss){ |file| RSS::Parser.parse(file.read) } |
|---|
| 50 | |
|---|
| 51 | if news.titles.size > 0 |
|---|
| 52 | for i in 0 .. news.titles.size - 1 |
|---|
| 53 | if news.titles[i] != '' |
|---|
| 54 | title = '' |
|---|
| 55 | sflg = false |
|---|
| 56 | if local_rss |
|---|
| 57 | local_rss.items.each { |item| |
|---|
| 58 | title = news.titles[i].gsub(/[ ]$/,""); |
|---|
| 59 | if title == item.title |
|---|
| 60 | #同じのがある |
|---|
| 61 | sflg = true; |
|---|
| 62 | end |
|---|
| 63 | } |
|---|
| 64 | end |
|---|
| 65 | #同じのがなければそれを送信 |
|---|
| 66 | unless sflg |
|---|
| 67 | twit = Twitter::Base.new(mail,user) |
|---|
| 68 | p title.to_s |
|---|
| 69 | twit.update(Kconv.kconv(title.to_s + news.urls[i], Kconv::UTF8)) |
|---|
| 70 | sleep 5 |
|---|
| 71 | end |
|---|
| 72 | end |
|---|
| 73 | end |
|---|
| 74 | end |
|---|
| 75 | else |
|---|
| 76 | p 'Not Found' |
|---|
| 77 | end |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | #RSS write |
|---|
| 81 | rss = RSS::Maker.make("1.0") do |maker| |
|---|
| 82 | maker.channel.about = "http://www.47news.jp/rss" |
|---|
| 83 | maker.channel.title = "" |
|---|
| 84 | maker.channel.description = "" |
|---|
| 85 | maker.channel.link = "http://www.47news.jp/" |
|---|
| 86 | |
|---|
| 87 | if news.titles && news.urls |
|---|
| 88 | for i in 0 .. news.titles.size - 1 |
|---|
| 89 | if news.titles[i] != '' |
|---|
| 90 | item = maker.items.new_item |
|---|
| 91 | item.link = news.urls[i] |
|---|
| 92 | item.title = news.titles[i].gsub(/[ ]$/,"") |
|---|
| 93 | end |
|---|
| 94 | end |
|---|
| 95 | end |
|---|
| 96 | end |
|---|
| 97 | |
|---|
| 98 | fname = DIR_ROOT + "rss/" + location + ".xml" |
|---|
| 99 | |
|---|
| 100 | File.open(fname, "w") {|file| |
|---|
| 101 | file.puts(rss.to_s.toutf8) |
|---|
| 102 | } |
|---|