从网站上抓取PDF文件?

时间:2009-09-28 15:48:26

标签: html ruby pdf web parsing

我有一个网站显示我的大学小组的出版物。

我编写了一个快速而又脏的Ruby脚本来解析包含这些数据的CSV文件(我从ISI Web of Science网站手动获取),并以HTML格式呈现它。

CSV文件中没有与PDF文件的直接链接。相反,我可以使用信息去doi.org,它可以转发到真实页面(由期刊托管),并附带PDF链接。

我希望能够为CSV文件中的每个出版物转到该网页,然后抓取PDF。

我以前从未这样做过。在终端中使用wget,这很好,除了期刊网站上的HTML链接只是“/ link info”,没有TLD信息。

有人可以推荐一种简单的方法吗?

4 个答案:

答案 0 :(得分:1)

我并不完全清楚你要做什么,但你可以用Mechanizewatir完成它。 Mechanize直接解析和与网站交互,但它不支持Javascript的方式。 Watir允许您驾驶实际的浏览器。哪种方式最适合你取决于你实际在做什么。

答案 1 :(得分:1)

我不知道红宝石,但doi.org会返回一个重定向作为HTTP代码302(暂时移动),以及一个名为“Location:”的标题,其中包含发布者的网站链接。然后你将不得不刮取该页面以找到PDF。

答案 2 :(得分:1)

一个简单的解决方案是在ruby中使用wget。

system("wget -O \"#{target}\" \"#{source\"")
  • 系统返回true或false wether 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

答案 3 :(得分:0)

由于你已经在编写Ruby,这似乎非常适合ScRUBYt