SEO人员都希望有一个排名监控系统,因为有时流量升降莫名其妙不好分析原因,此时一个排名监控体系可以帮助大家分析数据。今天这个排名监控的实现是这样的:
一:选一个行业,
二:指定该行业几种类型的词(关键词文件kwd.xlsx。每个sheet的名字代表这类词的类别,每个sheet第一列放该类词),
三:指定几个域名。(自己的站和竞品网站)。
最后:结果是txt文件,记录当天日期下每个域名每类词首页词数量。
手动:人工将结果累计在一个excel中,通过数据透视表+折线图功能来分析每个域名这几类词排名在首页的数量的变化!如下图:
实现的代码如下
# ‐*‐ coding: utf‐8 ‐*‐ # 事先准备excel文件,每个sheet存储一类关键词,sheet名字即关键词分类 from openpyxl import load_workbook import requests from pyquery import PyQuery as pq import threading import queue import time import gc class bdpcMonitor(threading.Thread): def __init__(self): threading.Thread.__init__(self) # 读取excel文件 做好关键词分类 @staticmethod def read_excel(filepath): q = queue.Queue() group_list = [] wb_kwd = load_workbook(filepath) for sheet_obj in wb_kwd: sheet_name = sheet_obj.title group_list.append(sheet_name) col_a = sheet_obj['A'] for cell in col_a: kwd = (cell.value) q.put({kwd:sheet_name}) return q,group_list # 初始化结果字典 @staticmethod def result_init(group_list): for domain in target_domain: result[domain] = {} for group in group_list: result[domain][group] = 0 print("初始化结果字典成功") # 获取某词serp源码 def get_html(self,url,retry=2): try: r = requests.get(url=url,headers=user_agent,timeout=5) except Exception as e: print('获取源码失败',url,e) if retry > 0: self.get_html(url,retry-1) else: html = r.content.decode('utf-8') # 直接 r.text有时识别错误 return html # 获取某词serp源码上自然排名的所有url def get_encrpt_urls(self,html): encrypt_url_list = [] if html and '_百度搜索' in html: doc = pq(html) try: a_list = doc('.t a').items() except Exception as e: print('未提取到serp上的解密url', e) else: for a in a_list: encrypt_url = a.attr('href') if encrypt_url.find('http://www.baidu.com/link?url=') == 0: encrypt_url_list.append(encrypt_url) return encrypt_url_list # 解密某条加密url def decrypt_url(self,encrypt_url,retry=1): try: encrypt_url = encrypt_url.replace('http://','https://') r = requests.head(encrypt_url,headers=user_agent) except Exception as e: print(encrypt_url,'解密失败',e) if retry > 0: self.decrypt_url(encrypt_url,retry-1) else: return r.headers['Location'] # 获取某词serp源码首页排名真实url def get_real_urls(self,encrypt_url_list): if encrypt_url_list: real_url_list = [self.decrypt_url(encrypt_url) for encrypt_url in encrypt_url_list] return real_url_list else: return [] # 统计每个域名排名的词数 def run(self): global success_num while 1: kwd_dict = q.get() try: for kwd,group in kwd_dict.items(): url = "https://www.baidu.com/s?ie=utf-8&wd={0}".format(kwd) html = self.get_html(url) encrypt_url_list = self.get_encrpt_urls(html) real_urls = self.get_real_urls(encrypt_url_list) if real_urls: # 可能有解密失败返回None的情况 干掉None 防止列表转字符串出错 set_real_urls = set(real_urls) real_urls = [i for i in set_real_urls] real_urls.remove(None) if None in real_urls else real_urls # 将某词的serp上10条真实url合并为一个字符串 domain_str = ''.join(real_urls) try: threadLock.acquire() success_num += 1 for domain in target_domain: if domain in domain_str: result[domain][group] += 1 print('查询成功{0}个'.format(success_num)) finally: threadLock.release() del kwd del group gc.collect() except Exception as e: print(e) finally: q.task_done() # 保存数据 @staticmethod def save(): print(result) print ('开始save.....') with open('result.txt','w',encoding="utf-8") as f: for domain,data_dict in result.items(): for key,value in data_dict.items(): f.write(date+' '+domain+ ' '+key+' '+str(value)+' ') if __name__ == "__main__": start = time.time() # 全局变量 待监控域名列表 target_domain = ['www.renrenche.com','www.guazi.com','www.che168.com', 'www.iautos.cn','so.iautos.cn','www.hx2car.com','58.com', 'taoche.com','www.51auto.com','www.xin.com'] user_agent = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} threadLock = threading.Lock() # 锁 result = {} # 结果保存字典 success_num = 0 # 查询成功个数 date = time.strftime("%Y-%m-%d", time.localtime()) # 查询日期 q,group_list = bdpcMonitor.read_excel('kwd.xlsx') bdpcMonitor.result_init(group_list) all_num = q.qsize() # 设置线程数 for i in list(range(6)): t = bdpcMonitor() t.setDaemon(True) t.start() q.join() bdpcMonitor.save() end = time.time() print('关键词共{0}个,查询成功{1}个,耗时{2}min'.format(all_num,success_num,(end-start)/60) )
2019-07-13 www.renrenche.com 城市站 182 2019-07-13 www.renrenche.com 买车列表 91 2019-07-13 www.renrenche.com 品牌 8902 2019-07-13 www.guazi.com 城市站 86 2019-07-13 www.guazi.com 买车列表 16 2019-07-13 www.guazi.com 品牌 19828 2019-07-13 www.che168.com 城市站 324 2019-07-13 www.che168.com 买车列表 206 2019-07-13 www.che168.com 品牌 14791 2019-07-13 www.iautos.cn 城市站 227 2019-07-13 www.iautos.cn 买车列表 139 2019-07-13 www.iautos.cn 品牌 10025 2019-07-13 so.iautos.cn 城市站 116 2019-07-13 so.iautos.cn 买车列表 5 2019-07-13 so.iautos.cn 品牌 6290 2019-07-13 www.hx2car.com 城市站 110 2019-07-13 www.hx2car.com 买车列表 141 2019-07-13 www.hx2car.com 品牌 10905 2019-07-13 58.com 城市站 326 2019-07-13 58.com 买车列表 218 2019-07-13 58.com 品牌 19639 2019-07-13 taoche.com 城市站 71 2019-07-13 taoche.com 买车列表 11 2019-07-13 taoche.com 品牌 13108 2019-07-13 www.51auto.com 城市站 14 2019-07-13 www.51auto.com 买车列表 2 2019-07-13 www.51auto.com 品牌 87 2019-07-13 www.xin.com 城市站 253 2019-07-13 www.xin.com 买车列表 82 2019-07-13 www.xin.com 品牌 13891
排名监控系统整体思路和实现就是这样的,当然也可以直接写在excel中,这个大家自己尝试吧。