omiga

简单就好

SEO的那些事儿

2条评论»

去年Q4客串了点SEO的工作,简单总结下。当然SEO涉及内部优化和外部优化两个方面,内部优化主要是站点内链路结构的优化和关键词优化,外部优化则主要是外部链接优化。相对来说,内部优化更具可操作性,而且成本也较低,但是内部优化在整个SEO中只能占到30%~40%的比重,外部优化能带来实际效果的提升可能更显而易见,比如你在权重极高的站点获得了一个外部链接,那么你这个网站权重的提升将会比较明显,但我觉得外部优化不算个技术活儿,还存在很多“潜规则”,我表示兴趣不大。所以以下内容主要涉及的是SEO中内部优化的一点总结。

页面收录

SEO内部优化第一步当然不是关键词优化,第一步简单粗暴:让搜索引擎收录更多页面!抛开外链不谈,单从站点本身来说,让每一个页面都有链接(内部链接)链接进来,能被搜索引擎爬虫爬到即可。一般来说一个站点中首页具有权重是最高的,搜索引擎爬取的频率也非常高,所以内部链接结构优化也通常是从首页入手,如把最新更新的内容放到首页第一屏内。这样做一方面能提升用户体验,另一方面也是让搜索引擎能即时地抓取到新增加的页面。

但是首页能承载的内容总是有限的,为了增加站内页面的链接入口,通常站点也还会常用诸如“分类”、“存档”或是“推荐”这样的形式来增加内部链接的数量,在SEO中这些方法都是可行的。

