今天为什么会投这篇稿,是感觉SEO这个行业现在大家很难像一些技术行业java、php等能够互相分享自己的研究成果或者说叫经验吧。可能是因为大家觉得别人会了,会影响到自己,但其实我个人觉得并不是这样,也希望这个圈子能够有一些改变(虽然我并不是只做SEO,但这块确实一直是兴趣之一)。
好了废话不多说,接下来就给大家分享下,针对网站,在搜索引擎抓取这个环节,我们通过蜘蛛日志的分析,能够得到怎样的优化思路!
首先,需要拿到一份搜索引擎的抓取日志,怎么拿就不说了,大家应该都会。拿到抓取日志后,我们主要从两个方面来进行分析:
一、搜索引擎在各个时间段的抓取频次;
二、搜索引擎对于网站各级目录的抓取频次。当然还有其他的维度也是需要注意分析观察的,比如抓取一次所需时间长短,只是这个在站长平台上也有比较好的显示出来了,故这里不做进一步分析了。
一、搜索引擎在各个时间段的抓取频次
针对搜索引擎抓取日志,首先我们需要把不同的搜索引擎分别单独提取出来,来进行逐个分析,以下以百度为例。
根据log文件中的‘Baiduspider’这个字段,我们利用python写一段简单的脚本即可把百度抓取日志部分抽离出来,代码如下:
with open (‘1.log’,mode=’r’,encoding=’utf-8′) as f:
f_list = f.readlines()
baidurizhitiqu = open(‘baidu.log’,mode=’w’,encoding=’utf-8′)
for baidurizhi in f_list:
baiduzhuaqu = baidurizhi.strip()
if ‘Baiduspider’ in baiduzhuaqu:
baidurizhitiqu.write(baiduzhuaqu + ‘\n’)
else:
pass
baidurizhitiqu.close()
这样我们就能拿到单独的百度蜘蛛抓取日志“baidu.log”了,接下来,还有一个重要的操作需要做,一般的日志文件中,抓取时间都是以这种形式来显示:[27/Apr/2021:14:08:34 +0800],
但我们需要的时间只是14:08:34这一块,所以我们需要把其他的地方去除掉,这个使用txt文档的替换操作即可(替换为空,实在不会操作也可以联系我),然后我们就可以得到单纯的蜘蛛抓取时间了。
这种时间形式,人是很好理解,一看就懂,但是程序或者代码很难比较啊,所以笔者想了下还是得转化成小数来比较,这里就是把‘:’全部替换成“.”,并且去掉最后的秒数只保留到分(足够分析用了,没必要分析到秒),最终得到这样的小数形式来代表抓取时间:14.08,即下午2点08分。蜘蛛日志也就变成下面的截图的形式:
接下来,我们只需要用python对日志文件进行一顿操作,即可得到我们想要的数据,代码如下:
dict_zhuaqutime = {
‘0-1′:’0’,
‘1-2′:’0’,
‘2-3′:’0’,
‘3-4′:’0’,
‘4-5′:’0’,
‘5-6′:’0’,
‘6-7′:’0’,
‘7-8′:’0’,
‘8-9′:’0’,
‘9-10′:’0’,
’10-11′:’0′,
’11-12′:’0′,
’12-13′:’0′,
’13-14′:’0′,
’14-15′:’0′,
’15-16′:’0′,
’16-17′:’0′,
’17-18′:’0′,
’18-19′:’0′,
’19-20′:’0′,
’20-21′:’0′,
’21-22′:’0′,
’22-23′:’0′,
’23-24′:’0′,
}
with open (‘baidu1.log’,mode=’r’,encoding=’utf-8′) as f:
for baidulog in f:
baidulog_list = baidulog.split()
time = float(baidulog_list[1])
if time >=0 and time <=1:
dict_zhuaqutime[‘0-1’] =int(dict_zhuaqutime[‘0-1’]) + 1
elif time >1 and time <=2:
dict_zhuaqutime[‘1-2’] =int(dict_zhuaqutime[‘1-2’]) + 1
elif time >2 and time <=3:
dict_zhuaqutime[‘2-3’] =int(dict_zhuaqutime[‘2-3’]) + 1
elif time >3 and time <=4:
dict_zhuaqutime[‘3-4’] =int(dict_zhuaqutime[‘3-4’]) + 1
elif time >4 and time <=5:
dict_zhuaqutime[‘4-5’] =int(dict_zhuaqutime[‘4-5’]) + 1
elif time >5 and time <=6:
dict_zhuaqutime[‘5-6’] =int(dict_zhuaqutime[‘5-6’]) + 1
elif time >6 and time <=7:
dict_zhuaqutime[‘6-7’] =int(dict_zhuaqutime[‘6-7’]) + 1
elif time >7 and time <=8:
dict_zhuaqutime[‘7-8’] =int(dict_zhuaqutime[‘7-8’]) + 1
elif time >8 and time <=9:
dict_zhuaqutime[‘8-9’] =int(dict_zhuaqutime[‘8-9’]) + 1
elif time >9 and time <=10:
dict_zhuaqutime[‘9-10’] =int(dict_zhuaqutime[‘9-10’]) + 1
elif time >10 and time <=11:
dict_zhuaqutime[’10-11′] =int(dict_zhuaqutime[’10-11′]) + 1
elif time >11 and time <=12:
dict_zhuaqutime[’11-12′] =int(dict_zhuaqutime[’11-12′]) + 1
elif time >12 and time <=13:
dict_zhuaqutime[’12-13′] =int(dict_zhuaqutime[’12-13′]) + 1
elif time >13 and time <=14:
dict_zhuaqutime[’13-14′] =int(dict_zhuaqutime[’13-14′]) + 1
elif time >14 and time <=15:
dict_zhuaqutime[’14-15′] =int(dict_zhuaqutime[’14-15′]) + 1
elif time >15 and time <=16:
dict_zhuaqutime[’15-16′] =int(dict_zhuaqutime[’15-16′]) + 1
elif time >16 and time <=17:
dict_zhuaqutime[’16-17′] =int(dict_zhuaqutime[’16-17′]) + 1
elif time >17 and time <=18:
dict_zhuaqutime[’17-18′] =int(dict_zhuaqutime[’17-18′]) + 1
elif time >18 and time <=19:
dict_zhuaqutime[’18-19′] =int(dict_zhuaqutime[’18-19′]) + 1
elif time >19 and time <=20:
dict_zhuaqutime[’19-20′] =int(dict_zhuaqutime[’19-20′]) + 1
elif time >20 and time <=21:
dict_zhuaqutime[’20-21′] =int(dict_zhuaqutime[’20-21′]) + 1
elif time >21 and time <=22:
dict_zhuaqutime[’21-22′] =int(dict_zhuaqutime[’21-22′]) + 1
elif time >22 and time <=23:
dict_zhuaqutime[’22-23′] =int(dict_zhuaqutime[’22-23′]) + 1
elif time >23 and time <=24:
dict_zhuaqutime[’23-24′] =int(dict_zhuaqutime[’23-24′]) + 1
for key in dict_zhuaqutime:
print(str(key)+’:’+str(dict_zhuaqutime[key]))
最终分析结果如下:
是不是还不够直观?Wps直接生成了柱形图就可以了,如下:
二、百度蜘蛛抓取网站各级目录情况
这个处理起来就不用像之前的时间段抓取频次那样了,写好python一顿撸,即可。代码如下:
import csv
# 新建蜘蛛字典
def make_spider(spider_name):
save_file = open(‘%s.csv’ % spider_name, ‘w’, encoding=’utf-8′) # w模式会将\n写入进去,结果文件中会自动多一行
csvwriter = csv.writer(save_file) # 将save_file写入到csvwriter中
spider_name = {}
spider_name[‘visits’] = 0
spider_name[‘visit_spiders’] = {}
spider_name[‘visit_pages’] = {}
spider_name[‘visit_dirs’] = {}
spider_name[‘visit_error’] = {}
return spider_name,csvwriter,save_file
# 日志处理函数。蜘蛛字典spider_dict,方便传入蜘蛛参数
def log_process(spider_dict):
spider_dict[‘visits’] += 1 # 百度蜘蛛访问次数+1
item = line.split() # split方法默认用空格来做切分
# 获取蜘蛛IP及其访问次数
spider = item[0] # 将蜘蛛IP提取出来
if spider_dict[‘visit_spiders’].get(spider):
spider_dict[‘visit_spiders’][spider] += 1 # 如果此IP在字典内,则对此蜘蛛访问次数值加1
else:
spider_dict[‘visit_spiders’][spider] = 1 # 如果IP不存在,则将此新IP创建到字典里
# 获取蜘蛛访问url及其次数
url = item[4]
if spider_dict[‘visit_pages’].get(url): # 判断url是否在字典内
spider_dict[‘visit_pages’][url] += 1
else:
spider_dict[‘visit_pages’][url] = 1
# 获取蜘蛛访问目录及其次数
if url == ‘/’: # 判断url是否为根目录
dirname = ‘/’
elif url.count(‘/’) >= 2: # 判断url是否有二级目录
# 获取所有目录
dirname = ‘/%s/’ % ‘/’.join(url.split(‘/’)[1: -1])
# 获取一级目录使用:’/%s/’ % url.split(‘/’)[1]
else:
dirname = ” # 空字符串为False
if dirname and spider_dict[‘visit_dirs’].get(dirname): # 同时满足目录存在和字典中有此目录
spider_dict[‘visit_dirs’][dirname] += 1
elif dirname:
spider_dict[‘visit_dirs’][dirname] = 1
# 获取蜘蛛访问状态及其次数
error_code = item[5]
if error_code == ‘404’:
if spider_dict[‘visit_error’].get(url):
spider_dict[‘visit_error’][url] += 1
else:
spider_dict[‘visit_error’][url] = 1
# 排序和保存文件函数
def count_and_save(spider_dict,writer):
# 对统计结果的字典进行排序
sort_spider = sorted(spider_dict[‘visit_spiders’].items(), key=lambda x: x[1], reverse=True) #变成数组了-list
sort_pages = sorted(spider_dict[‘visit_pages’].items(), key=lambda x: x[1], reverse=True)
sort_dirs = sorted(spider_dict[‘visit_dirs’].items(), key=lambda x: x[1], reverse=True)
sort_error = sorted(spider_dict[‘visit_error’].items(), key=lambda x: x[1], reverse=True)
# 将结果写入文件
fields = (‘总访问量’, ‘蜘蛛IP’, ‘IP访问次数’, ‘受访目录’,’目录受访次数’,
‘受访页面’, ‘页面访问次数’, ‘404页面’, ‘出错次数’)
writer.writerow(fields) # 将fields的每个元素作为每一列
row_list = [” for _ in range(9)] # 单独的下划线表示一个占位变量,不需要用到它
for page_item in sort_pages:
row_list[0] = spider_dict[‘visits’] if sort_pages.index(page_item) == 0 else ” # 如果下标为0则返回baidu[‘visits’],否则返回空
ss = sort_spider.pop(0) if sort_spider else ”
row_list[1] = ss[0] if ss else ”
row_list[2] = ss[1] if ss else ”
dd = sort_dirs.pop(0) if sort_dirs else ”
row_list[3] = dd[0] if dd else ”
row_list[4] = dd[1] if dd else ”
row_list[5] = page_item[0]
row_list[6] = page_item[1]
ee = sort_error.pop(0) if sort_error else ”
row_list[7] = ee[0] if ee else ”
row_list[8] = ee[1] if ee else ”
writer.writerow(row_list)
# 百度蜘蛛
baidu,baiducsv,baidufile = make_spider(‘baidu’)
# 搜狗蜘蛛
sogou,sogoucsv,sogoufile = make_spider(‘sogou’)
with open(‘1.log’) as logfile: # 用with方法打开文件可以不用手动关闭文件
print(‘开始分析日志’)
for line in logfile:
if ‘Baiduspider’ in line:
log_process(baidu)
elif ‘Sogou web spider’ in line:
log_process(sogou)
count_and_save(baidu,baiducsv)
count_and_save(sogou,sogoucsv)
baidufile.close() # 最后记得关闭文件
sogoufile.close()
print(‘日志分析结束’)
好的,分析出来百度蜘蛛抓取的目录层级情况如下:
饼状图化后统计如下:
最后来说说这些数据对于搜索引擎优化到底有什么指导性的作用:
1. 根据各时间段的抓取频次,分析出你的网站什么时间段,蜘蛛是来的最频繁的(当然这个也是可以培养的),你的网站在更新内容时就在这二个时间段内更新,被抓取到机会也就意味着更大,收录的机会也更大
2. 针对各级网站目录抓取频次,首先我们应该对自己的网站目录了如指掌,比如你需要参与排名和质量度最高的页面肯定是蜘蛛抓取的最频繁的,而你还没有完善页面质量较低或者不需要参与排名的页面,肯定是希望他来抓取的越少越少,这里就要配合robots.txt以及nofollow来进行处理了,合理分配有限的抓取频次,让你高质量页面更多抓取、收录、排名。
当然,以上的应用并不是全部,感觉写的内容有点多了,总之有相关的不清楚的地方都可以与我进行交流,代码的一些问题也可以,这次就分享到这里了。有机会松松博客再见!
作者:很冒险的梦 微信:863025502