/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

RubyではてなブックマークのRSSにアクセスすると503が返ってくる

RubyでNokogiriとopen-uriRSSを読もうと思ったら503が返ってきた。

プログラム的にはこれ。

require 'nokogiri'
require 'open-uri'
require 'uri'

url = "http://b.hatena.ne.jp/search/tag?q=docker&mode=rss"

charset = nil

html = open( url ) do |f|
    charset = f.charset
    f.read
end

xml = Nokogiri::XML html

p xml

 

そして返ってくるエラーは503。

yatta472:~/workspace/lib/tasks $ bundle exec ruby main.rb 
/usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:359:in `open_http': 503 Service Temporarily Unavailable (OpenURI::HTTPError)
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:210:in `catch'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:717:in `open'
        from /usr/local/rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:35:in `open'
        from main.rb:12:in `<main>'
yatta472:~/workspace/lib/tasks $ 

うーむ。503って・・・・403じゃないのか。

 

User-Agentで弾かれているらしい

ちょっと調べてみたら答えはすぐ出てきた。

q.hatena.ne.jp

User-Agentで弾かれているらしい。

ってことでUser-Agentを偽装すればアクセスできた。

require 'nokogiri'
require 'open-uri'
require 'uri'

url = "http://b.hatena.ne.jp/search/tag?q=docker&mode=rss"

opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.33 Safari/530.5'

charset = nil

html = open( url, opt ) do |f|
    charset = f.charset
    f.read
end

xml = Nokogiri::XML html

p xml

そもそも、User-Agentが何になっているのかがよくわからないなぁ。あと、User-Agentをいろいろと確認して実証した結果を記事にしている方がいらっしゃったきがするんだけど忘れてしまった。

その辺も後日調べよう。