利用python来完成关键词挖掘,获取关键词数据是seo中比较基础的部分,渠道很多,开水以前也有专门的讲解文章搜索需求挖掘,推广词库收集整理。这次我们就其中关键词搜集的一种方式来展开,来采集凤巢的关键词数据,对关键词的分析,以及使用才是重点!
python与seo
为什么要使用python来完成呢,因为如果直接在凤巢后台操作,不可以批量完成,拓展大量的关键词就非常的麻烦;也有人会说到有一系列的软件,软件有一个缺点就是要登录,对我们的账户安全没有保障,在一个就是还得忍受软件提供商的广告,能自己做的就不用别人的。来说说实现Python批量挖掘百度凤巢关键词过程的一些要点。
python登录百度凤巢
百度、新浪等大平台的模拟登录本身难度就比较大,百度凤巢又涉及资金和短信验证,所以模拟登录成本较高。这里我们采用简单的操作方法,利用cookies来完成登录,这样只要在自己的浏览器登录账户,抓一下cookies就可以完成登录了。
凤巢关键词提取
通过抓包发现凤巢的关键词规划师返回的是json数据,使用json模块把返回的json数据可识别,直接['word']提取我们数据就可以了。
python代码
# -*- coding: utf-8 -*- """ verseion: beta2.1 说明: 百度凤巢挖词脚本 (代码符合PEP8标注) 请勿用于任何商业用户,版权最终归作者所有 """ import requests import json import time import sys reload(sys) sys.setdefaultencoding( "utf-8" ) class UnicodeStreamFilter: def __init__(self, target): self.target = target self.encoding = 'utf-8' self.errors = 'replace' self.encode_to = self.target.encoding def write(self, s): if type(s) == str: s = s.decode("utf-8") s = s.encode(self.encode_to, self.errors).decode(self.encode_to) self.target.write(s) if sys.stdout.encoding == 'cp936': sys.stdout = UnicodeStreamFilter(sys.stdout) #以上为cmd下utf-8中文输出的终极解决方案! def url_data(key,config,cookie,shibai=3): headers={ 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': cookie, 'Host': 'fengchao.baidu.com', 'Origin': 'http://fengchao.baidu.com', 'Referer': 'http://fengchao.baidu.com/nirvana/main.html?userid=%s' % config['userid'], 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36' } params={ "logid":401075077, "query":key, "querySessions":[key], "querytype":1, "regions":"16", "device":0, "rgfilter":1, "entry":"kr_station", "planid":"0", "unitid":"0", "needAutounit":False, "filterAccountWord":True, "attrShowReasonTag":[], "attrBusinessPointTag":[], "attrWordContainTag":[], "showWordContain":"", "showWordNotContain":"", "pageNo":1, "pageSize":1000, "orderBy":"", "order":"", "forceReload":True } from_data={ 'params':json.dumps(params), 'path':'jupiter/GET/kr/word', 'userid':config['userid'], 'token':config['token'], 'eventId':config['eventId'], 'reqid':config['reqid'] } qurl="http://fengchao.baidu.com/nirvana/request.ajax?path=jupiter/GET/kr/word&reqid=%s"%config['reqid'] try: whtml=requests.post(qurl,headers=headers,data=from_data) except requests.exceptions.RequestException: resultitem={} erry="请求三次都是错误!" if shibai > 0: return url_data(key,config,cookie,shibai-1) else: whtml.encoding="utf-8" try: resultitem = whtml.json() except ValueError: resultitem = {} erry = "获取不到json数据,可能是被封了吧,谁知道呢?" else: erry = None return resultitem,erry config={ 'userid': , 'token':' ', 'eventId':' ', 'reqid':' ' } cookie=" " def key_data(resultitem): kws=['关键词\t日均搜索量\tpc\t移动\t竞争度\n'] try: resultitem=resultitem['data']['group'][0]['resultitem'] except (KeyError, ValueError, TypeError): resultitem=[] erry="没有获取到关键词" else: for items in resultitem: word=items['word'] pv=items['pv']#日均搜索量 pvPc=items['pvPc'] pvWise=items['pvWise'] kwc=items['kwc']#竞争度 kwslist=str(word)+'\t'+str(pv)+'\t'+str(pvPc)+'\t'+str(pvWise)+'\t'+str(kwc)+'\n' kws.append(str(kwslist)) print word,pv,pvPc,pvWise,kwc erry=None return kws,erry sfile = open('resultkeys.txt', 'w') # 结果保存文件 faileds = open('faileds.txt', 'w') # 查询失败保存文件 for key in open("cigeng.txt"): key=key.strip() print "正在拓展:%s"%key resultitem,erry=url_data(key,config,cookie) if erry: print key,erry faileds.write('%s\n' % key) faileds.flush() continue keylist,erry=key_data(resultitem) if erry: print key,erry faileds.write('%s\n' % word) faileds.flush() continue for kw in keylist: sfile.write('%s\n'%kw) faileds.flush() continue
代码中config和cookies的内容需要抓包获取对应数据填写即可。