【问题标题】:Can't reload the page after many requests多次请求后无法重新加载页面
【发布时间】:2017-10-25 21:54:32
【问题描述】:

我正在用 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

【问题讨论】:

    标签: ruby web-scraping nokogiri


    【解决方案1】:

    您可能会被阻止,因为您正在抓取的网站不希望机器人以您尝试的高速率消耗其页面。减慢抓取速度是一种合理的方法,您应该能够在每个页面之间使用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
    

    【讨论】:

    • 我以前试过这个,即使睡 1 分钟也没有用。
    • 那么,在大量请求之后,速率限制机制可能会将您锁定一段时间。您可以尝试使用 VPN 从不同的 IP 地址访问它,但这有点“阴暗”。该站点的运营商不希望您这样抓取它。问题:当请求失败时,你在响应中得到什么状态码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多