除此之外你还可以通过“网站地图”来提交页面地供搜索引擎抓取。目前主流搜索引擎都支持通过站点地图提交网站链接,但是百度目前情况不明。每个sitemap.xml最多只能提交50000个链接,一个站点可以有多个sitemap文件,默认搜索引擎会试图抓取根目录下的sitemap.xml文件,你也可以将sitemap.xml添加到robots.txt文件(Sitemap:   http://example.com/sitemap.xml)。多个sitemap的情况可以通过添加到robots.txt或是创建sitemap索引文件(其实我不知道这个东西咋用)来告诉搜索引擎sitemap的具体路径。一点建议:一个网站除了可以建立一个xml版的sitemap外,还可以考虑创建一个html的sitemap,除了能够增加搜索引擎爬取到站内链接的机会,而且对用户体验的提升也有大有益处的。

目前flash内的链接,JS产生的链接内容都是不能被抓取的。当你的网站必须要使用flash或是JS来创建内容时,最好是也能创建一个HTML版来共搜索引擎抓取页面上的链接。这个特性当然很多时候被用来控制页面权重的分配。

关键词优化

我们在搜索引擎中搜索关键词,搜索引擎将与这个关键词相匹配的网页检索出来,根据网页内容与这个关键词的相关性高低来返回给我们。那么搜索引擎是如何来确定一个网页与某个关键词的相关性的呢?

在确定关键词之前是提取关键词。搜索引擎爬取页面后,将页面内容通过分词技术等将页面文本内容提取出来。但是页面中的有些地方的词“先天性”的就具有一定的相关性。比如

  1. 页面标题(title)中出现的词
  2. hn标签中出现的词(通常是h1>h2>h3,其他h标签几乎没有任何权重了)
  3. 页面代码中越靠前的内容
  4. 黑体或斜体字体
  5. ……

所以技术手段的优化基本上就是将页面中的主要关键词分布到title,h1/h2/h3,页面内容靠前的部分来提高关键词的相关性。很多有分栏设计的页面,都可以通过技术实现将主要内容在代码中置前来排除其他辅助性内容的干扰。黑体和斜体字体较之于其他字体具有略高的相关性,当然这在用户看来也是具有强调提示作用的。关键词在上诉位置有所体现,同时在页面正文中也有一定的密度分布,那么这个关键词基本上在页面内容上的优化就OK了。但是这里注意一点:切忌堆砌大量关键词,有可能被视作作弊而受到惩罚。

除了页面中本身内容提取出来的关键词,外部链接文字也会对页面关键词产生影响,有时候影响还非常大。举个极端一点的例子,比如说某几个大型网站,PR值极高,在他们的首页上都有链接“handsome man”链接到我们的博客域名omiga.org,那么“handsome man”就有可能成为我博客的关键词,而且相关性极高。

在上面例子的过程中,一方面大型站点拥有极高的权重和信任度,那么搜索引擎会认为它的描述信息是准确可信的,同时也将它们的权重传递到了我的域名上。站点域名权重对关键词相关性的计算也有较大的影响。

keyoworksdescription这两个曾经名噪一时的属性如今在关键词相关性计算方面基本上已经没有任何作用,因为曾经的极度滥用,搜索引擎已将这两个属性打入冷宫。但是description对于搜索结果的调整还是有很大的用处,基本上各搜索引擎还是首先考虑将description中的内容显示成搜索结果的描述信息。

权重传递

上面提到了权重的传递,权重的传递都是通过链接来完成,而且同等条件下外部链接比内部链接能传递更多的权重,因为内部链接毕竟是网站管理员自己所能控制的,搜索引擎不会让你随意的操作权重的分配。尽管如此,不等于说在站点内部控制权重的分配没有一点作用,你在pr值极高的首页链接到一个内页,这个内页同样还是会获得比较高的权重的。权重传递会随着页面深度的增加会逐渐衰减,一般来说>4层的链接后的页面已经分配不到第一个页面的权重了。比如:A链向B、B链向C,C链向D(A-B-C-D),那么D基本上能分配得到A的权重就极少了,哪怕A是http://www.miibeian.gov.cn/。很多网站使用了分页功能,这样做前面的一两页内容上的链接或许还能分配到一点权重,而后面的页码上的链接由于深度的关系,可能就分配不到任何权重了。

页面权重的传递除了可以通过外部链接来进行,其实向外导出链接也有可能获得一些权重,或是信任度。比如在网站A首页上,添加各大门户的首页链接,那么也是有可能对A的权重产生影响的。同时还有可能增加用户信任度,对提高点击量具有一定的作用!

站点内部权重的分配,一方面可以通过链接深度来实现,另一方面有一个rel=”nofollow”属性,你在wordpress的评论发布者链接上可以看到这个属性,搜索引擎不会为具有rel=”nofollow”属性的链接分配权重,也不会爬取这个链接,目前主流浏览器都支持这个属性。当然<meta name=”robots” content=”noindex,nofollow” />也具有相同的作用,不同之处是meta方式将使页面上所有的链接不被爬取也不能分配权重,百度目前不支持noindex。 阅读全文»

今年过年不回家!

7条评论»

哥已经7年没回老家了?faint~···原来这么久了,今年还是不回了,一个人在这边过年。

假还没放,计划列了一大堆,希望都能实现。

准备换个theme了,设计稿09年1月份就弄在那里了,一直懒得弄,趁这个假期把它干掉。

wordpress theme

wordpress theme

2011-02-15最新消息:这个theme其实是做好了,但是哥觉得太难看,没有换上来~···

黑客与画家

3条评论»

[貌似以前看过,今天偶然又看到,转过来存档。翻译原文。另:关注这个]

我读完计算机本科以后,去艺术学校学习绘画。许多人感到奇怪,喜欢计算机的人也会喜欢美术吗?他们大概认为编程序和画画是两种完全不同的工作,编程需要冷静,精密,和正确的方法,而画画是表达某种狂热的情感。

这种印象是不对的,编程和画画有很多共同之处,实际上,在我认识的不同类型的人中间,画家和黑客是最相似的。

画家和黑客的相似之处在于:他们都是创造者,就好像作曲家,建筑师,以及作家一样。黑客和画家类似,他们的目的是创造某种美好的事物。尽管在创造的过程中,也许会发现新技术,但他们的根本目的并不是研究技术。

我从来都不喜欢”计算机科学”这个词,因为这种东西根本就不存在。这门学科的内容,不过是由于历史原因偶然凑合到一起的大杂烩,就好像南斯拉夫国的形成一样。一头是数学家们,他们摆弄计算机是为了得到国防部的资金赞助,中间部分,一伙人在研究仿佛是计算机自然史之类的东西--比如网络上数据流算法的行为特征等等。在另一个极端上,是黑客们,他们编写有趣的软件。对他们来说,计算机是表达的工具,如同水泥之于建筑师,颜料之于画家。这三种人凑在一块的群体,就好像是数学家,物理学家和建筑师被分到一个专业里。

有时候黑客们干的事被称为”软件工程”,这个词也是一种误会。比起建筑师来,软件设计师离工程师的距离更远。建筑师和工程师的分界并不十分精确,但却是实实在在存在的。其分界在于做什么和如何做:建筑师决定做什么,工程师考虑如何做出来。

这两件事情也不能分得太开,如果你不懂得如何做,那么你设计的时候就会陷入难局。但是编程当然不是仅仅决定如何实现某种特性那么简单,在最好的情况下,编程实际上就是设计软件的特性--往往最好的设计方式就是实现它。

说不定哪一天,”计算机科学”会分裂成几个专业,就好像南斯拉夫最终分裂成几个国家那样。这也许是件好事。尤其是这意味着我所擅长的编程,会变成独立的专业。

这些不同类型的工作绑到一个专业里,当然有利于行政管理,但是却会引起智力上的困惑。这也是我不喜欢这个名词的另一个原因。处于中间部分的那伙人所干的,和经验科学差不多,但是另外两头的人,数学家和黑客,可不太象是在干真正的科学。

数学家好像并不为这个问题发愁,他们就象数学系的同行一样,很高兴地做着理论研究,不久就忘了办公大楼的牌子写的是”计算机科学系”。但是对黑客们来说,这个牌子就很成问题。既然他们干的事被称作科学,他们就会感到好歹要象那么回事,于是大学和研究所的黑客们觉得应该写论文,而不是写优美的程序。但是不幸得很, 后者才是他们真正应该干的。

论文充其量不过是一个手续。黑客写出很棒的程序,然后再做一篇论文,论文表示软件上的成绩。但是两者之间的不协调引起了问题:好的软件比起糟糕的软件来,更加不适合做论文的题材。

好的软件不适合作论文的题材。首先,论文要有独创性的,写过博士论文的都知道,要想保证你开垦的那片地是处女地,就等于说是你划出一片别人都不想要的地来。第二,论文必须言之有物。糟糕的软件使论文材料充足,你有很多事实可以描述你是如何克服那些困难的。糟糕的假设总是会产生大量问题。大部分AI 研究就是好例子。比如,你假定,以抽象概念为参量的逻辑表达式列表可以用来表示知识,那你要论证的内容可就多了。就像Ricky Ricardo说的,Lucy,这下可够你解释了。

创造美好事物的过程,常常是对已有事物的细微调整,或者是把已有概念用新方式组合起来。这种事情,恐怕不太好做研究论文吧。 阅读全文»

LSO/Flash Cookie

4条评论»

SharedObject类创建的本地共享对象(LSO:local shared object)类似于浏览器cookie,所以也被称作Flash Cookie。类似只是在作用上类似,都是用于将数据保存于客户端,可进行读写。

不同之处似乎更多:

  • 浏览器cookie具有过期时间,而Flash Cookie默认永不过期,尽管可以间接地实现expires
  • 浏览器cookie文件大小不能超过4k,且同一域最多只能保存20个cookie,而Flash Cookie默认大小为100k,如若不够还可以向用户请求获取更多空间存储Flash Cookie
  • 浏览器cookie保存的数据都以字符串形式保存,而Flash Cookie可保存除了AS中可视对象和SharedObject对象本身的任何数据类型
  • 浏览器cookie无法跨浏览器进行读写,而Flash Cookie却是跨浏览器的,任何浏览器访问的Flash Cookie都可以是同一个.sol文件
  • 浏览器cookie最初为服务器端编程而设计,而且作为HTTP协议的扩展可以自动地在web浏览器与服务器之间传递,而Flash Cookie默认不会在浏览器与服务器之间进行传递
  • 浏览器cookie默认域为创建cookie页面所在域,而Flash Cookie默认域为创建Flash Cookie的swf文件所在域,未必是当前页面所在域

静态getLocal()方法是LSO创建和打开以进行读取的机制。getLocal()方法会返回ShareObject实例,用以取代new运算符以实例化新LSO实例。调用getLocal()方法时至少需要为其传入一个参数,即是LSO的名称;第二个参数是为LSO指定存储路径便于其他swf共享该LSO数据,默认保存路径为创建LSO的swf文件所在唯一域、路径和文件名组成;第三个参数用以确定对此共享对象的访问是否只限于通过HTTPS连接传递的swf文件,默认false。如:var user:SharedObject = SharedObject.getLocal(‘user’,'/’);

LSO通过其一个特殊的内建属性data来存储所有数据,如:user.data.name = ‘xxxx’;

在Flash Player卸载时、SharedObject实例被当成垃圾回收时、当调用SharedObject.clear()方法时,LSO数据都会自动保存至本地磁盘。但是这些方法都不值得信赖,推荐的方式是使用SharedObject.flush()方法来对LSO数据进行存储。flush()方法有一个可选参数,指定写入数据时应该使用的最小磁盘空间量,默认值为0,表示只使用所需的最小空间。

调用flush()方法返回以下三种结果:

  1. Error 用户拒绝保存该域的LSO数据,或者Flash Player由于某种原因不能保存数据都会抛出Error
  2. SharedObjectFlushStatus.FLUSHED 数据成功保存
  3. SharedObjectFlushStatus.PENDING 没有分配足够的磁盘空间来保存LSO数据。

LSO数据的读取与写入一样简单,只需将共享对象的data属性内的对应属性读取出来即可,如:var name:String = user.data.name;

而删除LSO对象中的数据则需要使用delete运算符,如:delete user.data.name;如需要删除整个LSO对象,调用clear()方法即可:user.clear();

以下代码定义了三个函数setCookie、getCookie、delCookie用以创建/修改、获取、删除LSO数据:

//LSO/FlashCookie wondger@gmail.com
import flash.events.NetStatusEvent;
function setCookie(lsoname:String,cname:String,cvalue:*,path:String=null):Boolean{
	var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	lso.data[cname] = cvalue;
	try{
		var flushResult:String = lso.flush();
		if(flushResult == SharedObjectFlushStatus.FLUSHED) return true; //数据保存成功
		else if(flushResult == SharedObjectFlushStatus.PENDING) lso.addEventListener(NetStatusEvent.NET_STATUS,onStatus); //空间不够时
	}catch(e:Error){
		Security.showSettings(SecurityPanel.LOCAL_STORAGE); //用户禁止保存数据,打开Player的“settings”对话框
	}
	function onStatus(evt:NetStatusEvent):Boolean{
		lso.removeEventListener(NetStatusEvent.NET_STATUS,onStatus);
		if(evt.info.code == 'SharedObject.Flush.Success') return setCookie(lsoname,cname,cvalue); //用户同意允许请求更多的空间
		return false;
	}
	return false;
}
function getCookie(lsoname:String,cname:String,path:String=null):*{
	var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	return lso.data[cname];
}
function delCookie(lsoname:String,cname:String=null,path:String=null):Boolean{
	var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	if(lso){
		if(cname && cname != null){
			delete lso.data[cname];
			lso.flush();
		}else lso.clear();
		return true;
	}
	return false;
}

当然还可以使用JavaScript进行一定的封装方便跨浏览器操作(对检测flash加载完成addCallback注册函数可用一直纠结了很久,没有找到太满意的方法,现在这个将就用):demo

———————————————

update 2011/7/27

补充下,上面提到的间接地实现expires

文章写了很久也忘记了,我想可以这样,每次写cookie的时候,将expires作为一个数据字段保存,即user.data.expires = ****,每次读取cookie的时候,都将此expires读取出来与当前时间比较即可。