`

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

    博客分类:
  • 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
分享到:
评论

相关推荐

    随便写的代码,大家随便看看

    【标题】:“随便写的代码,大家随便看看” 在这个标题中,虽然没有明确指出具体的技术细节,但是我们可以推测这可能是一个代码分享或者示例代码集合。作者可能是为了展示某个功能、解决某一问题,或者是进行技术...

    如何去看懂一段代码.md

    如果你要想看懂一段代码,首先你需要直到这段代码的执行流程是什么,流程也就是逻辑,知道了流程也就知道了代码从何处开始,从何处停止,每一步怎么执行。 ### 2 :每个语句的功能 当你知道了代码的执行步骤后,你...

    精品~教你看懂别人的源代码

    "精品~教你看懂别人的源代码" 在软件开发过程中,阅读别人的源代码是一项非常重要的技能。无论是从开源项目中学习新的技术,还是在工作中接手他人的代码,了解别人的源代码都是不可或缺的一部分。然而,许多程序员...

    餐厅美食网站源代码完整版

    总之,这个“餐厅美食网站源代码完整版”是一个绝佳的学习和实践平台,无论是对于初学者还是经验丰富的开发者,都能从中受益,了解和掌握网站开发的全貌。通过深入研究和修改这些代码,你可以提升自己的技能,创建出...

    扫雷游戏代码 随便来看看

    扫雷最简单的做法,大家来看看 内有代码。 扫雷游戏

    VB编写“你爱不爱我?”搞笑程序及源代码

    在VB中,代码通常写在Form的代码窗口里,每个控件都有自己的事件处理程序。例如,当用户点击按钮时,会触发Click事件。我们可以为这个按钮编写一个Sub过程,处理用户的输入。 下面是一段示例代码,展示了如何实现这...

    竖屏写代码就是爽!一个Java程序员的双屏生产力桌面

    竖屏写代码就是爽!一个Java程序员的双屏生产力桌面

    linux嵌入式C语言学习教程【李慧芹老师】的部分代码【看视频自己写的】.zip

    linux嵌入式C语言学习教程【李慧芹老师】的部分代码【看视频自己写的】linux嵌入式C语言学习教程【李慧芹老师】的部分代码【看视频自己写的】linux嵌入式C语言学习教程【李慧芹老师】的部分代码【看视频自己写的】...

    个人网站源代码

    这个资源包含了一个已经设计好的个人网站的所有源代码,这意味着你可以看到并理解每一个元素是如何构建和实现的,这对于提升网页设计技能是非常有帮助的。 首先,我们来了解一下什么是源代码。源代码是程序员用编程...

    用java写的扫雷原代码

    这是由java写的扫雷原代码,对于初学者,看看蛮不错的

    c#写的浏览器可以看源代码

    c#写的浏览器可以看源代码 public void NewNullTabPages() //新建空白页面的方法 { CustomTabpage tabpage = new CustomTabpage(this); this.urlBox.Text = "about:blank"; this.tabControl1.TabPages.Add...

    editplus如何实现整段缩进

    无论是Python的四个空格规则,还是C++或Java中普遍采用的两个空格或一个制表位,EditPlus都能轻松应对,成为你得心应手的代码编辑工具。所以,熟练运用这些技巧,你的代码将会更加整洁、规范,也更容易被同行理解和...

    按键驱动的源代码 大家看看

    这是按键驱动的源代码,使双边沿触发的,大家可以看看,写得不好见笑,我在UC/OS上也做了,不过是用下降沿触发的

    很经典的java爱情代码-懂程序的可以看看

    根据给定的信息,我们可以推断出这是一段用Java编写的、寓教于乐的爱情模拟代码。虽然原文中存在较多的非标准语法和拼写错误,但我们可以从中提炼出一些有趣的编程概念和技术知识点。 ### Java语言基础 1. **方法...

    java代码规范

    不明白这点,即使你写的再高明的算法,没准哪天也被当作乱码别处理掉。 记住!每天垒乱码(或许你不觉得,但是大多时候在别人眼中确实就是乱码)并不能使你获得更多的进步,相反要达到高水平的程序员,养成良好的...

    基于深度学习TensorFlow的手写数字识别代码(高分代码)

    基于深度学习TensorFlow的手写数字识别代码(高分代码),含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为毕设、课程设计期末大作业使用,...

    c语言表白代码

    从给定的C语言代码来看,这是一段充满创意与情感表达的程序,旨在通过编程的方式向特定的对象表达爱意。下面将详细解析这段代码所包含的知识点。 ### C语言基础 1. **头文件引入**:`#include "stdio.h"` 和 `#...

    用C写的SVR代码,可以看一看

    用C写的SVR代码,应该是不错的,我运行过的。看看吧

    15高级 6:代码已经 push 上去了才发现写错?(1).md

    进阶 6:看看我都改了什么 学习时长: 5分18秒 11 高级 1:不喜欢 merge 的分叉?用 rebase 吧 学习时长: 4分20秒 12 高级 2:刚刚提交的代码,发现写错了怎么办? 学习时长: 1分56秒 13 高级 3:写错的不是最新的...

Global site tag (gtag.js) - Google Analytics