1

Mechanize を使用して Web サイトにログインし、約 1500 の Web ページを調べて、それぞれの情報を解析するローカル Ruby スクリプトを実行しようとしています。解析は機能しますが、一定の時間だけです。スクリプトは約 45 秒間実行された後、完全に停止し、次のように報告されます。

/Users/myname/.rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize/http/agent.rb:306:in `fetch': 503 => Net::HTTPServiceUnavailable for http://example.com/page;53 -- unhandled response (Mechanize::ResponseCodeError)

確かなことは言えませんが、これは接続タイムアウトによるものだと思います。非常に長いタイムアウトを使用してスクリプトでそれを解決しようとしましたが (このスクリプトの実行には最大 15 分かかる場合があります)、それでも何も変わりません。何かアイデアがあれば教えてください。

これは私のスクリプトです:

require 'mechanize'
require 'open-uri'
require 'rubygems'

agent = Mechanize.new 
agent.open_timeout   = 1000
agent.read_timeout   = 1000
agent.max_history = 1

page = agent.get('examplesite.com')

myform = page.form_with(:action => '/maint')

myuserid_field = myform.field_with(:id => "username")
myuserid_field.value = 'myusername'  
mypass_field = myform.field_with(:id => "password")
mypass_field.value = 'mypassword' 

page = agent.submit(myform, myform.buttons.first)

urlArray = [giant array of webpages here]

urlArray.each do |term|
    page = agent.get('' + term + '')
    page.encoding = 'windows-1252'
    puts agent.page.parser.xpath("//tr[4]/td[2]/textarea/text()").text + 'NEWLINEHERE'
end
4

3 に答える 3

2

私が最初に疑うのは、あなたがサイトの利用規約 (TOS) や robots.txt ファイルに違反しており、サイトのシステムがあなたを一時的に禁止しているということです。

スパイダーやクローラーを全速力で実行することは、良いネットワーク市民ではありません。そのため、TOS を検索し、robots.txt ファイルを読み込んで解析し、ルールに従ってプレイする方法を学びましょう。Mechanize は robots.txt ファイルの処理方法を知っていますが、 を使用して有効にする必要がありますrobots=

一度に 1500 ページを読もうとしても、それでいいという同意なしに読むのは、かなり明白な袋と略奪の実行になるので、それほど強く叩かないでください. 覚えておいてください、それは彼らの帯域幅と CPU にも影響を与えていることです。彼らを激しく攻撃し続けると、彼らはあなたを永久に追放するかもしれません。

于 2013-07-11T08:11:01.990 に答える