Ruby - Scraping HTML:如果url不存在,则跳到下一步

时间:2013-10-16 07:18:38

标签: html ruby-on-rails ruby web-scraping

我目前正在开发一个html scraper,它从文本文件中获取动漫行星网址列表,然后循环遍历它们,解析并将数据存储在数据库中。

刮刀工作得很好但是如果我放入一个大的列表那么url没有正确链接到一个系列并且抛出错误的可能性非常高。我想尝试这样做,以便如果url不起作用,那么它会记下名为'error-urls'的数组中的url并跳过记录。

最终结果是脚本完成了所有工作的URL并返回了一个我可以在以后使用的非工作URL列表(可能在文本文件中,或者只是在控制台中显示)。

我目前正在使用rake任务,这项工作非常顺利。如果有人可以帮我实现错误处理功能,我将不胜感激。干杯!

scrape.rake:

task :scrape => :environment do

require 'nokogiri'
require 'open-uri'

text = []

File.read("text.txt").each_line do |line|
  text << line.chop
end

text.each do |series|

    url = "http://www.anime-planet.com/anime/" + series

    data = Nokogiri::HTML(open(url))

    title = data.at_css('.theme').text
    synopsis = data.at_css('.synopsis').text.strip
    synopsis.slice! "Synopsis:\r\n\t\t\t\t\t"
    eps = data.at_css('.type').text
    year = data.at_css('.year').text
    rating = data.at_css('.avgRating').text
    categories = data.at_css('.categories')
    genre = categories.css('li').text.to_s
    image = data.at_css('#screenshots img')
    imagePath = "http://www.anime-planet.com" + image['src']

    anime = Series.create({:title => title, :image => imagePath, :description => synopsis, :eps => eps, :year => year, :rating => rating})
    anime.tag_list = genre
    anime.save()

end

end

list.txt的小例子

5-Centimeters-Per-Second
11Eyes
A-Channel
Air
Air-Gear
Aishiteru-Ze-Baby

1 个答案:

答案 0 :(得分:1)

您可以使用open-uri的错误处理。有关详细信息,请参阅this

url = "http://www.anime-planet.com/anime/" + series

begin
    doc = open(url)
rescue OpenURI::HTTPError => http_error
    # bad status code returned
    // do something here

    status = http_error.io.status[0].to_i # => 3xx, 4xx, or 5xx
    puts "Got a bad status code #{status}"

    # http_error.message is the numeric code and text in a string        
end

data = Nokogiri::HTML(doc)