2013-11-01 131 views
0

我正在做一个刮板来下载所有的流亡者的问题,可在http://exile.ru/archive/list.php?IBLOCK_ID=35&PARAMS=ISSUE只有在存在ruby的情况下才能下载文件

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

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。如何更改代码以便它只能在链接存在时创建和复制文件?

回答

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文件,则在写入本地副本时,必须将文件指针放回到开头以捕获整个文件。

+0

这个工作!非常感谢,traybold! – LuisLago

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" 

我说最主要的是检查是否字符串“链接缺失”。我想用HTTP状态码来做,但他们总是给200回来,这不是最好的做法。

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

+0

如果该文件存在与否,只是创建了相同数量的存在的文件的空文件这一项可以检测,它由于某种原因不写信。 – LuisLago

+0

现在它正在工作...对不起:D –

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 
相关问题