一 : 全自动监控网站关键词排名(Python实现)
从这篇文章开始不打算再花费大量精力去写程序本身的知识,毕竟是各类书籍上有的内容。其余主要需要学习的是内置函数的使用,和一些模块的使用方式,尤其是pycurl, re, threading这些需要慢慢熟悉起来。
若在学习中有不解的地方,在文章评论中可以提出,如果有空会尽力帮忙解答。
程序需求
对于稍大的一个网站,往往会有许多关键词需要每隔一个周期监控它们的排名,以分析SEO效果的好坏,及判断百度Google的动向等等。
有一个关键在于数据的收集全自动与否的问题。若经常用Google Analytics分析数据的话应该会感觉到,数据分析的需求是多种多样的,只有事先已经有了完善的各个维度的数据以后,才能随着最初的想法进行分析,而不会为数据的匮乏所局限。像Google Analytics这样出色的工具完全自动的将这些数据收集了起来,才给SEO对于流量的多样化分析打下了基础。同样的,如果想分析的时候更自由的话,就需要记录尽多种类的历史数据,如果这些作为每日工作,那将耗时非常长,所以自动化的收集就体现出了其重要性。
现有的监控排名主要解决方案是使用商业软件Rank Tracker,但它也有些不是很理想的地方。比如对于几乎所有既有软件都存在的问题,功能不灵活。另外它最大的弊端之一在于它一定要找个具有图形界面的系统运行(因为它是Java实现的,有多操作系统版本,所以不一定是Windows)。
对于DIY的Python脚本,在Linux系统里面可以将其放到crontab中(系统级计划任务),全自动的定时运行收集原始数据。然后在需要的时候,再用另外的脚本来处理原始数据,进行各个维度的分析。所需的一般情况下为:Linux系统的低配置VPS一台,总共不超过100行的Python代码(Windows也能实现这些,但相对比较麻烦)。
然后再来分析更具体的需求。此处我总结了一些原则:
1. 除非数据量大到会对硬盘带来压力(比如每日数G的日志的分析等),不然把能想到的尽多的数据都记录下来。因为分析的需求是多变的,数据若全面即可有备无患。
2. 同上,除非数据量极大,不然务必把历史数据全部保存下来。在大数据量的时候,也需要按实际情况保存一定时间区间的数据(打个比方,前3年每月保存一副本,当年每周保存一副本)。历史数据的对比在很多时候的意义非常大。
3. 当数据非常单一的时候,使用txt按行保存;当数据比较简单的时候,使用csv按行列储存;当数据比较复杂的时候,可以考虑使用MongoDB等key-value型NoSQL储存;再复杂的时候,使用MySQL之类的关系性数据库储存。但这些不是绝对的,还是要看实际情况而定。
对于目前的需求,因为是要监控关键词排名趋势,所以一般最多监控几千个关键词就够了。或许网站比较大,想了解数十万的关键词的排名,但对于了解排名趋势的情况下,没必要全部查询,随机选取其中一小部分作为样本就可以了。
因为最多几千个关键词,所以最好每天记录一次它们的排名数据(保证稳定的情况下,对于单IP,Google每天可以查询5000+词,百度则可以查询数万的词)。而且数据本身,主要为关键词、排名、着陆页URL这几项,文件体积很小,所以每天都保存一份数据。
数据的储存方式上,此时一般建议选择csv。它和Excel表格(xls)在数据的储存方式上是一模一样的。
代码实现
这些代码需要以下运行环境:
Linux操作系统
Python的第三方模块pycurl
Python下载网页的最简单方式是:
import urllib2
print urllib2.urlopen('http://***.com/').read()
但urllib2模块本身功能虽然还行,却仍离pycurl模块有较大距离。且在做稍微复杂一些的操作时,pycurl模块使用起来比urllib2模块方便很多。pycurl是必须要熟练运用的模块之一,但也因为它上手可能会让人有点头疼,这里我自己写了一个模块,以此即可方便的使用它:
from pycurl import *
import StringIO, time, random
def curl(url, retry=False, delay=1, **kwargs):
'''Basic usage: curl('http://www.xxx.com/'), will download the url.
If set `retry` to True, when network error, it will retry automatically.
`delay` set the seconds to delay between every retry.
**kwargs can be curl params. For example:
curl(url, FOLLOWLOCATION=False, USERAGENT='Firefox')
'''
useragent_list = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)',
'Opera/9.20 (Windows NT 6.0; U; en)',
'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1; .NET CLR 1.1.4322)',
'Opera/9.00 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.0',
'Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1',
]
size = len(useragent_list)
useragent = useragent_list[random.randint(0, size-1)]
s = StringIO.StringIO()
c = Curl()
c.setopt(NOSIGNAL, True)
c.setopt(FOLLOWLOCATION, True)
c.setopt(MAXREDIRS, 5)
c.setopt(TIMEOUT, 120)
for key in kwargs:
c.setopt(locals()[key], kwargs[key])
c.setopt(URL, url)
c.setopt(WRITEFUNCTION, s.write)
if ‘USERAGENT’ not in kwargs:
c.setopt(USERAGENT, useragent)
if ‘REFERER’ not in kwargs:
c.setopt(REFERER, url)
while 1:
try:
c.perform()
break
except:
if retry:
time.sleep(delay)
else:
return False
return s.getvalue()
对于简单的采集里面需要用到的下载功能,已经被整合在了这个模块之中。如User-agent轮换、自动301/302跳转等、使用当前URL作为REFERER的有些取巧的方法等。这个模块的代码可以日后再慢慢理解,现在只要知道它的用法即可。
首先到放置Python脚本的目录,将前面一段代码保存为curl.py,然后在同一目录下创建一个新文件,输入以下测试代码:
# -*- coding:utf-8 -*-
import curl
print curl.curl('http://g.cn/') #这样即下载了一个网页
#以下是比较保险的下载方式,因为各种原因,就算总体很稳定的网站也偶尔会出现网页暂时无法打开的情况
#当网页下载出错时,如果retry为True,则会不断重试,直到下载完网页
#delay则指定了几次重试之间的时间间隔,以秒为单位
print curl.curl('http://g.cn/', retry=True, delay=1)
#以下用到了一些Curl的参数,详细说明可见:
print curl.curl('http://g.cn/', FOLLOWLOCATION=False, COOKIE='mycookie')#p#副标题#e#
这个模块会在以后几乎每个脚本里面都用到,所以这些基础用法务必牢记。接下来是监控网站关键词排名的正式代码:
cron.py
# -*- coding:utf-8 -*-
#加载模块,此处大致按功能划分行,是为了能够更方便理解代码
import sys, os, random, time, datetime
import urllib, re
import curl
#sys.argv是系统参数,1:3切片意味着读取参数2,3,分别赋值给两个变量
site, file_keyword = sys.argv[1:3]
keywords = [] #先将keywords声明初始为列表型变量
#迭代文件,每次读取一行文字
for line in open(file_keyword):
line = line.rstrip() #将行尾的空白字符去掉,一般行尾会有换行符等
if line:#判断该行是否是空白行,也可更标准的写作if len(line)!=0:
keywords.append(line) #将读取到的文字加入到keywords列表中
#获取UTC时间,之所以使用UTC时间是为了避免时区问题带来的未知麻烦
#北京时间是UTC+8,如该日UTC时间01:00相当于北京时间09:00
now = datetime.datetime.utcnow()
#将UTC时间格式化,变成如1970-01-01的格式
date = datetime.datetime.strftime(now, '%Y-%m-%d')
#尝试创建文件夹,如果文件夹已创建则跳过
try:
os.mkdir('/home/rank/')
except:
pass
#打开输出数据的文件,以当日的日期命名它
f = open('/home/rank/%s.csv' % date, 'w')
for keyword in keywords:
#因为关键词可能是非ASCII字符集的,所以需要编码
encoded_keyword = urllib.quote_plus(keyword)
#下载SERP并提取链接
url = 'http://www.baidu.com/s?wd=%s&rn=100' % encoded_keyword
#下载SERP,如果出现验证码即延时10分钟并重试
while 1:
html = curl.curl(url, retry=True, delay=60)
if '<img src="http://verify.baidu.com/cgi-bin/' in html:
except:
f.write('%st%dt%sn' % (keyword, -1, '-'))
continue
#如果在前100名找到网站,则find=True
find = False
#在SERP上面的URL中,寻找网站并确定排名
for pos, url in enumerate(urls, 1):
if site in url:
f.write('%st%dt%sn' % (keyword, pos, url))
find = True
break
#如果前100名没有找到网站
if not find: #更标准的写法是if find==False:
f.write('%st%dt%sn' % (keyword, -1, '-'))
delay = random.randint(1,2) #随机设定延时时间为1秒或2秒
time.sleep(delay) #等待x秒以后继续查询下一个词的排名
这段代码即可监控排名并收集数据。它的使用命令如:python cron.py semwatch.org keywords.txt
在运行之前,先要把关键词按行分隔,保存成txt文件,并在运行参数中让脚本去读取它。每次运行之后,会在/home/rank/文件夹下,创建一个类似1970-01-01.csv这样文件名的文件,保存着当日的关键词排名情况。
为了让排名查询能自动化,可以将脚本设置为Linux的计划任务。在终端敲入:crontab -e,即可进入对于计划任务的编辑(它也使用一段脚本控制,而非Windows是图形界面)。为此必须要对VIM编辑器有最基础的了解,至少要能把字打上去并保存,可参考:http://ooxx.me/basic-vi.orz
在crontab输入并保存:00 05 * * * python cron.py semwatch.org keywords.txt
此处为了简化一些Linux的环境变量的问题,需要将cron.py, curl.py, keywords.txt三个文件,都放到~文件夹下。crontab的默认执行路径便是~。
前面一段命令的意思是在每日05:00自动执行脚本。当然需要计算机是处于开机的状态,也因此推荐使用一般不会关机的VPS来做这些监控类任务。此外需要注意的是系统的时间,VPS上面的时区可能和本地不同,可以在终端下使用date命令来确认。
至此日常排名数据的收集已经完成了,但光收集肯定不行,还需要分析。分析可以是各个角度的,这里以最常用的举例,分析网站关键词排名整体上升或下降的趋势。代码很简单:
analyse.py
# -*- coding:utf-8 -*-
import os
data = {}
for current in os.walk('/home/rank/'):
file_name = current[2][0]
date = file_name[:-4]
data[date] = 0
for line in open('/home/rank/%s' % file_name):
keyword, pos, url = line.rstrip().split('t')
pos = int(pos)
if pos!=-1:
data[date] += 100 - pos
for date in data:
print '%st%d' % (date, data[date])
以一个数值的形式来量化整体的排名,数值越高则代表整体排名越好。可以直接运行python analyse.py,看到分析结果。但是光这样的分析往往是不够的,因为数字不是很形象,一般生成图表会好得多。
尽管结合Google Chart Tools等API,可以自动生成图表,但多数情况下不推荐这么做,因为比较麻烦。除非这些数据需要面向他人,或是需要每天都去分析排名趋势数据。
一般来说可以这么做:python analyse.py > data.csv
这条命令结合了Linux里面的重定向>,此时程序不会再输出内容到屏幕上,而是写入到data.csv文件中。之后即可使用如LibreOffice Calc(Linux下类似Excel的软件)打开它,生成Line Chart来以图形化的方式观察分析数据。
思路扩展
一般来说需求决定技术做法,但这里还是推荐初学者选下面的任意一个需求并实现它,不管目前是否有用。因为熟悉一门程序语言最好的方法是多写:
最简单的扩展,将收集脚本从面向百度的改为可用于Google的。
可以再写一个分析脚本,使用类似Google Analytics的高级细分的方式,做URL的筛选功能。目前监控的是整个网站的流量趋势,但在加入了筛选功能以后,可以统计诸如/article/和/photo/栏目不同的流量趋势;也可对于同类栏目进行划分,作为对于AB测试的效果追踪。
可以再改进收集脚本,辅以关键词的搜索量与对于特定排名位置的大致点击率,去估算网站所获得的SEO流量的话,可以更全面的了解其情况。
可以再大幅改进收集脚本,将SERP上面所有出现的网站的排名都进行统计,则可以完全把握竞争对手的动态。结合一些其它方面的监控以后,可以观察到竞争对手绝大多数站内对SEO有意义的修改,并及时跟进。(此时数据的储存方式最好用数据库来代替CSV,如使用MongoDB)
如果排名趋势追踪的需求非常重要的话,可以考虑做邮件每日报告及邮件预警之类功能。Python里面使用SMTP很容易,结合第三方邮箱的服务即可方便的发邮件。
技术扩展
文中涉及到了一些Python模块路径及Linux环境变量的问题,虽然一般情况下把文件都放在~文件夹下面是可以的,但毕竟这样子文件多了会很乱,可以去补充相关方面的知识。
文中提到了几个模块,比如os和datetime等。个人经验是其中os模块用得不多,偶尔需要用的时候可以百度一下寻找使用方法。而datetime平常用的不少,这些最好稍看下官方文档,对使用到的几个函数要了解:
pycurl模块的使用,除了程序范畴之外,它还考验对于Web的基础知识。比如REFERER等是什么含义一定要理解,参见HTTP头信息有关的知识点。
不管是否选择深入学习VIM编辑器,一定要牢记其打字和保存的方法,Linux里面很多东西只能靠它编辑。
虽然文章中未提到,但采集数据中经常会遇到文字编码问题。UTF-8, GB2312等之间大致有什么区别、Unicode又代表什么、Python里面怎么转换它们等,这些都需参考相关资料。
原文:http://semwatch.org/2012/04/monitoring-rank/
二 : 网站关键词摆放选址原则
绝大多数的网站和商业站点所寻求的一个共同点都是站点流量,每个网络编辑都知道最好的流量类型是自然的有机的搜索引擎流量,有两个重要的原因:(1) 目标点很明确。 (2) 免费的。三 : 网站关键词摆放的网页的5个地方
绝大多数的网站和商业站点所寻求的一个共同点都是站点流量,每个网络编辑都知道最好的流量类型是自然的有机的搜索引擎流量,有两个重要的原因: (1) 目标点很明确。 (2) 免费的。
绝大多数的网站和商业站点所寻求的一个共同点都是站点流量,每个网络编辑都知道最好的流量类型是自然的有机的搜索引擎流量,有两个重要的原因: (1) 目标点很明确。 (2) 免费的。1. 首先是Meta 标签
可能这个已经众所周知或你已经在使用,但是如何才是有效的使用呢? 在此我们说两点。一是title标签,另外就是描述标签,而关键词标签我们不做说明,因为现在搜索引擎已经不太重视这点,甚至有些争论认为它根本就没有任何作用,但是我们依然在使用它,因为它还有有其一定的优点的,并且使用此标签也没有什么坏处。 我们发现在“标题”和“描述” 这两个标签下使用相似的文本并将关键词放到这两个标签显眼的位置是很有效的(位于开头处并且多于一次),我们发现很多的站点在其title标签中使用 sitename.com, new page1,或者 welcome to my site 等,这些事实上起不到提升某些特定关键词排名的作用。 同样,也不要在这些标签下使用 “和” 或者“或” 之类的词。
2. 关于关键词需要说明的一些要点
搜索引擎在决定一个站点排名的时候会评估关键词的突出性,权重,关键词密度。以上的这些对于单个的页面,标题标签,标签描述都将单独的进行评估。 关键词突出性是指关键词距离页面起始处所隔的距离,关键词权重是指某个特定的关键词或句子在页面上面所出现频率,关键词密度是某个关键词在整个页面字符中所占的比率, 权重和密度都不宜太高,这样会被引擎认为有关键词堆砌之嫌,将可能受到搜索引擎的一些惩罚。 将导航链接(以及Java脚本)放在右边或者底部,而不要放到页面的左边。 搜 索引擎读取页面的时,它的顺序是从页面的左上端到右端的底部。 搜索引擎将会非常重视站点的前100词,你总不希望那个这些重要位置的词是导航链接或Java脚本吧,应该做的是将抬头标签及关键词放到页面起始处。 或者说,将导航链接或者Java脚本放到页面的右端或者底部,这样可以让搜索引擎可以更好的抓取文本,这样才将重要的位置做到了‘位’尽其用。
3. 在所有的图片上放置alt标签
对搜索引擎有一定了解的都知道搜索引擎是无法抓取任何的图片或者影像的。 使搜索引擎知道图片内容的唯一方式就是通过alt标签。 这也是另外一种放置更多的关键词到HTML当中,改善页面关键词权重,密度的方法。 Alt标签使用起来都比较简单,它们能够使你的站点关键词排名起到大为不同的作用。 一个简单的alt标签如下: alt=“put your keyword phrase here.” ,搜索引擎会也会单独的评估alt标签中的关键词的突出性,密度,权重,所以标签的优化也势在必行。
4. 页面底端也放置关键词
正如搜索引擎非常注重页面起始部分的文本,它对于页面结尾处也同样。 常规的观点是如果你的站点是关于某个主题,那么一些要点,关键字,应该出现在开头并贯穿于整个页面当中, 并且在结尾处也应该突出出来。 如果你将所有的导航链接和java script放置在页面底部,相应的关联页面文本也可以在HTML结束前就收尾。 一个将关键词放到页面底部的简单的方法就是将他们包含到版权信息当中。 举例,如果你有个一个宠物食物网站,你可以将与此相关的一些东西放在页面的最底部。 搜索引擎是不会惩罚使用这类技巧的网站的,它也没有必要这么做。
5. 链接的锚文本
锚文本是一个站点的真正的链接文本,它起着直接导向到另外站点的作用。 如果你的站点都是使用的诸如“网站优化” 类的关键词,那么搜索引擎将认为你的站点是关于网站优化的,当然有时候也可能回忽略这点,但是某个特定的关键词对于你的站点的关键词排名影响非常大, 锚文本应该最好定位为关键词, 最好不要使用“点击此处” 或者“某某网址” 这样的锚文本。 另外,如果你在使用交换链接这类方法,最好多使用不同的锚文本,如果搜索引擎发现所有的指向你站点的链接文本都一样的话,那么搜索引擎将可能将给予低的权重给这些链接,或者你的站点将有受到惩罚的潜在危险。 主要是因为搜索引擎一般对于自然生成链接给予高的权重,而对于互换链接方式则次之。使用不同的但是相关来你的锚文本,并使它们看上去很自然,可以较大程度影响目标关键词排名。
四 : 网站关键词有名次之后的营销战术
网站关键词有排名之后这是值得高兴的一件事情,但是有排名并不意味着网站有高额的收入,相反有很多辛辛苦苦将网站关键词做到首页的站长却没有获得丰富的盈利,这是什么原因导致的呢?我认为,这是因为有一部分站长会优化、会做网站,但是他不会对网站进行良好的营销,在这里我们也可以看出营销的重要性,下面我来分享一些网站关键词有排名之后的营销战术,希望能够帮助到一部分不懂得如何利用排名换取盈利的站长。61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1