许多请求后无法重新加载页面

时间:2017-10-25 13:28:06

标签: ruby web-scraping nokogiri

我正在使用ruby nokogiri解析一个网站,但经过多次请求后,网站阻止了我,所以我必须在我解析的最后一页重试(链接是通过@next_link获得的)。

我尝试过使用sleep方法,例外情况很多。什么都行不通。

例如,我有150页要解析,但在第25页我被封锁了。

此功能循环浏览我的页面:

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

1 个答案:

答案 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