我正在使用 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/