确定http://foo.com是否重定向到http://www.foo.com

时间:2012-04-30 20:36:00

标签: ruby web-scraping

我有一个约150个网址的列表。我需要找出每个域是解析为www.domain.com还是仅domain.com

3 个答案:

答案 0 :(得分:5)

域名可以通过多种方式“解析”或“重定向”到另一个域名:

  1. 发送foo.com的HTTP请求可以使用HTTP redirect response code(例如301)进行回复,将浏览器发送到www.foo.com

    phrogz$ curl -I http://adobe.com
    HTTP/1.1 301 Moved Permanently
    Date: Mon, 30 Apr 2012 22:19:33 GMT
    Server: Apache
    Location: http://www.adobe.com/
    Content-Type: text/html; charset=iso-8859-1
    
  2. 服务器发回的网页可能包含<meta> redirect

    <meta http-equiv="refresh" content="0; url=http://www.adobe.com/">
    
  3. 服务器发回的网页可能包含JavaScript重定向:

    location.href = 'http://www.adobe.com';
    
  4. 您需要测试哪些?

    读取HTTP响应标头

    要检测#1,请使用Ruby内置的net/http library

    require "net/http"
    req = Net::HTTP.new('adobe.com', 80)
    response = req.request_head('/')
    p response.code, response['Location']
    #=> "301"
    #=> "http://www.adobe.com/"
    

    阅读HTML元标题

    要检测#2,您需要实际获取页面,解析它并查看内容。我会用Nokogiri:

    require 'open-uri' # …if you don't need #1 also, this is easier
    html = open('http://adobe.com').read
    
    require 'nokogiri'
    doc = Nokogiri.HTML(html)
    if meta = doc.at_xpath('//meta[@http-equiv="refresh"]')
      # Might give you "abobe.com" or "www.adobe.com"
      domain = meta['content'][%r{url=([^/"]+(\.[^/"])+)},1]
    end
    

    阅读JavaScript

    ......你在这里,你自己。 :)您可以尝试自己解析JavaScript代码,但是您需要实际运行JS以确定它是否实际重定向到另一个页面。

答案 1 :(得分:2)

我已经通过resolv std library非常成功地完成了这项工作。

require 'resolv'
["google.com", "ruby-lang.org"].map do |domain|
  [domain, Resolv.getaddress(domain)]
end

答案 2 :(得分:2)

机械化方式:

require 'mechanize'
Mechanize.new.head('http://google.com').uri.host
#=> "www.google.com.ph"