中小型网站日志分析深入浅出之SEO实战

这篇博客里面的内容全部吸收的话,日志分析这一块就能按照你能想到的维度来分析了。当然任何好事都需要付出才能得到,想要吸收所有内容,必须学习shell这门脚本语言的一小部分命令符的使用,当然学一门语言的一小部分内容是个很简单的事情哈。市面上那些的日志分析工具都是个摆设,包括光年的那个。我们可以按照各种我们想到的维度对数据进行拆分组合。得出我们想要的结果,并不止在SEO领域,其他在运营等各个领域都有用处。

1、在Windows下的用户要使用shell命令符的话请先安装cygwin,安装方法:Cygwin安装详解,快速安装所有插件,无需联网

2、下面笔者粗略介绍下SEO日志分析常用的命令符用法,需要详细了解每个命令符请使用Google

  • less  log.log   查看文件内容  按“q” 退出
  • cat  log.log   打开文件,可以多次打开几个文件 |     cat 1.log 2.log   |cat *.cat
  • grep -参数  文件名
    1. -i 不区分大小写
    2. -v 显示不符合条件的所有行
    3. -c  显示符合条件的所有行数(符合条件的数量)
  • egrep 属于grep的升级版,在正则这一块的支持更完善,使用正则的时候建议使用egrep
  • head -2   显示2行
  • head -100  log.log  | tail -10 >>a.log   提取文件第91-100行数据
  • wc -参数   文件名      统计文本大小,字符多少,行数
    1. -c 统计文本字节数
    2. -m 统计文本字符数
    3. -l 统计文本有多少行
  • sort  – 参数 文件名      对文件进行排序
    1. -n 对文件按照数字排序
    2. -r 反向排序
  • uniq -参数      对文件去重,去重前需要使用排序sort
    1. -c  显示数据重复的次数
  • split  -参数  文件名       对文件进行切割
    1. -100   (每100行切割成一个文件)
    2. -C    25m/b/k   (每25兆/字节/K 分割成一个文件)
  • |    管道,把上一条命令的结果传输给下一条命令
  • “>” 和“>> ” 重定向写入文件中 “>”相当于“w”清空并写入   “>>”相当于“a” 追加进文件 
  • awk -F  Pattern {action}  文件名     使用指定的字符对每一行数据进行分段,默认是空格(网站日志就是空格分开)
    1. -F后面跟的是分隔符
    2. pattern 就是action执行的条件,这里可以使用正则表达式
    3. $n 即时第几段数据  $0表示整行数据
    4. NF表示当前记录的字段数
    5. $NF 表示最后一个字段
    6. BEGIN和END,这两者都可用于pattern中,提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作
    7. 案例:$ awk ‘{print $10}’ baidu.log |awk ‘BEGIN{total=0}{total+=$1}END{print total}’  计算baiduspider下载文件总大小
  • bash shell.sh   运行shell.sh脚本
  • nslookup ip   查询地址是否是百度蜘蛛
  • dos2unix   xxoo.sh 将“\r\n”转换成“\n”   Windows——>linux (由于Windows和Linux下的换行符不同,所以我们在Windows下面下的代码需要使用dos2unix 转换成Linux下的换行符,否则运行shell脚本会报错)
  • unix2dos    xxoo.sh 将“\n”转换成“\r\n”  linux——>Windows
  • rm xx.txt  删除xx.txt文件

3、一些简单的命令符介绍到这里,需要了解shell,建议大家查看相关的书籍,下面我们开始使用shell分析日志。

日志格式如下:

less baidu.log

1 中小型网站日志分析深入浅出之SEO实战

1、切割百度的抓取数据(将文件切割出来对专门的蜘蛛进行处理能提高效率)

cat log.log |grep -i ‘baiduspider’ >baidu.log

2、网站状态码个数查询(隐藏的是状态码个数)

awk ‘{print $9}’  baidu.log|sort|uniq -c|sort -nr

3、百度总抓取量 

wc -l baidu.log

4、百度不重复抓取量

awk ‘{print $7}’      baidu.log|sort|uniq|wc -l

5、百度平均每次抓取的数据大小(结果是KB)

awk ‘{print $10}’   baidu.log|awk ‘BEGIN{a=0}{a+=$1}END{ print a/NR/1024}’

6、首页抓取量

awk ‘$7~/\.com\/$/’   baidu.log|wc -l

7、某目录抓取量

grep   ‘/news/’   baidu.log|wc -l

8、抓取最多的10个页面

awk ‘{print $7}’ baidu.log|sort|uniq -c|sort -nr|head -10

9、找出抓取的404页面

awk ‘$9~ /^404$/ {print $7}’ baidu.log|sort|uniq|sort -nr

10、找出抓取了多少js文件和文件抓取的次数(可以看出百度基本不抓JS)

awk ‘$7~ /.js$/ {print $7}’ baidu.log|sort|uniq -c  |sort -nr

