2009-09-28 124 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