【问题标题】:Fetching only X/HTML links (not images) based on mime type根据 mime 类型仅获取 X/HTML 链接(不是图像)
【发布时间】:2012-04-26 20:05:29
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby web-crawler web-scraping


    【解决方案1】:

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

    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 相同的标头,我认为这是一个合理的假设,但需要注意。

    【讨论】:

    • HEAD 请求是要走的路。如果服务器无法确定文件类型或被指示撒谎,即使这样也可能是完全错误的,但它仍然是最佳选择。
    • 这看起来可行,但与仅测试 URL 扩展相比,在慢速服务器上性能损失是毁灭性的。我会接受它,因为它是正确的答案,但不幸的是我不能使用它。谢谢。
    猜你喜欢
    • 2017-03-04
    • 2013-10-04
    • 2011-01-07
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2010-10-20
    • 2019-08-06
    相关资源
    最近更新 更多