相信看到这里大家已经有了想试一把手的冲动了,只要你搞懂了上述的内容,上面的操作都可以轻而易举的完成,没有任何困难,还可以有更多的维度进行分析,不仅仅是SEO领域。只要你敢想,就能挖掘更多的数据出来(当然更复杂的纬度可能需要学习shell更多的内容哟,当然,以我的努力程度之低都能做到的事情,大家应该都不是问题)。

python利用jieba分词进行分词,去停止词(停用词)。

上一篇文章介绍了利用python进行SEO词库去重,去重后需要对现有的词库进行去停止词操作,这里我们主要利用到了jieba分词的搜索引擎模式cut_for_search() .

去停止词主要利用了停止词词库进行去重set(jiebas)-set(stopkey)

 Python |  copy code |? 
01
#coding:utf-8
02
import jieba,csv
03
fenci=open(r'fenci_ddc.csv','w')  #数据写入到fenci_key里
04
stopkey=[line.strip().decode('utf-8') for line in open('stopkey.txt').readlines()]  
05
	#读取停止词文件并保存到列表stopkey
06
key=csv.reader(file('key_ddc.csv','rb'))  #读取需要处理的词库:key_ddc.csv
07
list1=[]
08
i=0
09
 
10
for keys in key:
11
 
12
	if i==0:	
13
		i=1
14
		jiebas=jieba.cut_for_search(keys[0]) #jieba.cut_for_search() 结巴分词搜索引擎模式		
15
		fenci_key="/".join(list(set(jiebas)-set(stopkey))) #使用join链接字符串输出
16
		list1.append(fenci_key.strip())  #将数据添加到list1列表
17
		print u'程序处理中,请等待...'
18
	else:
19
		jiebas=jieba.cut_for_search(keys[0]) 
20
		fenci_key="/".join(list(set(jiebas)-set(stopkey))) 
21
		list1.append(fenci_key.strip()) 
22
 
23
zidian={}.fromkeys(list1).keys()    #字典去重的方法
24
 
25
for zd  in zidian:
26
	try:
27
		print zd
28
	except:
29
		pass
30
	fenci.writelines(zd.encode('utf-8'))      #需要转换成utf-8格式输出
31
	fenci.writelines('\n')
32
 
33
fenci.close()
34
 
35
 
36
 
37
 
38
 
39

python实现seo词库去重脚本—定制版

之前分享了一个python实现数据去重的脚本,对付一般的需求足以满足,但是针对seo词库的特殊去重,需要做些改变,原理都一样,使用字典键的唯一性来实现我们的目标。(针对同一个词库(600w行)使用这个脚本去重比之前的脚本多去掉了一万多行的重复数据),下面贴出代码

 Python |  copy code |? 
01
#coding:utf-8
02
#词库的数据格式为:
03
#关键字,日搜索量,月搜索量
04
#爱玛,2,4
05
#雅迪,2,5
06
#绿源,3,55
07
 
08
ciku=open(r'ciku1.csv','r')   #打开需要去重文件,可自行修改
09
xieru=open(r'ciku.csv','w')  #去重的文件保存到ciku.csv去,可自行修改
10
cikus=ciku.readlines()
11
zidian={}   #创建个空字典
12
for x in cikus:
13
	try:
14
		x=x.split(',')    #sqlit 切割,通过字符串‘,’切割。
15
		x1=x[0]
16
		leng=len(x)      
17
		if leng==3:		#判断列表长度是否是3,不是3证明词库数据有一定的问题,舍弃,预防报错。
18
			x2=x[1]+','+x[2]
19
			zidian1={x1:x2}        #关键字为键,后面的为值
20
			zidian.update(zidian1)   #update添加到字典,类似列表的append的用法,向zidian里面添加zidian1
21
	except ValueError :
22
		pass
23
for key in zidian.keys():
24
	ci=key+','+zidian[key]
25
	try:
26
		print ci[0:-1].decode('utf-8').encode('gbk')
27
	except ValueError:
28
		pass
29
	xieru.writelines(ci)
30
ciku.close()
31
xieru.close()
32

使用python实现文件去重(一般性的文本处理)

在实际工作中经常会遇到很多重复的信息,需要我们做去重复处理,今天下午写了个python的脚本实现文件去重功能,这个脚本能够满足大部分非特定的需求,但是针对seo词库仍然无法满足需求,分享给大家(针对seo词库的去重请查看python实现seo词库去重脚本—定制版处理数据的速度一般,可以接受,测试了下,上个厕所的时间处理了600万行数据。

 Python |  copy code |? 
01
#coding:utf-8
02
ciku=open(r'all.csv','r')   #打开需要去重文件
03
xieci=open(r'quchong.csv','w')   #打开处理后存放的文件
04
cikus=ciku.readlines() 
05
list2 = {}.fromkeys(cikus).keys()     #列表去重方法,将列表数据当作字典的键写入字典,依据字典键不可重复的特性去重
06
i=1
07
for line in list2:
08
	if line[0]!=',':
09
		# print line[0:-1].decode('utf-8').encode('gbk')   #数据量太多,会出现编码报错。蛋疼
10
		print  u"写入第:"+`i`+u" 个"
11
		i+=1
12
		xieci.writelines(line)
13
xieci.close()