忍者ブログ

プロジェクト・サイラス・スミスBLOG

ホームページ「プロジェクト・サイラス・スミス」http://projcyrussmith.moto-nari.com/ のブログ部分です。メインのコンテンツ(翻訳したSF)自体はホームページ側にあります。ブログ側にはSFのレビューなどを投稿しています。 ※SF翻訳活動は、実用度の高い機械翻訳の台頭により意義を失ったと考えるため、2021年以降はほぼ休止しています(2021/4/14投稿を参照)。 ※ブログ内のエントリ間のハイパーリンクはまれに切れている場合がありえます。お手数ですが検索機能をご活用ください。

RubyでWebスクレイピングする際の実践的TIPS~UA偽装

Webスクレイピング、と名乗るのものおこがましいが
  1. require 'open-uri'
  2. html = URI.open('https://www.sample.com/hoge.html').read
  3. puts html.include?('fuga')
 
みたいなスクリプトでウェブページに特定の語句が含まれているか調べようとしたらなんか403ばかり返って来る。言語的な問題だと思って書き方を変えたりRubyのバージョンを変えたり色々やったが改善しない。

しかし小1時間苦しんだ末にようやく閃いた。一般的なウェブサーバーは変なユーザーエージェントからのアクセスを拒否する仕組みになっているのではないか、と。そこでUser-Agentオプションでありえそうなユーザーエージェントを指定してやったら問題は解消された。
  1. require 'open-uri'
  2. 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
  3. puts html.include?('fuga')
そして、逆にRubyでただURI.openした際にWebサーバー側から見えるユーザーエージェントを確かめてみたら「Ruby」という文字列だった。こりゃあ確かに異常扱いされても仕方がない。

後から考えてみると、この問題の発生と解決は過去数年間のうちに1度や2度は出くわしていた可能性が高い。しかし毎回忘れて調べて試して再発見していた可能性が高い。愚かだった。今度こそ忘れないように備忘録を投稿しておく。
PR

コメント

プロフィール

HN:
匿名(仮称:プロジェクト・サイラス・スミス管理人)
性別:
非公開

P R