RubyでNokogiriとopen-uriでRSSを読もうと思ったら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で弾かれているらしい
ちょっと調べてみたら答えはすぐ出てきた。
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をいろいろと確認して実証した結果を記事にしている方がいらっしゃったきがするんだけど忘れてしまった。
その辺も後日調べよう。