对于seoer而言,关键词的重要性毋庸置疑,关于关键词的挖掘有很多种方法,借助平台工具是必需的,而想要批量获取关键词数据,你需要更好的方法!
比如py大法好!
站长工具无疑是老牌的seo工具平台,虽然广为人吐槽,但它重要性和功能应该没有人质疑吧!
目标网址:
http://stool.chinaz.com/baidu/words.aspx
几个关键点:
1.考虑到某些关键词可能在站长工具里查询不到相关关键词,所以这里首先做了下过滤!
# 查询关键词是否能找到相关的关键字 def search_keyword(keyword): data = { 'kw': keyword, 'page': '1', 'by': '0', } url = "http://stool.chinaz.com/baidu/words.aspx" html = requests.post(url, data=data, headers=ua()).text time.sleep(3) con = etree.HTML(html) key_result = con.xpath('//div[@class="col-red lh30 fz14 tc"]/text()') try: key_result = key_result[0] # 没有找到相关的关键字 except: key_result = [] return key_result
如果没有查询到关键词相关数据则停止运行程序,保存查询的关键词数据!
with open('no_search_keyword.txt','a+',encoding='utf-8') as f: f.write(keyword) print("该关键词已保存到 no_search_keyword.txt 文档中!")
2.关键数据数据的处理,应用了切片工具
Python可切片对象的索引方式 包括:正索引和负索引两部分,
如下图所示,以list对象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
切片是非常重要而且好用的操作,相信你也能用上!
一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。
切片操作基本表达式:
object[start_index:end_index:step]
step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!
start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。
end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。
案例应用:
overall_indexs = keyword_all_datas[0::5] # 整体指数 pc_indexs = keyword_all_datas[1::5] # pc指数 mobile_indexs = keyword_all_datas[2::5] # 移动指数 s360_indexs = keyword_all_datas[3::5] # 360指数 collections = keyword_all_datas[4::5] # 收录量
3.zip函数的应用
使用zip()函数来可以把列表合并,并创建一个元组对的列表
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
for key_word, overall_index, pc_index, mobile_index, s360_index, collection, ip, first_place_href, first_place_title in zip( key_words, overall_indexs, pc_indexs, mobile_indexs, s360_indexs, collections, ips, first_place_hrefs, first_place_titles ): data = [ key_word, overall_index, pc_index, mobile_index, s360_index, collection, ip, first_place_href, first_place_title, ] print(data)
4.excel数据的保存
# 保存关键词数据为excel格式 def bcsj(keyword, data): workbook = xlwt.Workbook(encoding='utf-8') booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True) title = [['关键词', '整体指数', 'PC指数', '移动指数', '360指数', '预估流量(ip)', '收录量', '网站首位链接', '网站首位标题']] title.extend(data) # print(title) for i, row in enumerate(title): for j, col in enumerate(row): booksheet.write(i, j, col) workbook.save(f'{keyword}.xls') print(f"保存关键词数据为 {keyword}.xls 成功!")
运行效果:
exe工具打包地址:
链接:
https://pan.baidu.com/s/1C7Kt3XuTcMxzEeA36KUP4A
提取码:
4y24
exe使用方法:
第一步:解压,打开,txt,添加关键词
第二步:运行exe
第三步:等待,完成
附完整源码:
#站长工具关键词挖掘 # -*- coding=utf-8 -*- #by 微信:huguo00289 import requests from lxml import etree import re import xlwt import time from fake_useragent import UserAgent #构建随机协议头 def ua(): ua=UserAgent() headers = {'User-Agent':ua.random} return headers # 查询关键词是否能找到相关的关键字 def search_keyword(keyword): data = { 'kw': keyword, 'page': '1', 'by': '0', } url = "http://stool.chinaz.com/baidu/words.aspx" html = requests.post(url, data=data, headers=ua()).text time.sleep(3) con = etree.HTML(html) key_result = con.xpath('//div[@class="col-red lh30 fz14 tc"]/text()') try: key_result = key_result[0] # 没有找到相关的关键字 except: key_result = [] return key_result # 获取关键词页码数和记录条数 def get_page_number(keyword): data = { 'kw': keyword, 'page': '1', 'by': '0', } url = "http://stool.chinaz.com/baidu/words.aspx" html = requests.post(url, data=data, headers=ua()).text time.sleep(3) con = etree.HTML(html) page_num = con.xpath('//span[@class="col-gray02"]/text()') page_numberze = r'共(.+?)页' page_number = re.findall(page_numberze, page_num[0], re.S) page_number = page_number[0] total_data = con.xpath('//p[@class="col-gray lh24 fr pr5"]') # 数据记录 total_datas = total_data[0].xpath('string(.)') # 获取节点所有文本 print(f'挖掘关键词:{keyword}-{total_datas}') return page_number # 获取关键词数据 def get_keyword_datas(keyword, page_number): datas_list = [] for i in range(1, page_number + 1): print(f'正在采集第{i}页关键词挖掘数据...') data = { 'kw': keyword, 'page': i, 'by': '0', } # print(data) url = "http://stool.chinaz.com/baidu/words.aspx" html = requests.post(url, data=data, headers=ua()).text time.sleep(3) # print(html) con = etree.HTML(html) key_words = con.xpath('//p[@class="midImg"]/a/span/text()') # 关键词 # print(key_words) keyword_all_datas = [] keyword_datas = con.xpath('//ul[@class="ResultListWrap "]/li/div[@class="w8-0"]/a') for keyword_data in keyword_datas: keyword_data = keyword_data.text if keyword_data != None: keyword_all_datas.append(keyword_data) # print(keyword_all_datas) overall_indexs = keyword_all_datas[0::5] # 整体指数 # print(overall_indexs ) pc_indexs = keyword_all_datas[1::5] # pc指数 # print(pc_indexs) mobile_indexs = keyword_all_datas[2::5] # 移动指数 # print(mobile_indexs) s360_indexs = keyword_all_datas[3::5] # 360指数 # print(s360_indexs) collections = keyword_all_datas[4::5] # 收录量 # print(collections) ips = con.xpath('//ul[@class="ResultListWrap "]/li/div[@class="w15-0 kwtop"]/text()') # 预估流量 if ips == []: ips = ['--'] # print(ips) first_place_hrefs = con.xpath( '//ul[@class="ResultListWrap "]/li/div[@class="w18-0 lh24 tl"]/a/text()') # 首页位置链接 if first_place_hrefs == []: first_place_hrefs = con.xpath('//ul[@class="ResultListWrap "]/li/div[@class="w18-0 lh24 tl"]/text()') # print(first_place_hrefs) first_place_titles = con.xpath( '//ul[@class="ResultListWrap "]/li/div[@class="w18-0 lh24 tl"]/p[@class="lh17 pb5"]/text()') # 首页位置标题 if first_place_titles == []: first_place_titles = ['--'] # print(first_place_titles) data_list = [] for key_word, overall_index, pc_index, mobile_index, s360_index, collection, ip, first_place_href, first_place_title in zip( key_words, overall_indexs, pc_indexs, mobile_indexs, s360_indexs, collections, ips, first_place_hrefs, first_place_titles ): data = [ key_word, overall_index, pc_index, mobile_index, s360_index, collection, ip, first_place_href, first_place_title, ] print(data) print('\n') data_list.append(data) time.sleep(3) datas_list.extend(data_list) # 合并关键词数据 return datas_list # 保存关键词数据为excel格式 def bcsj(keyword, data): workbook = xlwt.Workbook(encoding='utf-8') booksheet = workbook.add_sheet('Sheet 1', cell_overwrite_ok=True) title = [['关键词', '整体指数', 'PC指数', '移动指数', '360指数', '预估流量(ip)', '收录量', '网站首位链接', '网站首位标题']] title.extend(data) # print(title) for i, row in enumerate(title): for j, col in enumerate(row): booksheet.write(i, j, col) workbook.save(f'{keyword}.xls') print(f"保存关键词数据为 {keyword}.xls 成功!") #关键词挖掘主函数 def main(): keyword = input('请输入关键词>>') print('正在查询,请稍后...') result = search_keyword(keyword) if result == "没有找到相关的关键字": print('\n') print(result) print("该关键词没有挖掘到关键词数据") with open('no_search_keywords.txt','a+',encoding='utf-8') as f: f.write(keyword) print("该关键词已保存到 no_search_keywords.txt 文档中!") else: print('\n') page_number = get_page_number(keyword) print('\n') print('正在采集关键词挖掘数据,请稍后...') print('\n') print('========================BUG 反馈微信:huguo00289 ========================\n') print('\n') page_number = int(page_number) datas_list = get_keyword_datas(keyword, page_number) print('\n') print('关键词挖掘数据采集结果:') print('========================采集结果========================\n\n') for datas in datas_list: print(datas) print('\n\n========================采集结束========================\n') bcsj(keyword, datas_list) #txt批量挖掘采集关键词数据 def run(): keywords=[key.strip() for key in open("search_keyword.txt")] if len(keywords) > 0: print(f'>>> 共导入{len(keywords)}个关键词数据!') for keyword in keywords: print(f'>>> 正在查询采集 {keyword} 关键数据...') result = search_keyword(keyword) if result == "没有找到相关的关键字": print('\n') print(result) print("该关键词没有挖掘到关键词数据") with open('no_search_keyword.txt', 'a+', encoding='utf-8') as f: f.write(keyword) print("该关键词已保存到 no_search_keyword.txt 文档中!") else: print('\n') page_number = get_page_number(keyword) print('\n') print('正在采集关键词挖掘数据,请稍后...') print('\n') print('========================BUG 反馈微信:huguo00289 ========================\n') print('\n') page_number = int(page_number) datas_list = get_keyword_datas(keyword, page_number) print('\n') print('关键词挖掘数据采集结果:') print('========================采集结果========================\n\n') for datas in datas_list: print(datas) print('\n\n========================采集结束========================\n') bcsj(keyword, datas_list) time.sleep(8) else: print('--- 批量查询模式开启失败!') print('>>>开启手动查询模式!') main() if __name__ == '__main__': print('\n========================工具说明========================') print('站长工具关键词挖掘采集工具-by huguo002\n') print('默认开启批量采集模式,需满足两个条件:') print('1.运行目录存在 search_keyword.txt;') print('2.keywords.txt 内存在关键词数据,关键词一行一个!') print('否则将开启手动查询模式!\n') print('================= BUG 反馈微信:huguo00289 ============\n') time.sleep(5) try: print('>>> 默认开启批量查询模式!') print('>>> 请稍后...') run() except: print(">>> 未查询到 search_keyword.txt 文档数据!\n") print('--- 批量查询模式开启失败!') print(">>> 开启手动输入 关键词模式!\n") main()