Ruby - Scraping HTML: если URL не существует, перейдите к следующему

0

В настоящее время я работаю над html-скрепером, который берет список URL-адреса аниме-планеты из текстового файла, а затем перебирает их, анализирует и сохраняет данные в базе данных.

Скребок работает красиво, однако, если я помещаю в большой список, вероятность того, что URL-адрес не будет правильно привязан к серии и выбрасывает ошибку, достаточно высока. Я хочу попробовать сделать так, чтобы, если URL-адрес не работает, он записывает URL-адрес в массиве с именем "error-urls" и просто пропускает запись.

Конечным результатом является то, что скрипт завершает весь рабочий 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
Теги:
web-scraping

1 ответ

0

Вы можете использовать обработку ошибок open-uri. См. Это для более подробной информации.

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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню