ruby - 根据 mime 类型仅获取 X/HTML 链接(不是图像)

标签 ruby web-crawler web-scraping

我正在使用 Ruby + OpenURI + Nokogiri 抓取网站。抓取一个页面,找到所有的 a[href] 并且(如果它们在同一个域和正确的协议(protocol)中)跟随它们再次爬行。

有时会有指向大型二进制文件(例如 jpeg、exe)的链接,我不想抓取它们。

我尝试使用 HTTP "Accept" header为错误的 MIME 类型获取错误或空响应,如下所示:

require 'open-uri'
page = open(url, 'Accept'=>'text/html,application/xhtml+xml,application/xml')

...但 OpenURI 仍会下载以另一种 MIME 类型发送的二进制文件。

除了查看 url 中的文件扩展名以获取可能 文件类型外,我如何防止下载(或检测冲突的响应类型)任意 URL

最佳答案

您可以先发送一个 HEAD 请求,然后检查响应的 Content-type header ,只有在可接受的情况下才发出真正的请求:

ACCEPTABLE_TYPES = %w{text/html application/xhtml+xml application/xml}

uri = URI(url)

type = Net::HTTP.start(uri.host, uri.port) do |http|
  http.head(uri.path).content_type
end

if ACCEPTABLE_TYPES.include? type
  # fetch the url
else
  # do whatever
end

这将需要对每个页面进行额外请求,但我看不出有什么方法可以避免它。它还依赖于服务器为 HEAD 请求发送与为 GET 发送相同的 header ,我认为这是一个合理的假设,但需要注意。

关于ruby - 根据 mime 类型仅获取 X/HTML 链接(不是图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340655/

相关文章:

iphone - 使用 RubyMotion 单击按钮时如何加载 Controller ?

ruby - 将 Ruby 字符串插入 Sqlite

python - 在脚本文件函数中获取 Scrapy 爬虫输出/结果

python - 使用Python进行网页抓取时如何计算缩写列表的长度

ruby-on-rails - AsyncTask :Class 的未定义方法 `handle_asynchronously'

ruby-on-rails - 运行 RSpec 时,我得到未初始化的常量 Name::Name::Engine

javascript - 如何将带有 require 语句的本地脚本注入(inject) Puppeteer 页面

python - 为什么使用了 "selenium",页面却下不去?

css - 当 id 包含使用 Nokogiri 的特殊字符时,如何抓取 URL/文本