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"

私が追加した主なものは、「Link is missing」という文字列があるかどうかを確認することです。HTTP ステータス コードを使用して実行したかったのですが、常に 200 が返されるため、ベスト プラクティスではありません。

注意すべきことは、私のコードでは常にサイト全体をダウンロードしてその文字列を探すことですが、現時点ではそれを修正する他のアイデアはありません.

于 2013-11-01T23:45:29.920 に答える
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 に答える
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 に答える