2009-09-28 130 views
0

我維護一個網站顯示我的大學組織的出版物。從網站抓取PDF文件?

我寫了一個快速和骯髒的Ruby腳本解析包含此數據(我手動抓住從科學網站ISI網)一個CSV文件,並在HTML中的一個不錯的格式顯示。

CSV文件中沒有PDF文件的直接鏈接。取而代之的是,我可以使用doi.org的信息,該信息轉發到真實頁面(由期刊託管),並提供PDF鏈接。

我希望能夠爲CSV文件中的每個出版物轉到該網頁並獲取PDF。

我從來沒有這樣做過。在終端中使用wget,這可以正常工作,除了期刊網站上的HTML鏈接僅僅是「/ link info」,沒有TLD信息。

任何人都可以推薦一個簡單的方法來解決這個問題嗎?

回答

1

我並不完全清楚你想要做什麼,但你也許可以與Mechanizewatir完成它。機械化解析並直接與網站交互,但它不支持Javascript的方式。 Watir允許你驅動一個實際的瀏覽器。哪個最適合你取決於你實際做了什麼。

+0

使用實際的gui瀏覽器是真正的矯枉過正,只是下載文件。你也應該介意,並不是每個腳本都是在gui系統上運行的。 – johannes 2009-09-30 14:31:56

+0

@johannes:在評論之前,您可能需要考慮閱讀答案。我還推薦了Mechanize,它*不需要圖形環境。但是,正如我的回答所提及的,它並沒有處理大量的Javascript。如果這是一個問題,我提供了一個替代解決方案。 – Pesto 2009-09-30 14:50:34

1

我不知道紅寶石,但doi.org會返回一個重定向作爲HTTP代碼302(暫時移動),有一個名爲「位置:」頭沿包含發佈商的網站鏈接。然後你必須刮那個頁面才能找到PDF。

0

既然你已經在寫Ruby,這看起來很適合ScRUBYt

1

一個簡單的解決方案是從ruby裏面使用wget。

system("wget -O \"#{target}\" \"#{source\"") 
  • 系統返回true或false閹wget的返回值爲0或別的東西
  • 一定要正確逃生目標和源,或有人可能接管你的系統
  • ,如果你不希望的wget的輸出在您的終端附加「>/dev/null 2>/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