我正在使用ruby nokogiri解析一个网站,但经过多次请求后,网站阻止了我,所以我必须在我解析的最后一页重试(链接是通过@next_link获得的)。
我尝试过使用sleep
方法,例外情况很多。什么都行不通。
此功能循环浏览我的页面:
def final_results(range, link)
(range[:start]..range[:finish]).each do |page_number|
begin
if page_number == 1
parse_response(parser('utf-8', 'iso-8859-1'))
elsif page_number == 2
get_next_link(link)
else
get_next_link(@next_link)
end
rescue Exception => e
range = {:start => page_number, :finish => range[:finish]}
final_results(range, link)
end
end
end
此函数获取下一页链接并解析当前页面:
def get_next_link(link)
begin
post((BASE_URL + link), request_with_captcha_solution)
aux = parser('utf-8', 'iso-8859-1')
parse_response(aux)
paginator_table = aux.css('table.fonte11')[1].children[1]
@next_link = paginator_table.children[3].children[-2]['href']
rescue Exception => e
@error_message ="#{$!}"
end
@next_link
end
答案 0 :(得分:0)
您可能会被阻止,因为您正在抓取的网站不希望机器人以您正在尝试的高费率消费其网页。减少抓取是一种合理的方法,您应该能够在每页之间使用sleep
来完成此操作。您必须使用反复试验来确定您需要走的速度,以免被阻止。
这样的事情应该有效:
def final_results(range, link)
(range[:start]..range[:finish]).each do |page_number|
begin
if page_number == 1
parse_response(parser('utf-8', 'iso-8859-1'))
elsif page_number == 2
get_next_link(link)
else
get_next_link(@next_link)
end
rescue Exception => e
range = {:start => page_number, :finish => range[:finish]}
final_results(range, link)
end
# sleep here!
end
end