2009-09-28 3 views
0

나는 대학 그룹의 간행물을 보여주는 웹 사이트를 운영하고 있습니다.웹 사이트에서 PDF 파일을 가져 오시겠습니까?

나는이 데이터가 포함 된 CSV 파일 (ISI Web of Science 웹 사이트에서 수동으로 가져온 파일)을 구문 분석하기 위해 빠르고 더러운 Ruby 스크립트를 작성하여 HTML 형식으로 제공합니다.

CSV 파일에는 PDF 파일에 대한 직접 링크가 없습니다. 그 대신 doi.org에 갈 수있는 정보가 있습니다.이 정보는 PDF 링크와 함께 실제 페이지 (저널에 의해 호스팅 됨)로 전달됩니다.

CSV 파일의 각 발행물에 대해 해당 웹 페이지로 이동하여 PDF를 가져오고 싶습니다.

나는 전에 이것을 해본 적이 없다. 터미널에서 wget을 사용하면 TLD 정보없이 저널 웹 사이트의 HTML 링크가 단순히 "/ link info"라는 점을 제외하고는 정상적으로 작동합니다.

아무에게도이 간단한 방법을 권장 할 수 있습니까?

답변

1

나는 무엇을 하려는지 명확하지 않지만 아마도 Mechanize 또는 watir을 사용하여 달성 할 수 있습니다. Mechanize는 웹 사이트를 직접 파싱하고 상호 작용하지만 Javascript 방식을 많이 지원하지는 않습니다. Watir을 사용하면 실제 브라우저를 구동 할 수 있습니다. 당신에게 가장 적합한 것은 당신이 실제로하는 일에 달려 있습니다.

+0

실제 gui 브라우저를 사용하면 실제로 파일을 다운로드하는 데 과도한 부담이됩니다. 모든 스크립트가 GUI 시스템에서 실행되는 것은 아닙니다. – johannes

+0

@johannes : 댓글을 달기 전에 대답을 읽는 것이 좋습니다. 나는 또한 그래픽 환경이 필요없는 Mechanize를 추천했다. 하지만, 내 대답은 언급대로, 그것은 자바의 좋은 거래를 처리하지 않습니다. 이것이 문제 였다면 대안 솔루션을 제공했습니다. – Pesto

1

루비에 대해 모르지만 doi.org는 리디렉션을 HTTP 코드 302 (Moved Temporarily)와 함께 게시자의 웹 사이트 링크가 포함 된 "위치 :"라는 헤더와 함께 반환합니다. 그런 다음 해당 페이지를 긁어서 PDF를 찾으십시오.

0

이미 Ruby를 작성 중이므로 ScRUBYt에 가장 적합합니다.

1

간단한 해결책은 루비 내부에서 wget을 사용하는 것입니다.

system("wget -O \"#{target}\" \"#{source\"") 
  • 시스템은 참 또는 거짓 거세한 숫양의 wget과는
  • 가 제대로 시스템
  • 원하지 않는 경우 wget과의의 이상이 걸릴 수 있습니다 대상과 소스, 또는 누군가를 탈출해야 0 또는 다른 뭔가를 반환 반환/dev/null "을 시스템 인수에 추가하십시오.

깨끗한 해결책은 Net :: HTTP를 사용하는 것입니다. 다음 예제는 Net :: HTTP 문서에서 가져온 것입니다. 더 많은 정보를 원하시면 http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html을보십시오.

require 'net/http' 
require 'uri' 

def fetch(uri_str, limit = 10) 
    # You should choose better exception. 
    raise ArgumentError, 'HTTP redirect too deep' if limit == 0 

    response = Net::HTTP.get_response(URI.parse(uri_str)) 
    case response 
    when Net::HTTPSuccess  then response 
    when Net::HTTPRedirection then fetch(response['location'], limit - 1) 
    else 
    response.error! 
    end 
end 
관련 문제