0

我正在做一个抓取工具来下载http://exile.ru/archive/list.php?IBLOCK_ID=35&PARAMS=ISSUE上的 The Exile 的所有问题。

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

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

4

3 回答 3

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,这不是最佳实践。

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

于 2013-11-01T23:45:29.920 回答
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,则在写入本地副本时必须将文件指针放回开头以捕获整个文件。

于 2013-11-02T01:09:05.423 回答
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
于 2013-11-02T01:39:37.553 回答