2013-11-01 187 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 
相關問題