一般情况下,服务器都不会限制搜索引擎的爬虫的抓取,因此,常常会有一些采集者会通过伪装 UserAgent 的方法伪装成搜索引擎爬虫来采集网站信息,而这种伪装的爬虫会记录在日志上,如果不去除这些伪搜索引擎爬虫,将会对搜索引擎爬虫日志的分析结果造成影响,从而影响 SEO * 的判断。
那么,问题来了!,应该怎么判断搜索引擎爬虫真伪呢?
![][biaoqing]
答案就是!!!通过 IP 查询对应的 host主机名。真实的搜索引擎爬虫ip是有主机名的,而伪装的爬去却没有,通过这种办法来搜索引擎爬虫真伪。
在
python
的标准库 socket
里有个 socket.gethostbyaddr(ip_address)
的方法能为我们效劳,它返回由“主机名称,IP别名,IP地址”构成的元组,如果找不到主机,则抛出异常(如上图所示)。
通过接收异常,可实现批量检查 IP。完整代码如下:
# -- coding: utf-8 -*-
'''运行方法:python 输入的文件路径 输出的文件路径'''
import socket,sys,time
start = time.clock()
script,file,output = sys.argv
spiders = []
for x in open(file):
spiders.append(x.strip())
def check_spider(list_name):
spider_check_list = set(list_name)
print u'共 %s 个待检查 IP,耗时较长,请稍等片刻' % len(spider_check_list)
true_spider = []
fake_spider = []
for x,y in enumerate(spider_check_list):
try:
result = socket.gethostbyaddr(y)[2][0]
true_spider.append(result)
print u'第 %s 个 ip: %s 是真实的搜索引擎爬虫,添加到 true_spider 列表' % (x+1,y)
except socket.herror, e:
print u'第 %s 个 ip: %s 是伪装的搜索引擎爬虫' % (x+1,y)
fake_spider.append(y)
print u'共 %s 个真实的搜索引擎爬虫,共 %s 个伪装的搜索引擎爬虫' % (len(true_spider),len(fake_spider))
return true_spider
true_spider = check_spider(spiders)
txt = open(output,'w')
for x in true_spider:
txt.writelines(x+'\n')
txt.close()
print u'文件输出成功,耗时%s' % time.clock()-start
在 Windows PowerShell 下运行了一下,得出了结果:
有一个比较郁闷的地方就是,要花费 14 多分钟检查 275 个 IP ,这个检查的时间实!在!是!太!长!了!!!!,如果有更好的办法,请告诉我一下。
[biaoqing]:http://upload-images.jianshu.io/upload_images/1464422-0f4516be562daa1f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240