发现更大的SEO世界
 找回密码
 注册
搜索
»首页»SEO培训 SEO论坛 SEO交流 帖子
12下一页
发新帖
思明,技术宅男SEO之路    QQ:176089710    

【python】挖出同行的网站,跟踪同行网站

本帖最后由 思明 于 2014-6-2 10:49 编辑

有时候我们在做站的时候希望能够找出同行的网站做为参考,或者找出同行做得好的网站,也就是竞争对手的网站。

如果只是简单的人工百度,也能够查找出来一些,但是我们又如何能够确定,哪个网站做得好,哪个网站做得差呢?

我是这样子操作的:

比如我想做一个花卉苗木行业的网站,要找出做得好的竞争对手

第一步:通过百度关键词工具挖出花卉相关词汇

词的数量越多越好,根据行业的大小来定,花卉我挖了16000个。

相关词   搜索量

花卉图片大全 1812
斗南花卉拍卖中心 985
花卉 964
花卉养殖 810
花卉网 478
花卉市场 429
花卉图片 317
花卉大全 225
深圳花卉租摆 216
花卉种子 212

第二步:使用工具把这些词放到百度(英文用谷歌)中搜索

记录每个词第一页的网站,只需要提取主域名即可,然后根据名次赋于分值。这里我用python实现。以下代码供参考,不能够直接使用,因为用了Mongodb做为数据存储。

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. import time
  5. import datetime
  6. import re
  7. import traceback
  8. import StringIO
  9. import gzip
  10. import urllib
  11. import urllib2
  12. import cookielib
  13. import pymongo
  14. import hashlib
  15. from bs4 import BeautifulSoup
  16.  
  17. class collectProductByApi(object):
  18.     connection=None
  19.     db=None
  20.     cat='flower'
  21.     t=int(datetime.datetime.now().strftime('%Y%m%d'))
  22.     def getDb(self):
  23.         while (not self.db)  or (not self.db.is_mongos):
  24.             self.connection=pymongo.MongoClient("127.0.0.1:1111")
  25.             self.db=self.connection.monitor
  26.             if  (not self.db)  or (not self.db.is_mongos):
  27.                 print "cannot connection to MongoDB"
  28.                 time.sleep(10)
  29.         return self.db
  30.  
  31.     def main(self):
  32.  
  33.         obj=Tool()
  34.         while 1:
  35.             word=self.getDb().word.find_one({'cat':self.cat,'t':{'$lt':self.t}})
  36.             if word:
  37.                 result=obj.getBaiduSearch(word['w'])
  38.                 if len(result)==0:
  39.                     print word['w'].encode('gb2312','ignore'),0
  40.                 for domain in result:
  41.                     _analyse_id=self.cat+str(self.t)+domain['d']
  42.                     _analyse_id=hashlib.md5(_analyse_id.encode('utf8')).hexdigest()
  43.                     isExsit=self.getDb().analyse.find_one({'_id':_analyse_id})
  44.                     score=self.getScore(domain['i'])
  45.                     if not isExsit:
  46.                         doc={'_id':_analyse_id,'cat':self.cat,'domain':domain['d'],'score':score,'num':1,'t':self.t}
  47.                         self.getDb().analyse.insert(doc)
  48.                     else:
  49.                         self.getDb().analyse.update({'_id':_analyse_id},{'$inc':{'num':1,'score':score}})
  50.                     print word['w'].encode('gb2312','ignore'),domain['i'],domain['d']
  51.                 self.getDb().word.update({'_id':word['_id']},{'$set':{'t':self.t}})   
  52.             else:
  53.                 self.rank()
  54.                 print 'End'
  55.                 return
  56.             time.sleep(3)
  57.  
  58.     def getScore(self,index):
  59.         x=0
  60.         result = {
  61.           1: lambda x: 28.56,
  62.           2: lambda x: 19.23,
  63.           3: lambda x: 10.20,
  64.           4: lambda x: 8.14,
  65.           5: lambda x: 7.50,
  66.           6: lambda x: 5.72,
  67.           7: lambda x: 4.01,
  68.           8: lambda x: 4.41,
  69.           9: lambda x: 5.53,
  70.           10: lambda x: 6.70
  71.         }[index](x)
  72.         return result
  73.  
  74.     def rank(self):
  75.         analyse_rows=self.getDb().analyse.find({'cat':self.cat,'rank':None})
  76.         for row in analyse_rows:
  77.             rank=row['score']/row['num']
  78.             row['rank']=rank
  79.             self.getDb().analyse.save(row)
  80.             print self.cat,row['domain'],rank
  81.         print 'End Rank'
  82.  
  83. class Tool(object):
  84.  
  85.     def getBaiduSearch(self,word):
  86.         domains=[]
  87.         url= 'http://www.baidu.com/s?wd=%s' % urllib.quote_plus(word.encode('utf8'))
  88.         request = urllib2.Request(url)
  89.         request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101')
  90.         request.add_header('Referer',url)
  91.         request.add_header('Accept-Language','zh-CN,zh;q=0.8')
  92.         request.add_header('Accept-Encoding','gzip,deflate,sdch')
  93.         request.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.')
  94.         try:
  95.             response = urllib2.urlopen(request)
  96.             html = response.read()
  97.             compressedstream = StringIO.StringIO(html)
  98.             gzipper = gzip.GzipFile(fileobj=compressedstream)
  99.             data = gzipper.read()
  100.  
  101.             soup = BeautifulSoup(data)
  102.         except:
  103.             return domains
  104.         tables=soup.findAll('table',id=re.compile(r'^\d{1,2}
  105.         for table in tables:
  106.             index=table["id"]
  107.             index=int(index)
  108.             span=table.find('span',{'class':'g'})
  109.             if span:
  110.                 site=span.text
  111.                 site=re.search(r'([a-zA-Z0-9\.\-]+)',site)
  112.                 domain=site.groups(1)[0]
  113.                 domains.append({'d':domain,'w':word,'i':index})
  114.         return domains
  115.  
  116.  
  117. if __name__ == '__main__':
  118.     obj=collectProductByApi()
  119.     print obj.main()
复制代码


出来的结果
截图 - 2014年06月02日 - 10时48分15秒.png
说一下这些数值是怎么来的:

排名词个数代表在16000个词中,这个域名有多少个词在首页有排名。

排名总分就是这些词的排名得分总和,一个词排在第一页第一名,我就就给它加10分。

排名权值就是 总分 除于 词个数

到这里根据总分排一下序,然后去除一下百度之类的平台,人工筛选下,也就能大致确定出行业的主要竞争对手了。

这里的权值是一个很有意义的数据,长期跟踪一个网站的排名权值,可以知道网站有没有被降权之类的。

最后的结果:
截图 - 2014年06月02日 - 10时48分42秒.png

附分值表:

           google    baidu
Rank1: 34.35     28.56
Rank2: 16.96     19.23
Rank3: 11.42     10.20
Rank4: 7.73       8.14
Rank5: 6.19       7.50
Rank6: 5.05       5.72
Rank7: 4.02       4.01
Rank8: 3.47       4.41
Rank9: 2.85       5.53
Rank10: 2.71     6.70

欢迎拍砖。

评分

参与人数 15赞同 +64 收起 理由
微笑的鱼 + 4 很给力!
邻村小五 + 4 赞一个!
老狼 + 4
hwj888 + 4 很给力!
rousi + 4 很给力!
Eric + 4 很给力!
V96 + 4 不错,适用于多数站点
姜姜 + 4 很给力!
bingyan + 4 很给力!
jnjoyo + 4 赞一个!
gxl133133 + 4 很给力!
fred + 4 忍不住赞一个。
ZERO + 8
vic + 4 很给力!
莫山 + 4 很给力!

查看全部评分

发表于 2014-6-2 10:38:23
回复 收藏
杰哥,目标是做一个日IP50W+的优质网站。    

这种做法感觉作用有限,有点纯为技术而作技术的感觉。因为分析竞争对手网站的时候,分析的要素非常多,本身手工搜索也不费多少功夫,手工搜索后,作出的分析结论也因网站的不同而有所不同。
发表于 2014-6-2 11:08:16
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

很好的方法,可以很快的分析一个陌生行业做的好的一批网站,可以节约很多时间。收藏了。
发表于 2014-6-2 11:26:11
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

杰哥 发表于 2014-6-2 11:08
这种做法感觉作用有限,有点纯为技术而作技术的感觉。因为分析竞争对手网站的时候,分析的要素非常多,本身 ...

手工的结果还是比较扯的,太费时间,没有效率,结果还不一定可靠。
发表于 2014-6-2 11:27:19
回复 收藏
vic,请到个人资料页面设置个人签名    [ 版主 ]

可以拿来辅助分析一下竞争对手,很不错的代码 希望以后多分享一些
发表于 2014-6-2 16:22:14
回复 收藏
renmai,紧箍咒、乳房罩、八戒裤衩、避孕套    

值得参考 机器代替手工 数据更能清晰表达 目前也在向python靠拢
发表于 2014-6-2 17:08:59
回复 收藏
renmai,紧箍咒、乳房罩、八戒裤衩、避孕套    

楼主有时间可以分享一下采集百度关键词的py源码 给大家参考的话 会调动大家积极性的!!!
发表于 2014-6-2 17:12:30
回复 收藏
ZERO,SEO执着爱好者    

赞一个。这套方法也是我一贯用的思路,可以客观了解到行业SEO的真实竞争情况,而不是靠感觉。

实际上经常会出现知名站点的SEO表现不良好的情况,但很多人却老是将知名站点作为主要参考,不太合适。

顺带两个小建议:

1. 代码方面偏臃肿,尤其大段的代码贴在论坛让人有点没耐心去看。建议做个模块出来,将常用的下载网页等步骤单独放到模块中,主代码就可以显得清爽很多。

2. 比较根域名(eg. ganji.com)的排名情况,感觉大多数时候比对比子域名(eg. bj.ganji.com)的排名情况更有用。技术实现上,比较简单的提取方式是人工置顶些.com.cn之类的特例顶级域名,然后看情况用正则来提取根域名。
发表于 2014-6-2 17:51:23
回复 收藏
ZERO,SEO执着爱好者    

杰哥 发表于 2014-6-2 03:08
这种做法感觉作用有限,有点纯为技术而作技术的感觉。因为分析竞争对手网站的时候,分析的要素非常多,本身 ...

这种做法的关键在于,可以把排名情况真正优秀的网站客观体现出来。手工随便搜两个词,和实际情况往往差距极大。

最后的分析,自是人工去分析。
发表于 2014-6-2 17:52:53
回复 收藏
c0901yuan,一直喜欢 用c0901yuan  做网名。    

本想将此帖  做为单帖发送  但 论坛 不知何故 一直发不了。 现将其发于此于

用火车头挖行业内网站

看到 【python】挖出同行的网站,跟踪同行 这个帖子里  想起之前在别处看到的  (如何挖掘有效的外推资源 火车头教程)  突然发现后者也可用于 挖出行业内网站    且对于非技术帝 还是很有用的。随之将其改名 发于此处 并留下链接。
原文链接:http://bbs.wxker.com/thread-258-1-1.html

具体实现 过程如下(发不了图片  不知是何原因。具体操作方法  想看的还是去原帖看吧)

1.整理关键词


2.打开火车头批量导入整理好的网址


3.百度搜索结果代码规律分析



4.循环规则建立




5.导出采集结果



6.利用excl公式分析数据    =countif(A:A,A1)   统计A列相同个数
发表于 2014-6-2 23:19:17
回复 收藏
sasawawa,请到个人资料页面设置个人签名    

太偏向技术了。
发表于 2014-6-3 09:26:21
回复 收藏
xfxdtt,不变初心。。    

思路是很好的。。可以把行业站基本收集齐,并且做出大致的流量估算。
发表于 2014-6-3 10:04:17
回复 收藏
ZERO,SEO执着爱好者    

c0901yuan 发表于 2014-6-2 15:19
本想将此帖  做为单帖发送  但 论坛 不知何故 一直发不了。 现将其发于此于

用火车头挖行业内网站

麻烦提供一下不能发帖与不能发图片的具体情况,诸如是点击按钮没有反应,还是其它情况。

这样方便排查问题,尽量避免后续发帖不变的情况。
发表于 2014-6-3 10:08:35
回复 收藏
c0901yuan,一直喜欢 用c0901yuan  做网名。    

ZERO 发表于 2014-6-3 10:08
麻烦提供一下不能发帖与不能发图片的具体情况,诸如是点击按钮没有反应,还是其它情况。

这样方便排查问 ...

图片 传不上     发贴子页面  加载不完全。。估计是我网速的原因
发表于 2014-6-3 10:43:19
回复 收藏
姜姜,个人比较闲,学习python中    

恩,很不错,这样可以提取优秀的网站,我这边在想些一个提取前10 网站各项外部数据的对比,毕竟其网站内部的数据较难获取
发表于 2014-6-3 17:47:16
回复 收藏
12下一页
快速回复 返回顶部 返回列表