Python百度指数获取脚本下载并保存

作者:? 时间:2023-01-05 23:47:44 

前言

有时候大家需要知道一个关键词在互联网上的热度,想知道某个关键词的热度变化趋势。大家可能就是使用百度指数、微信指数之类的。非常好用,但是就是不能把数据下载保存下来,不方便我们后面进行操作。

我无意间看到别人提供的python脚本,可以对百度指数进行爬虫,于是我稍微修改了部分代码,做了一个可以直接返回pd.DataFrame的数据框的类;然后后面又加了一个小的可视化代码。这里和大家分享,只要使用这个脚本,就可以将百度指数数据下载下来,并且保存。

具体步骤

1. 获得cookie值

百度指数是需要登陆,进行用户验证,因此,我们要登陆百度指数,然后随便搜索一个关键词,比如python。然后在网页空白地方,右键打开【检查】,然后进入【网络】

Python百度指数获取脚本下载并保存

这个时候会发现【网络】里面都是空的,需要重新刷新网页即可看到所有内容。内容太多了,注意选择【Fetch/XHR】.

Python百度指数获取脚本下载并保存

然后找到index?开头的文件,查看他的【标头】、查看他的【Cookie】.将这个cookie的值复制

Python百度指数获取脚本下载并保存

2. 使用我的代码

基础代码,只要复制好就行:

import requests
import json
from datetime import date, timedelta
import pandas as pd
class DownloadBaiDuIndex(object):
    def __init__(self, cookie):
        self.cookie = cookie
        self.headers = {
            "Connection": "keep-alive",
            "Accept": "application/json, text/plain, */*",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
            "Sec-Fetch-Site": "same-origin",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Dest": "empty",
            "Referer": "https://index.baidu.com/v2/main/index.html",
            "Accept-Language": "zh-CN,zh;q=0.9",
            'Cookie': self.cookie,
        }

    def decrypt(self, ptbk, index_data):
        n = len(ptbk) // 2
        a = dict(zip(ptbk[:n], ptbk[n:]))
        return "".join([a[s] for s in index_data])

    def get_index_data_json(self, keys, start=None, end=None):
        words = [[{"name": key, "wordType": 1}] for key in keys]
        words = str(words).replace(" ", "").replace("'", """)

        url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={words}&area=0&startDate={start}&endDate={end}'
        print(words, start, end)
        res = requests.get(url, headers=self.headers)
        data = res.json()['data']
        uniqid = data['uniqid']
        url = f'http://index.baidu.com/Interface/ptbk?uniqid={uniqid}'
        res = requests.get(url, headers=self.headers)
        ptbk = res.json()['data']
        result = {}
        result["startDate"] = start
        result["endDate"] = end
        for userIndexe in data['userIndexes']:
            name = userIndexe['word'][0]['name']
            tmp = {}
            index_all = userIndexe['all']['data']
            index_all_data = [int(e) for e in self.decrypt(ptbk, index_all).split(",")]
            tmp["all"] = index_all_data
            index_pc = userIndexe['pc']['data']
            index_pc_data = [int(e) for e in self.decrypt(ptbk, index_pc).split(",")]
            tmp["pc"] = index_pc_data
            index_wise = userIndexe['wise']['data']
            index_wise_data = [int(e)
                               for e in self.decrypt(ptbk, index_wise).split(",")]
            tmp["wise"] = index_wise_data
            result[name] = tmp
        return result

    def GetIndex(self, keys, start=None, end=None):
        today = date.today()
        if start is None:
            start = str(today - timedelta(days=8))
        if end is None:
            end = str(today - timedelta(days=2))

        try:
            raw_data = self.get_index_data_json(keys=keys, start=start, end=end)
            raw_data = pd.DataFrame(raw_data[keys[0]])
            raw_data.index = pd.date_range(start=start, end=end)

        except Exception as e:
            print(e)
            raw_data = pd.DataFrame({'all': [], 'pc': [], 'wise': []})

        finally:
            return raw_data

使用上面的类:

使用上面的类,然后使用下面的代码。先初始化类,然后在使用这个对象的GetIndex函数,里面的参数keys就是传递一个关键词就行,要用列表形式传递。

说更加简单一点的,只要把python替换成别的关键词就行了,然后时间也都是文本形式,样式就是'yyyy-mm-dd'形式就行。

cookie = '你的cookie值,注意使用英文单引号;就是直接复制就行了'
# 初始化一个类
downloadbaiduindex = DownloadBaiDuIndex(cookie=cookie)
data = downloadbaiduindex.GetIndex(keys=['python'], start='2021-01-01', end='2021-11-12')
data

保存数据

如果想保存数据,直接可以这么写:

data.to_csv('data.csv')

可视化

获得数据已经很简单了,接下来可视化,就是非常简单的事情了,你用别的语言处理数据也都可以了。我这里简单的画一个时间序列图:

import plotly.graph_objects as go
import pandas as pd
df = data
fig = go.Figure([go.Scatter(x=df.index, y=df['all'], fill='tozeroy')])
fig.update_layout(template='plotly_white', title='python 百度指数')
fig.show()
fig.write_html('python.html')

结果如下:

Python百度指数获取脚本下载并保存

来源:https://juejin.cn/post/7084039481908527135

标签:Python,百度,指数,获取,脚本,下载
0
投稿

猜你喜欢

  • Pandas实现DataFrame按行求百分数(比例数)

    2022-10-23 10:49:01
  • CentOS 7.4下安装Oracle 11.2.0.4数据库的方法

    2024-01-24 20:36:20
  • 在ASP中改善动态分页的性能

    2008-05-08 14:27:00
  • CSS框架/命名/规则 注意要点

    2008-06-03 13:07:00
  • Python 3.8新特征之asyncio REPL

    2023-10-08 02:59:58
  • PHP引用符&的用法详细解析

    2023-10-17 17:25:53
  • server application error--IIS故障

    2009-06-11 12:50:00
  • pymongo实现控制mongodb中数字字段做加法的方法

    2021-12-15 21:04:06
  • vue监听路由变化时watch方法会执行多次的原因及解决

    2024-05-05 09:10:24
  • python操作数据库之sqlite3打开数据库、删除、修改示例

    2024-01-26 15:47:01
  • flask中使用SQLAlchemy进行辅助开发的代码

    2021-09-10 07:46:43
  • JavaScript中检测变量是否存在遇到的一些问题

    2023-07-02 05:24:05
  • Python基于文件内容实现查找文件功能

    2022-04-13 11:17:47
  • MySQL基于GTID主从搭建

    2024-01-23 18:17:56
  • python在协程中增加任务实例操作

    2023-02-17 22:57:48
  • Python的字典和列表的使用中一些需要注意的地方

    2023-01-09 02:03:52
  • Python实现如何根据文件后缀进行分类

    2023-12-11 07:46:40
  • python爬虫 urllib模块反爬虫机制UA详解

    2022-04-07 02:22:51
  • python多线程并发实例及其优化

    2021-04-03 12:28:11
  • python opencv将图片转为灰度图的方法示例

    2021-03-24 22:22:54
  • asp之家 网络编程 m.aspxhome.com