我正在做一个刮刀,以便在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。如何更改代码,以便只有链接存在才能创建和复制文件?
答案 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