我需要从该网站抓取 10k 个 URL,其中一些已停止服务(我认为...这是一个错误,不会返回我正在查找的 JSON,因此 rest-client
在我的程序中返回 500 内部服务器错误
)
Error syntax: `exception_with_response': 500 Internal Server Error (RestClient::InternalServerError)
为了循环访问 URL,我使用范围 (1..30).each do |id|
。我将 URL 与该范围的当前迭代连接起来。
response = RestClient.get(url+id)
问题是有时我存储在响应变量中的 URL 不存在和/或网页返回一些错误。 我怎样才能保护我的代码,这样我就可以通过这个有问题的 URL 并保持抓取?
这是我当前的代码(我将循环的每个代码都放在开始/救援 block 中,但我不知道如何编写代码来执行此类操作):
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
block 内,最后有 rescue
block ,但我很不知道如何做到这一点东西。
最佳答案
您应该只拯救 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
关于ruby - 我如何处理rest-client 500错误响应并继续抓取我的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232059/