前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >站长工具关键词挖掘采集,Python关键词批量挖掘采集工具

站长工具关键词挖掘采集,Python关键词批量挖掘采集工具

作者头像
二爷
发布2020-07-22 11:33:03
1.2K0
发布2020-07-22 11:33:03
举报
文章被收录于专栏:二爷记二爷记

对于seoer而言,关键词的重要性毋庸置疑,关于关键词的挖掘有很多种方法,借助平台工具是必需的,而想要批量获取关键词数据,你需要更好的方法!

比如py大法好!

站长工具无疑是老牌的seo工具平台,虽然广为人吐槽,但它重要性和功能应该没有人质疑吧!

目标网址:

http://stool.chinaz.com/baidu/words.aspx

几个关键点:

1.考虑到某些关键词可能在站长工具里查询不到相关关键词,所以这里首先做了下过滤!

代码语言:javascript
复制
# 查询关键词是否能找到相关的关键字
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

如果没有查询到关键词相关数据则停止运行程序,保存查询的关键词数据!

代码语言:javascript
复制
        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指定的那个元素。

切片操作基本表达式:

代码语言:javascript
复制
object[start_index:end_index:step]

step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!

start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。

end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。

案例应用:

代码语言:javascript
复制
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() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

代码语言:javascript
复制
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数据的保存

代码语言:javascript
复制
# 保存关键词数据为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

第三步:等待,完成

附完整源码:

代码语言:javascript
复制
#站长工具关键词挖掘
# -*- 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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与SEO学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档