利用python来完成关键词挖掘,获取关键词数据是seo中比较基础的部分,渠道很多,开水以前也有专门的讲解文章搜索需求挖掘,推广词库收集整理。这次我们就其中关键词搜集的一种方式来展开,来采集凤巢的关键词数据,对关键词的分析,以及使用才是重点!
python与seo,Python批量挖掘百度凤巢关键词-开水网络

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的内容需要抓包获取对应数据填写即可。