仅当文件存在于ruby时才下载文件

时间:2013-11-01 23:10:35

标签: ruby

我正在做一个刮刀,以便在http://exile.ru/archive/list.php?IBLOCK_ID=35&PARAMS=ISSUE下载所有“流亡者”的问题。

到目前为止,我的代码是这样的:

require 'rubygems'
require 'open-uri'

DATA_DIR = "exile"
Dir.mkdir(DATA_DIR) unless File.exists?(DATA_DIR)
BASE_exile_URL = "http://exile.ru/docs/pdf/issues/exile"
for number in 120..290
  numero = BASE_exile_URL + number.to_s + ".pdf"
  puts "Downloading issue #{number}"
  open(numero) { |f|
    File.open("#{DATA_DIR}/#{number}.pdf",'w') do |file| 
      file.puts f.read 
    end
  }
end

puts "done"

问题是,很多问题链接都已关闭,代码会为每个问题创建一个PDF,如果它是空的,它将留下一个空的PDF。如何更改代码,以便只有链接存在才能创建和复制文件?

3 个答案:

答案 0 :(得分:0)

试试这个:

require 'rubygems'
require 'open-uri'

DATA_DIR = "exile"
Dir.mkdir(DATA_DIR) unless File.exists?(DATA_DIR)
BASE_exile_URL = "http://exile.ru/docs/pdf/issues/exile"
  for number in 120..290
    numero = BASE_exile_URL + number.to_s + ".pdf"
    open(numero) { |f|
      content = f.read
      if  content.include? "Link is missing"
        puts "Issue #{number} doesnt exists"
      else
        puts "Issue #{number} exists"
        File.open("./#{number}.pdf",'w') do |file| 
          file.write(content)
        end
      end
      } 
  end
puts "done"

我添加的主要内容是检查字符串“Link is missing”。我想使用HTTP状态代码来完成它,但它们总是返回200,这不是最好的做法。

需要注意的是,使用我的代码,你总是下载整个网站来查找该字符串,但我现在没有任何其他想法来修复它。

答案 1 :(得分:0)

require 'open-uri'

DATA_DIR = "exile"
Dir.mkdir(DATA_DIR) unless File.exists?(DATA_DIR)
url_template = "http://exile.ru/docs/pdf/issues/exile%d.pdf"
filename_template = "#{DATA_DIR}/%d.pdf"
(120..290).each do |number|
  pdf_url = url_template % number
  print "Downloading issue #{number}"
  # Opening the URL downloads the remote file.
  open(pdf_url) do |pdf_in|
    if pdf_in.read(4) == '%PDF'
      pdf_in.rewind
      File.open(filename_template % number,'w') do |pdf_out|
        pdf_out.write(pdf_in.read)
      end
      print " OK\n"
    else
      print " #{pdf_url} is not a PDF\n"
    end
  end
end

puts "done"

open(url)下载文件并提供本地临时文件的句柄。 PDF以'%PDF'开头。读取前4个字符后,如果文件是PDF,则在编写本地副本时,必须将文件指针放回到开头以捕获整个文件。

答案 2 :(得分:0)

您可以使用此代码检查文件是否存在:

require 'net/http'

def exist_the_pdf?(url_pdf)
  url = URI.parse(url_pdf)
  Net::HTTP.start(url.host, url.port) do |http|
    puts http.request_head(url.path)['content-type'] == 'application/pdf'
  end
end