我如何处理 rest-client 500 错误响应并继续抓取我的循环?

How could I handle rest-client 500 error response and keep scraping through my loop?

我需要从这个网站上抓取 10k URLs,其中一些已经停止服务(我认为...这是一个错误,return JSON我正在寻找,所以 rest-client returns 500 Internal Server error 在我的程序中)

Error syntax: `exception_with_response': 500 Internal Server Error (RestClient::InternalServerError)

为了遍历 URL,我使用了 range (1..30).each do |id|。我将 URL 与该范围的当前迭代连接起来。

response = RestClient.get(url+id)

问题有时是 URL 我存储在响应变量中的 and/or 网页 return 有一些错误。 我怎样才能保护我的代码,这样我就可以通过这个有问题的 URL 并保持 抓取 ?

这是我当前的代码(我把循环的每个代码都放在一个 begin/rescue 块中,但我不知道如何编写代码来做这样的事情):

require 'nokogiri'
require 'csv'
require 'rest-client'
require 'json'

link = "https://webfec.org.br/Utils/GetCentrobyId?cod="
CSV.open('data2.csv', 'ab') do |csv|
    csv << ['Name', 'Street', 'Info', 'E-mail', 'Site']
    (1..30).each do |id|
        begin
            response = RestClient.get(link+id.to_s)
            json = JSON.parse(response)
            html = json["Data"]
            doc = Nokogiri::HTML.parse(html)

            name = doc.xpath("/html/body/table/tbody/tr[1]").text
            street = doc.xpath("/html/body/table/tbody/tr[2]").text.gsub(Regexp.union(REMOVER), " ")
            info = doc.xpath("/html/body/table/tbody/tr[3]").text.gsub(Regexp.union(REMOVER), " ")
            email = doc.xpath("/html/body/table/tbody/tr[4]").text.gsub(Regexp.union(REMOVER), " ")
            site = doc.xpath("/html/body/table/tbody/tr[5]").text.gsub(Regexp.union(REMOVER), " ")

            csv << [name, street, info, email, site]
        rescue

        end
    end
end

你可以看到我把循环中的所有内容都放在 begin 块中,最后还有 rescue 块,但我不知道如何做这样的事情。

你应该只挽救exmaple的异常:

[*1..3].each{|i| RestClient.get('https://fooboton.free.beeceptor.com') rescue RestClient::InternalServerError; next}

所以对于你的情况:

CSV.open('data2.csv', 'ab') do |csv|
    csv << ['Name', 'Street', 'Info', 'E-mail', 'Site']
    (1..30).each do |id|
      begin
        response = RestClient.get(link+id.to_s) 
      rescue RestClient::InternalServerError
        next # skip this iteration in your loop
      end
    ... # rest of your code