`

写段代码看看别人都怎么称呼你网站的?

    博客分类:
  • Ruby
阅读更多
步骤很简单:
1)使用google的搜索inlink的语法link:url和num参数指定一页显示的结果数,
在这个结果中找到外链的页面url,排除网站内链接。
def search_inlinks_from_google(query,result_num)
        escaped_query = CGI.escape("link:#{query}")
        google_url = "http://www.google.com/search?q=#{escaped_query}&num=#{result_num}"
        inlinks = []
       
        Nokogiri::HTML(open(google_url,:proxy => rand_proxy)).css('h3.r > a.l').each do |node|
            link = node.attributes['href']
            inlinks << link if not self_inlink?(query,link)
            puts "inlink: #{link}"
        end
        return inlinks
    end

2)依次fetch每个url的页面,在fetch下来的页面找到目标链接,把achor
text记录下来,并计数。
 def find_site_names_by_inlinks(inlinks,site_query)
        name_count_map = Hash.new{|hash,key| hash[key] = 0}
        inlinks.each do |link|
            puts "searching from #{link}..."
            Nokogiri::HTML(open(link,fetch_options)).xpath("//a").each do |link_node|
                name_count_map[link_node.text.strip.downcase] += 1 if link_node.attributes["href"].to_s =~ /#{site_query}/
            end
        end
        p name_count_map
        name_count_map.sort{|a,b| b[1] <=> a[1]}.collect{|name,count| name }
    end

3)按照出现次数排序,比较靠前的基本是这个网站的名字了。
我们使用了好几个代理,每次随机选取一个,以防被封掉。
全部的代码:
#!/usr/bin/ruby
# author fuliang http://fuliang.iteye.com
require 'nokogiri'
require 'open-uri'
require 'net/http'
require 'cgi'

class SiteNameSearchAgent
public
    def initialize
        @proxies = 1.upto(6).collect{|index| "http://l-crwl#{index}:1080"}
    end
    
    def get_site_names(site_query,max_result_num=20)
        inlinks = search_inlinks_from_google(site_query,max_result_num)
        find_site_names_by_inlinks(inlinks,site_query)
    end
private
    def search_inlinks_from_google(query,result_num)
        escaped_query = CGI.escape("link:#{query}")
        google_url = "http://www.google.com/search?q=#{escaped_query}&num=#{result_num}"
        inlinks = []
       
        Nokogiri::HTML(open(google_url,:proxy => rand_proxy)).css('h3.r > a.l').each do |node|
            link = node.attributes['href']
            inlinks << link if not self_inlink?(query,link)
            puts "inlink: #{link}"
        end
        return inlinks
    end
    
    def self_inlink?(query,link)
        query_domain,link_domain = [query,link].collect{|url| URI.parse(url).host.sub(/^(.*?)\./,"")}
        return query_domain == link_domain
    end

    def find_site_names_by_inlinks(inlinks,site_query)
        name_count_map = Hash.new{|hash,key| hash[key] = 0}
        inlinks.each do |link|
            puts "searching from #{link}..."
            Nokogiri::HTML(open(link,fetch_options)).xpath("//a").each do |link_node|
                name_count_map[link_node.text.strip.downcase] += 1 if link_node.attributes["href"].to_s =~ /#{site_query}/
            end
        end
        p name_count_map
        name_count_map.sort{|a,b| b[1] <=> a[1]}.collect{|name,count| name }
    end

    def rand_proxy
        return @proxies[(rand * 6).to_i]
    end

    def fetch_options
        user_agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20061201 Firefox/2.0.0.2 (Ubuntu-feisty)"
        fetch_options = {
            "User-Agent" => user_agent,
            "proxy" => rand_proxy
        }
    end
end

search_agent = SiteNameSearchAgent.new
p search_agent.get_site_names("http://www.iteye.com",50)

结果:
引用

{"javaeye/ago123456/123456"=>3, "05.javaeye技术网站"=>1, "javaeye"=>12, "http://www.iteye.com"=>2, "go"=>1, "www.iteye.com"=>1, "javaeye技术社区"=>4, "javaeye社区"=>1, "上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师"=>1, "对require的疑惑--ruby -javaeye做最棒的软件开发交流社区"=>1, ""=>2, "访问此网站"=>1, "google reader"=>1, "javascriptå\u009Fºç¡\u0080ç\u009F¥è¯\u0086大é\u009B\u0086é\u0094¦(1)"=>1, "webå\u0089\u008D端æ\u008A\u0080æ\u009C¯è®ºå\u009D\u009Bæ\u009C\u0080æ\u0096°è®¨è®º - javaeye"=>1}
["javaeye", "javaeye技术社区", "javaeye/ago123456/123456", "http://www.iteye.com", "", "javaeye社区", "go", "www.iteye.com", "上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师", "对require的疑惑--ruby -javaeye做最棒的软件开发交流社区", "05.javaeye技术网站", "访问此网站", "google reader", "javascriptå\u009Fºç¡\u0080ç\u009F¥è¯\u0086大é\u009B\u0086é\u0094¦(1)", "webå\u0089\u008D端æ\u008A\u0080æ\u009C¯è®ºå\u009D\u009Bæ\u009C\u0080æ\u0096°è®¨è®º - javaeye"]


需要安装gem nokogiri,在Ubuntu下:
引用

$ sudo apt-get install libxml2 libxml2-dev libxslt libxslt-dev
$ gem install nokogiri
0
0
分享到:
评论

相关推荐

    SCJP的专业英语,非常实用

    * 先看一看样品吧? #### 四、总结 通过上述内容的学习和实践,不仅可以帮助考生顺利通过SCJP考试,还能为未来的职业发展打下坚实的基础。尤其是在全球化背景下,掌握专业英语不仅能够提高个人竞争力,还能够在...

    笨蛋的英文怎么写.docx

    在IT技术领域,我们更注重于代码的逻辑和功能的实现,对于日常生活中使用的许多词汇,在这里往往不会被频繁提及。然而,在我们的工作中,不可避免地会涉及到一些非专业词汇的翻译与使用。当我们需要沟通时,是否能...

    中考英语新目标七年级上册短语复习PPT课件.pptx

    - have a look/look(看,看一看):请求或邀请他人查看某物。 - a friend of mine(我的一个朋友):指的是与说话者有交情的朋友。 - …’s brother(…的哥哥):表示兄弟关系。 - …’s bags(…的书包):...

    1433无FTP传马教程

    "老鸟"是对资深人士的俚语称呼,暗示他们可能不需要这样的基础教程。 【标签】"mimangdebeijing"看起来像一个俚语或者特定群体的暗号,可能表示这个教程的内容与北京的网络环境或某个特定的网络社区有关,或者只是...

    pico8-实验:Pico 8实验

    实验可能涉及如何利用 Pico 8 的BBS系统分享和回放代码,以及如何通过阅读他人的实验来学习和改进。 6. **教育用途**: Pico 8 也是学习游戏开发和编程的理想工具,因其简洁的环境和内置的教程。实验可能包括设计...

    一种新颖的好奇心驱动的知觉行为认知模型

    5. 学术交流的礼仪和规范:从收件人和抄送人的邮件地址以及邮件的格式来看,文件强调了学术交流中的专业性和礼仪。邮件中使用了正式的称呼和结束语,体现了学术界的沟通规范。同时,文件内容也暗示了学术会议参与...

    octoherd-scripts:我的@octoherd脚本的集合

    《章鱼脚本:探索与理解JavaScript在GitHub自动化中的应用》 在当今的软件开发领域,GitHub不仅是代码...无论你是初学者还是经验丰富的开发者,都可以从中获取有价值的信息,进一步提升你在GitHub自动化领域的技能。

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Blog记载了日常发生的事情和自己的兴趣爱好,把自己的思想和知识和他人分享、交流,同时又通过“六度空间”结识了更多志趣相投的朋友;而越来越多专业知识的 Blog 的出现,让我们看到了 Blog 更多所蕴涵的巨大的...

    Russian roulette 2013:运气可以通过一个简单的游戏来决定...-开源

    在数字游戏的海洋中,每一款游戏都承载着其创作者的创意和理念。而当这些游戏采用了开源的形式,它们便不只是娱乐的工具,更是技术和创意的开放实验室。2013年的开源游戏“Russian Roulette 2013”便是在这样的背景...

    美食

    在IT领域,这可能是开发者自创的术语,或者是对某个现有技术的本地化称呼。在这里,它可能是指一个用于构建美食项目的特定开发环境或工具集。 【标签】:“HTML”(HyperText Markup Language)是网页制作的基础...

Global site tag (gtag.js) - Google Analytics