我如何处理 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
我需要从这个网站上抓取 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