gpt4 book ai didi

ruby - Mechanize html 抓取问题

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:17 26 4
gpt4 key购买 nike

所以我正在尝试使用 ruby​​ mechanize 和 hpricot 提取我网站的电子邮件。我试图在我的管理端的所有页面上循环并使用 hpricot 解析页面。到目前为止一切顺利。然后我得到:

Exception `Net::HTTPBadResponse' at /usr/lib/ruby/1.8/net/http.rb:2022 - wrong status line: *SOME HTML CODE HERE*

当它解析一堆页面时,它以超时开始,然后打印页面的html代码。不明白为什么?我该如何调试呢?似乎 Mechanize 可以连续获得超过 10 页??是否可以??谢谢

<p></p>

<p>require 'logger'
require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'open-uri'</p>

<p>class Harvester</p>

<p>def initialize(page)
@page=page
@agent = WWW::Mechanize.new{|a| a.log = Logger.new("logs.log") }
@agent.keep_alive=false
@agent.read_timeout=15</p>

<p>end</p>

<p>def login
f = @agent.get( "http://****.com/admin/index.asp") .forms.first
f.set_fields(:username => "user", :password =>"pass")
f.submit<br/>
end</p>

<p>def harvest(s)
pageNumber=1
#@agent.read_timeout =
s.upto(@page) do |pagenb|</p>

<pre><code> puts "*************************** page= #{pagenb}/#{@page}***************************************"
begin
#time=Time.now
#search=@agent.get( "http://****.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}")
extract(pagenb)

rescue => e
puts "unknown #{e.to_s}"
#puts "url:http://****.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}"
#sleep(2)
extract(pagenb)

rescue Net::HTTPBadResponse => e
puts "net exception"+ e.to_s
rescue WWW::Mechanize::ResponseCodeError => ex
puts "mechanize error: "+ex.response_code
rescue Timeout::Error => e
puts "timeout: "+e.to_s
end


end
</code></pre>

<p>end</p>

<p>def extract(page)
#puts search.body
search=@agent.get( "http://***.com/admin/members.asp?action=search&term=&state_id=&r=500&p=#{page}")
doc = Hpricot(search.body)</p>

<pre><code> #remove titles
#~ doc.search("/html/body/div/table[2]/tr/td[2]/table[3]/tr[1]").remove

(doc/"/html/body/div/table[2]/tr/td[2]/table[3]//tr").each do |tr|
#delete the phone number from the html
temp = tr.search("/td[2]").inner_html
index = temp.index('<')
email = temp[0..index-1]
puts email
f=File.open("./emails", 'a')
f.puts(email)
f.close
end
</code></pre>

<p>end</p>

<p>end</p>

<p>puts "starting extacting emails ... "</p>

<p>start =ARGV[0].to_i</p>

<p>h=Harvester.new(186)
h.login
h.harvest(start)</p>

<p></p>

最佳答案

Mechanize 将页面的全部内容放入历史记录中,这可能会导致在浏览多个页面时出现问题。要限制历史的大小,尝试

@mech = WWW::Mechanize.new do |agent|
agent.history.max_size = 1
end

关于ruby - Mechanize html 抓取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com