利用python来完成关键词挖掘,获取关键词数据是seo中比较基础的部分,渠道很多。这次我们就其中关键词搜集的一种方式来展开,来采集的关键词数据,对关键词的分析,以及使用才是重点!
python与seo
为什么要使用python来完成呢,因为如果直接在后台操作,不可以批量完成,拓展大量的关键词就非常的麻烦;也有人会说到有一系列的软件,软件有一个缺点就是要登录,对我们的账户安全没有保障,在一个就是还得忍受软件提供商的广告,能自己做的就不用别人的。来说说实现Python批量挖掘百度关键词过程的一些要点。
python登录
百度、新浪等大平台的模拟登录本身难度就比较大,百度凤巢又涉及资金和短信验证,所以模拟登录成本较高。这里我们采用简单的操作方法,利用cookies来完成登录,这样只要在自己的浏览器登录账户,抓一下cookies就可以完成登录了。
关键词提取
通过抓包发现的关键词规划师返回的是json数据,使用json模块把返回的json数据可识别,直接[‘word’]提取我们数据就可以了。
python代码
# -*- coding: utf-8 -*-
"""
verseion: beta2.1
"""
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的内容需要抓包获取对应数据填写即可。