互联网民工
除了努力还有什么?

SEO高手是如何分析竞争对手的?

是的,今天要不要脸一次,自称SEO高手了。

通过采集站长工具关键词库及百度凤巢关键词规划师,我们可以得到一大批关键词。如何优化这些关键词呢?直接模(chao)仿(xi)SEO表现好的竞争对手是省时省力的做法。但如何正确地模仿竞争对手呢?万一模仿非人可就悲剧了。于是问题转化为找出SEO真正表现好的竞争对手。

通过搜索接个关键词能找到一些行业内排名靠前的网站,但因为样本偏小,很可能存在较大偏差。在某几个关键词排名表现好的网站,并不代表网站在整个行业内领先。因此需要扩大样本,并且最好能数据化。

比如,采集10000个关键词排名首页的着陆页并记录下域名,根据不同的排名位置赋予不同的得分,最后计算每个域名的总得分并从高到低排序。显然的,得分越高的网站,总体SEO表现越好。

等等,总得分高并不代表排名能力就越强,有可能网站排名能力稍弱,但整体覆盖的关键词更多导致总得分高。因此,仍需计算每个域名下有多少个关键词排名首页,再用总得分除以关键词排名个数的值代表网站排名能力。总得分越高,关键词排名多且排名能力强的网站越有参考价值。

显然的,人工搜索统计不太现实,这里使用scrapy爬虫框架和数据分析利器pandas来实现。scrapy负责抓取搜索结果,提取关键词,域名,着陆页及排名,pandas用来做统计计算。以移动端为例,毕竟现在流量都在移动端了。

需安装scrapy,pandas,pyquery等程序包,示例代码如下:

spider文件

  1. import scrapy,urllib,re,time,json
  2. from mobilerank.items import MobilerankItem
  3. from pyquery import PyQuery as pq

  4. def search(req,html):
  5. text = re.search(req,html)
  6. data = text.group(1) if text else 404
  7. return data

  8. try:
  9. finish = [line.rstrip() for line in open('finished.txt')]
  10. except:
  11. finish = []

  12. allurls = ['https://m.baidu.com/s?word=%s&' % urllib.parse.quote(kw.rstrip()) for kw in open('keywords.txt',encoding='utf-8-sig')]
  13. not_grap = [url for url in allurls if url not in finish] #断点后,获取未抓取的链接
  14. print(len(not_grap))

  15. class seoSpider(scrapy.spiders.Spider):
  16. name = "mobilerank"
  17. start_urls = not_grap
  18. def parse(self, response):
  19. link = response.url
  20. if link not in finish:
  21. with open('finished.txt','a+') as f:
  22. f.write(link +'\n')
  23. html = response.text
  24. doc = pq(html)
  25. divs = doc('.result').items()
  26. for div in divs:
  27. item = MobilerankItem()
  28. m = search('word=(.*?)&', link)
  29. if m != 404:
  30. kw = urllib.parse.unquote(m)
  31. else:
  32. kw = 404
  33. datalog = div.attr('data-log')
  34. if datalog:
  35. datalog = datalog.replace('\'', '"')
  36. data = json.loads(datalog)
  37. url = data.get('mu', '404.html')
  38. rank = int(data['order'])
  39. item['kw'] = kw
  40. item['domain'] = urllib.parse.urlparse(url).netloc
  41. item['url'] = url
  42. item['rank'] = rank
  43. yield item

settings.py文件

  1. # -*- coding: utf-8 -*-
  2. BOT_NAME = 'mobilerank'
  3. SPIDER_MODULES = ['mobilerank.spiders']
  4. NEWSPIDER_MODULE = 'mobilerank.spiders'
  5. USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53'
  6. CONCURRENT_REQUESTS = 64
  7. FEED_EXPORT_FIELDS = ['kw','domain','url','rank']
  8. FEED_EXPORT_ENCODING = 'utf-8'

items.py文件

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. class MobilerankItem(scrapy.Item):
  4. # define the fields for your item here like:
  5. # name = scrapy.Field()
  6. kw = scrapy.Field()
  7. domain = scrapy.Field()
  8. url = scrapy.Field()
  9. rank = scrapy.Field()
  10. pass

run.py文件

  1. # -*- coding: utf-8 -*-
  2. from subprocess import Popen
  3. import time,datetime,re
  4. print(datetime.datetime.now())
  5. start = time.time()
  6. spider = Popen("scrapy crawl mobilerank -o new_ranks.csv") #调用命令行执行蜘蛛程序
  7. spider.wait() #等待Spider程序进程结束,才运行下边的代码
  8. print('开始数据处理')
  9. rank_values = [2.856,1.923,1.020,0.814,0.750,0.572,0.401,0.441,0.553,0.670]
  10. def num(pos):
  11. value = rank_values[int(pos) - 1]
  12. return value
  13. import pandas as pd
  14. df = pd.read_csv('new_ranks.csv',encoding='utf-8',error_bad_lines=False)
  15. df = df[df['rank'] < 11].drop('kw',1)
  16. df['分值'] = df['rank'].apply(num)
  17. df['个数'] = 1
  18. datas = df.groupby([df['domain']]).agg({'分值':sum,'个数':sum}).sort_values(by="分值" , ascending=False)
  19. datas['排名能力'] = datas['分值']/ datas['个数']
  20. datas['排名能力'] = datas['排名能力'].apply(lambda x: format(x, '.2f')).astype(float) #保留两位小数
  21. print(datas.reset_index().head(60))
  22. datas.to_excel('排名能力分析.xlsx')

将关键词保存在keywords.txt文件中,一行一个。然后运行run.py文件。程序运行完毕会将最终结果保存在Excel文件中,如下图所示。各个竞争对手情况一目了然。

赞(0)
未经允许不得转载:⎛⎝啸月SEO⎠⎞ » SEO高手是如何分析竞争对手的?
分享到: 更多 (0)

互联网民工,除了努力还有什么?

联系我们联系我们