Webスクレイピング、と名乗るのものおこがましいが
- require 'open-uri'
- html = URI.open('https://www.sample.com/hoge.html').read
- puts html.include?('fuga')
みたいなスクリプトでウェブページに特定の語句が含まれているか調べようとしたらなんか403ばかり返って来る。言語的な問題だと思って書き方を変えたりRubyのバージョンを変えたり色々やったが改善しない。
しかし小1時間苦しんだ末にようやく閃いた。一般的なウェブサーバーは変なユーザーエージェントからのアクセスを拒否する仕組みになっているのではないか、と。そこでUser-Agentオプションでありえそうなユーザーエージェントを指定してやったら問題は解消された。
- require 'open-uri'
- html = URI.open('https://www.sample.com/hoge.html', 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36').read
- puts html.include?('fuga')
そして、逆にRubyでただURI.openした際にWebサーバー側から見えるユーザーエージェントを確かめてみたら「Ruby」という文字列だった。こりゃあ確かに異常扱いされても仕方がない。
後から考えてみると、この問題の発生と解決は過去数年間のうちに1度や2度は出くわしていた可能性が高い。しかし毎回忘れて調べて試して再発見していた可能性が高い。愚かだった。今度こそ忘れないように備忘録を投稿しておく。