😁
运维笔记
运维笔记
运维笔记
  • Welcome my notes
  • PYTHON
    • Python 小技巧
      • Python阿里云余额TG报警
      • Python应知小技巧:如何用更少的代码做更多的事情
      • Python 使用缓存功能进行接口性能调优
      • 用pandas新建excel并设置表头
      • RBAC
      • Python读取文件去除回车
      • Python经过OpenSSL获取指定域名对应的SSL证书
      • Python爬取百度指数中的搜索指数
      • Python中反斜杠u类型(uXXXX)字符串转换为Unicode字符串
      • Python两种方式获取SSL证书信息
      • Python 项目环境变量方法
      • PYTHON 获得当前路径
      • Python 自动申请 SSL 证书
      • Python 拆分 URL
      • Python 谷歌令牌
      • Python redis 操作
      • Python 封装 Redis
      • dnspython实现NS记录查询
      • 2.7 版本 telegram 机器人
      • 最全的Python虚拟环境使用方法
      • hasattr、getattr和setattr的使用方法
      • 字符串与字节之间转换
      • 模块-文件共享-SimpleHTTPServer
      • 模块-文本变量-configparser
      • 模块-SSH连接-paramiko
      • HTTPS服务实现
      • 列表骚操作
      • PyMysql
      • 基础语法
      • 终端Print颜色
      • loguru日志库
      • 自动安装Nginx
      • Python3.7源码安装
      • linux 一键安装 conda
      • Pipenv常用的命令
      • 监听服务器的端口
      • 获取证书到期时间
      • 检测域名被墙污染
      • 发送电子邮件信息
      • 发送Telegram信息
      • 输出进度条的图形
      • Cloudflare DNS A记录自动更新脚本
      • Cloudflare-API操作
      • UUID库生成唯一ID
      • 静态方法、普通方法、类方法
      • 循环切片+多线程+消息队列queus
      • 注册 Forms
      • 循环切片+多线程+消息队列queus
      • Python 列表字符串转换整型
      • SQLAlchemy的查询分页和获取总条数
      • 使用shell和python分别实现简单菜单功能
      • 获取checkbox选中状态的两种方式
      • QQ爆红检测
      • 域名备案查询
      • 结合腾讯云发送短信
      • 爬虫神器PyQuery的使用方法
      • Dict 转换
      • 获取证书到期时间
      • 虚拟环境使用
      • 无限级分类的两种实现方式
      • 两个数组交集|并集|差集方法
      • https
      • ​统计代码耗时的几种方法
      • datetime库常用转换
      • datatime库计算当前时间||其他时间运算
      • 监控网站可用性并发送Telegram通知
      • 监控SSL证书可用性并发送Telegram通知
      • 监控端口可用性并发送Telegram通知
      • 自动下载阿里云OSS桶文件
      • 自动上传文件到阿里云OSS
      • 获取cpu,根据cpu数量分配线程数
      • 获取自己的公网IP地址
      • Pyhton检测邮箱是否可用
      • Python使用代理检测域名状态
    • Flask
      • Nginx 业务接口触发拉黑IP
      • 结合uWSGI和Nginx部署flask项目
      • pip错误
      • Flask请求扩展与中间件
      • Flask拦截器
      • Flask-SQLAlchemy批量插入数据性能测试
      • Flask-CeleryExt
      • Flask 级联删除
      • Flask-SQLAlchemy详解
      • Flask + Celery + Redis 异步发送邮件
      • Flask http异常捕获
      • Flask 自定义命令 类似于django的manage.py
      • Flask 项目中解决csrf攻击
      • Flask 视图请求钩子函数
      • 一、Pipenv管理项目
      • 二、摸版
      • 三、处理文件上传
      • 四、 Flask 定时任务
      • 五、REST架构API方法
      • 六、搭建查询IP地址接口
      • 七、Flask+Github触发webhoop接口
      • Flask用paginate实现数据分页
      • Flask 文件流下载
    • Django
      • Djanog admin 有用的设置
      • Django 下 redis 操作
      • Django Ninja
      • Django django-import-export
      • Django Admin自动填充当前用户的示例代码
      • 在Django Admin中为list_filter创建自定义过滤器
      • 1、Django基础一
      • 2、Django基础二
      • 3、Django后台基础用法
      • 4、Django缓存
      • 5、Django日志
      • 6、Django设置csrf_token
      • 7、Django图片上传前端显示
      • 8、Django全文搜索
      • 9、Django Queryset转Json
      • 10、Django开发||生产环境
      • 11、Django邮箱||验证码||登录
      • 12、Django解决扩展用户表时,后台ADMIN显示密码为明文的问题
      • 13、ORM批量添加||更新数据
      • 14、Django分页并前端显示
      • 15、Celery异步任务集成
      • 16、Django获取访问IP地址
      • 17、Django重定向返回上一页
      • 18、Django自定义页面跳转链接
      • 19、利用 django-simpleui 模板在管理后台添加自定义的菜单和自定义的页面、设置访问权限
      • 20、Django导入导出功能
      • 1000、Django错误
      • 21、Django3实现Websocket最简单demo
      • 22、打包django项目成exe文件
      • Vue+websocket+django实现WebSSH demo
      • 24、related_namerelated_query_name 的区别
    • DRF
      • permissions.py源码分析
      • DRF接口 + Vue实现下载文件
      • DRF基础笔记
      • API跨域设置
      • JWT多方式登录及自定义验证
    • Fastapi
      • 运维自动化之域名系统
      • 自定义异常
      • fastapi tortoise-orm 使用一
      • fastapi tortoise-orm 使用二
      • fastapi tortoise-orm 使用三
      • fastapi处理tortoise-orm异常
      • 基于FastAPI和Tortoise-ORM的WebSocket类的封装
      • FastAPI中使用调度程序执行异步任务,与Redis交互
      • Sqlalchemy异步操作
      • 第一个Fastapi
      • FastAPI 中间件
      • FastApi APIRouter引用
      • FastAPI 依赖注入
      • FastAPI 响应体模型及校验
      • FastAPI 项目结构优化
      • FastAPI 文件上传
      • FastAPI 数据库一对一
      • FastAPI 数据库一对多
      • FastAPI 数据库多对多
      • FastAPI 数据库创建
      • FastAPI 内部调用路径
      • FastAPI 请求参数及校验
      • FastAPI 请求模型及校验
      • FastAPI 内部调用路径
      • FastAPI 路径参数及校验
      • FastAPI 路径、请求、请求体综合使用
      • FastAPI 类视图
      • FastAPI 静态文件
      • FastAPI 接口文档配置相关
      • FastAPI 后台任务
      • FastAPI 更新数据
      • FastAPI 根据环境不同连接不同数据库
      • FastAPI 封装接口返回
      • FastAPI 日志
      • FastAPI 封装分页
      • FastAPI 端点调试
      • FastAPI 定制返回Response
      • FastAPI 操作数据库
      • FastAPI 部署 uvicorn + supervisor
      • FastAPI WebSocket
      • FastAPI startup 和 shutdown
      • FastAPI sql 转换 json
      • FastAPI Redis 操作
      • FastAPI OAuth2 认证
      • FastAPI Jwt 认证
      • FastAPI 表单使用
      • FastAPI Docker 方式
      • FastAPI CORS跨域
      • FastAPI Cookie 参数,Header参数
      • fastapi操作异步redis模块aioredis
      • RESTFUL API 访问和刷新令牌
    • PHP
      • thinkphp
        • 留言版系统
  • centos
    • Iptable
      • Firewalld使用ipset快速屏蔽指定国家的IP访问
      • Iptable 使用ipset设置防火墙端口白名单,只让指定国家访问
    • Minio
      • Minio 部署
      • Python 操作 minio
      • 挂载谷歌云盘
    • SSL
      • CentOS下自动申请、部署Let's Encrypt免费SSL证书教程(Nginx亲测)
    • Linux基操
      • 三次握手和四次挥手
      • Linux-性能常用命令
      • 常见DDOS攻击类型
      • Ubuntu配置IP及免密登录
      • Ubuntu 替换阿里云镜像
      • ntpdate 无法同步时间问题
      • linux下redis的使用
      • hey压测工具
      • Linux-Node安装
      • Linux-UFW设置
      • Linux-vsftp
      • Linux-小数点计算
      • Linux-内核升级
      • Linux-终端代理
      • Linux-输出字体颜色
      • Linux-SSH密钥登录
      • Linux-磁盘扩容缩容
      • Linux-设置时间时区
      • Linux-服务器入侵排查
      • Linux-增加Swap方法
      • Linux-vim可视化模式
      • Linux-Crontab定时任务
      • Linux-Supervisor进程管理
      • Linux-处理大量的 TIME_WAIT
      • awk|grep|sed|find
      • find常规用法
      • Linux-排查磁盘IO读写很高
      • Linux-排查CPU只用率很高
      • ubuntu搭建NFS服务
      • Centos7-yum问题
      • ubuntu 24.X 安装 python2.7
    • 科学上网
      • pptp
      • Sock5 代理
      • Goproxy 代理
      • Stunnel 加密 Squid 代理服务
      • MTProxy代理,专注Telegram
      • 使用一键脚本搭建L2TP+IPSec
    • Ansible
      • Ansible 部署 nginx
      • Ansible 部署 Supervisor
      • Ansible 基础笔记
      • 过滤器
      • ansible回调函数使用
      • 如何使用ansible来快速同步目录
      • Ansible 错误
      • Ansible 删除多个文件或目录
      • Ansible Api二次封装
      • Ansible 过滤器
      • Playbook 获取主机组主机数
      • Playbook 部署Squid代理
      • Playbook Debug用法
      • Playbook 部署Node_exporter
      • 批量安装Nginx
      • 安装K8S
      • Ansible如何通过跳板机连接目标机器
    • Git 教程
      • 首次使用
      • Git上传文件卡住无响应
      • Git速查表
      • Git 安装&配置
      • Git 创建仓库
      • Git 基本操作
      • Git 分支管理
      • Git 服务器搭建
      • Git基操-tag
      • Git修改远程仓库地址
      • Git clone速度太慢怎么办
      • Git 修改 tag 内容如何操作
      • Git 大文件上传
      • Github 创建新分支
    • Docker
      • containerd 安装
      • docker 镜像瘦身工具 docker-slim
      • Docker 与 IPtables
      • Page
      • Docker几种安装方式
      • Docker国内镜像加速
      • Docker容器自动启动设置
      • Docker使用Harbor无SSL
      • Docker使用Harbor的API
      • Dockerfile打包镜像优化
      • Docker自定义镜像查看日志方法
      • Dockerfile和docker-compose.yml设置时区
      • Swarm
        • 微服务架构部署问题
        • Swarm 基础命令
        • Swarm 安装使用
        • Swarm 服务版本更新|回滚
      • Docker-compose
        • Docker 镜像自动化部署
        • Prometheus+Grafana监控平台+钉钉报警
        • 基于Alpine构建php7+nginx(2)
        • 基于Alpine构建php7+nginx(1)
        • docker-compose mysql+django
        • docker-compose安装
        • docker compose升级
        • seata单节点或集群
        • 测试常用中间件快速启动
        • 开源监控-hertzbeat
      • Alpine构建镜像
        • 构建java镜像
        • Alpine-Timezone
        • Alpine-Redis
        • Alpine-Python
        • Alpine-Php
        • Alpine-Nginx
        • Alpine-Nginx-定制nginx
        • Alpine-Mysql
      • Page 3
      • Page 2
    • Shell
      • 批量远程执行命令脚本
      • Linux健康检查脚本
      • Page 1
      • 一键生成ssl自签名证书
      • 服务器日常巡检脚本
      • 生成100个随机6位数字
      • 9个实用 shell 脚本
      • 21 个非常实用的 Shell 拿来就用脚本实例
      • shell每秒执行一次
      • Shell脚本自动生成开头注释简介
      • Shell中$#、$0、set等的含义
      • Shell脚本书写规范
      • shell脚本里的变量怎么加一
      • Shell获取当前目录和上级目录
      • Nginx日志切割脚本(按天切割)
      • Redis源码安装脚本
      • Php源码安装脚本
      • Nginx 1.23.3 源码安装
      • Nginx 1.27.1 源码安装
      • MYSQL5.X源码安装脚本
      • Redis源码安装脚本
      • Lnmp各源码安装脚本
      • Linux打印系统配置信息脚本
      • expect交互
      • CentOS系统初始化脚本(适合CentOS 6.X和CentOS 7.X系列)
      • Ubuntu 系统初始化
      • Bash数组
      • 一键测试脚本bench.sh
      • 批量添加用户
      • Ftp-Python上传下载案例
      • Ftp-Mysql数据库全量自动备份删除7天前备份
      • Ftp-Mysql数据库的全量备份和增量备份脚本实例
      • Ftp-Python服务器
      • Shell脚本常用示例
      • Shell多进程模式
      • 管理Firewall防火墙脚本
      • MySQL5.7~8热备份
      • postgresql 库备份
    • Nginx
      • 一文搞定Nginx的压缩、黑白名单、防盗链、零拷贝、跨域、双机热备等知识
      • nginx 一把梭
      • 阿里云ESC的Nginx代理OSS
      • yum命令安装mariadb
      • Tengine安装lua
      • Nginx配置中的if判断
      • Nginx内置变量
      • nginx+php限制某个IP访问
      • Nginx 变量 set 使用方法
      • Nginx 判断值是否为空 设置变量 获取参数
      • lua随机值
      • 利用客户端随机跳转
      • JS代码简单的防封、防屏蔽、防举报、防红页面
      • Ngx_lua
      • WFT
      • 免费申请HTTPS六大方法
      • 502错误
      • Ngx基操
      • Ngx 配置文件实例
      • Ngx跨域解决方法
      • Ngx服务器内核优化
      • Ngx从安装到高可用
      • Ngx反向代理支持WSS
      • Ngx配置用户名密码访问
      • Ngx配置Http(s)|WS|WSS
      • Ngx算法|Rewrite规则|优先级
      • Ngx中websocket服务的配置
      • mp4
      • 跨域设置
      • Ngx 第三方库 ngx_brotli
      • Ngx 反向代理缓存规则
      • Ngx 反向代理禁用缓存
      • Logrotate实现nginx日志切割
    • Tomcat
      • nginx 前端https +tomcat 后端 http 非80、443端口反向代理的配置方式
      • Tomcat 8.x基于Redis Session会话保持
    • Keepalived
      • 高可用--Nginx+keepalived
      • 高可用-Haproxy+keepalived
      • 高可用-Lvs+Keepalived
    • Mysql
      • yum命令安装mariadb
      • ubuntu 首次安装mysql修改密码
      • 1、Yum安装MySql
      • 2、源码安装MYSQL5.7.21
      • 3、MYSQL主从冷备
      • 4、MYSQL主主热备
      • 5、Xtrabackup全备增备
      • 6、MYSQL管理员密码修改
      • 7、MYSQL字符集设置
      • 8、MYSQL命令整理
      • 9、MySQL数据导出csv格式
      • 10、MySQL根据日期查询数据的sql语句
      • 11、如何优雅备份MySQL?
      • 12、如何在已有的数据库中无损主主备份?
      • 13、PXC集群
      • 14、TIUP TIDB
      • 15、MySQL8.0锁情况排查
      • MYSQL 配置文件常用配置
      • Mysql 错误报错解决方法
      • 记录生产事故数据库被删
      • 压测 SQL 工具
    • Redis
      • Redis基操
      • Redis-cluster监控部署方案
    • Php
      • PHP项目迁移部署错误
      • 查找linux下进程占用CPU过高的原因,以php-fpm为例
    • Vscode
      • vscode实现远程linux服务器上Python开发
    • Prometheus
      • 使用 TLS 加密 Prometheus API 和 UI 端点
      • 使用基本身份验证保护 Prometheus API 和 UI 端点
      • 黑盒
      • prometheus
      • node-exporter https认证
      • 中文资料地址
      • 告警-微信
      • 告警-钉钉
      • 监控-基础指标
      • 监控-自定义指标
      • 黑盒-blackbox_exporter
      • 监控-平台搭建+邮件报警
      • Prometheus 监控 Redis
      • Prometheus 监控 NGINX
      • Prometheus 监控进程
      • PushGateway 数据上报采集
      • Prometheus 将数据远程写入 InfluxDB 存储
      • 外部Prometheus监控k8s集群资源
      • prometheus-Agent服务注册
      • Prometheus-自动发现监控 AWS EC2
      • Prometheus-黑盒blackbox
      • Prometheus-Pushgateway自定义
      • Prometheus-采集MySQL指标
      • Prometheus-采集Redis指标
      • Prometheus-采集Kafka指标
    • Vue
      • Vite解决开发、生产服务器的自动切换
      • js实现60秒倒计时
      • H5页面实现下载文件
      • loading加载动画
      • Vue如何新建一个项目
      • Vue开发菜单权限与按钮权限管理
      • Vue 错误
      • Vue开发必备插件
      • Vue如何新建一个项目
      • vue-router+nginx 非根路径配置方法
      • vue中配置proxy指定api请求地址
      • vue开发----关于字符串去除空格的方法
      • vue表格中动态更新,动态删除,动态添加
      • 项目
        • 1 01.创建 Vite项目并安装 Vscode 插件
        • 1 02.引入ElementPlus和基本使用
        • 1 03.引入windicss工具库和配置,安装代码提示
        • 1 04.引入vue router4路由配置和404页面捕获
        • 1 05.登录页图标引入响应式开发
        • 1 06.结合@apply实现样式抽离
        • 1 07.登录表单验证处理
        • 1 08.引入axios请求库和登录接口交互
        • 1 09.引入cookie存储用户token
        • 1 10.封装请求拦截器和响应拦截器及工具库
        • 1 11.引入vuex状态管理用户信息
        • 1 12.全局路由拦截实现登录判断
        • 1 13.登录功能完善
        • 1 14.退出功能实现
        • 2 01.全局loading进度条实现
        • 2 02.动态页面标题实现
        • 2 03.后台主布局实现
        • 2 04.公共头部开发 样式布局
        • 2 05.公共头部开发 刷新和全屏
        • 2 06.公共头部开发 修改密码
        • 2 07.封装通用弹框表单组件
        • 2 08.封装组合式api简化代码
        • 2 09.侧边菜单开发 样式布局和路由跳转
        • 2 10.展开和收起菜单功能实现
        • 2 11.菜单选中和路由关联
        • 2 12.根据菜单动态添加路由
        • 2 13.封装标签导航组件实现
        • 页面缓存实现
        • 2 15.transition全局过渡动画
        • 2 16.统计面板组件开发
        • 2 17.数字滚动动画实现
        • 2 18.分类组件开发和跳转
        • 2 19.echarts图表组件开发和交互
        • 2 20.店铺和交易提示组件开发和交互
        • 2 21.v permission指令按钮级权限控制
        • 2 22.封装上传多图组件功能实现
        • 2 23.公告栏模块Curd操作
        • 2 24.封装组合式API特性 列表分页搜索增删改
        • 2 25.封装自定义下拉图标组件
    • Bootstrap
      • jQuery判断数组中是否存在某个值的方法
      • jQuery 判断数组中是否包含某个值
      • jQuery checkbox选中和不选中的值_设置checkbox选中状态
      • BootStrap中关于Select下拉框选择触发事件
    • Zabbix
      • Zabbix_Agent
      • PY发送钉钉通知
      • 部署zabbix脚本
      • SHELL发送邮件
      • NGINX状态监控
      • Zabbix模板
    • CICD
      • Pipeline
        • Docker 容器服务重启
        • Docker 镜像打包发布回滚
      • Jenkins+Ansible-playbook自动发布回滚
      • Jenkins、GitLab部署
      • Docker+Nginx+Jenkins+GitLab实现前端自动化部署
      • Jenkins 版本回滚
      • Jenkins 自动化
      • GitLab
        • GitLab 安装
        • GitLab 不同版本迁移
        • GitLab 如何设置中文
    • Email 自建
      • mailcow
      • iRedMail 更改 Mail 域
      • poste.io
  • 消息队列
    • 消息队列选型
  • ES
    • 监控输出到ES错误日志告警
    • filebeat收集java日志
    • filebeat 快速安装
    • ELK配置之,filebeat更改自定义索引名称
    • ELK-Kafka-Filebeat
    • Docker 部署 3 节点 ES 集群
    • ElasticSearch Python操作
    • ElasticSearch常规操作
    • ElasticSearch 7.7.0(单机版)+ Ik 分词器 + ES-head 可视化插件
    • ES 常见错误
    • Grafana+ES+Nginx
    • ES-自动删除7天前索引日志
  • Ubuntu
    • Linux时间与系统时间相差8小时的解决办法
    • Ubuntu 重启网卡的三种方法
    • Ubuntu 网卡配置为静态方法
  • Java
  • 😘Kubernetes
    • k3s
      • K3s集群安装
      • Longhorn 分布式存储
      • kubesphere 管理界面
    • 常用 YAML 模板
      • external-mysql
      • cluster-nacos
      • cluster-xxl-job-admin
      • cluster-seata
      • singlenode-es
      • singlenode-mysql
      • storage-mysql
      • singlenode-rabbitmq
      • singlenode-redis
      • singlenode-sentinel
    • Rancher
      • Rke集群
      • RKE1.5.7安装集群
    • Etcd
      • Docker-单节点单Etcd部署
      • Docker-单节点多Etcd部署
      • Docker-多节点Etcd部署
      • CronJob资源控制器进行定时备份
      • 生产环境ETCD高可用集群
    • Ceph
      • Docker-单节点,多OSD集群
      • Ansible-ceph集群
      • Docker-ceph集群
    • k8s
      • kubernetes 1.23.6
      • kubesphere
      • 使用kubeadm搭建高可用的K8s集群
      • 使用kubeadm快速部署一个K8s集群
      • Rancher+k3s
      • k3s执行helm命令报错Error Kubernetes cluster unreachable Get “httplocalhost8080versiontimeout=32s“
      • 尚硅谷k8s课堂随笔
      • kubernetes学习随笔
      • 问题
      • k8s清除环境脚本
      • Minikube单机版k8s实验环境
      • 常用中间件快速启动
      • kubeadm单机版k8s测试部署
      • kubeadm生产环节高可用部署
      • 跨VPC网络K8S
        • k8s无法删除namespace
        • 跨VPC网络-工具安装
        • 跨VPC网络-二进制ETCD集群
        • 跨VPC网络-使用 kubeadm 创建集群(v1.24)
        • 部署 metrics-server
      • K8s证书考试
    • Helm
      • Helm 安装 MongoDB-分片集群
      • Helm 安装 MongoDB-副本集群
      • helm 安装 rocketmq
      • helm 安装 MongoDB 集群
      • Helm 安装 Redis 集群
      • Helm 安装 Redis 哨兵主从高可用
      • Helm 安装
      • Helm安装Kafka
      • Helm同时部署多个域名
      • Helm内置对象和摸版语言
      • 如何使用github作为Helm的chart仓库
      • Helm 安装 Kubernetes 监控套件
    • 错误记录
      • kubelet启动报错
  • Go
    • 学习笔记
      • 1、Go环境安装
      • 2、Go目录结构及包管理
      • 3、Go的编译和运行
      • Gin 基础
      • Gin 项目实战
      • Go 基础
      • Gorm 基础
      • Go中&与的区别以及使用
      • myblog
    • 视频切片
    • 面试
      • 灵魂拷问
      • 面试稳了
      • 自己经历的面试问题总结
      • K线、均线、趋势、形态、N型反转
    • 错误
    • 小工具
      • 其他工具列表
      • 性能压力测试小工具 wrk
    • AWS
      • CDN缓存刷新
Powered by GitBook
On this page
  • 自己使用抓取指数程序
  • 百度首页搜索关键词获取URL
  1. PYTHON
  2. Python 小技巧

Python爬取百度指数中的搜索指数

本文是在实际需要中使用爬虫获取数据,然后进行对应的数据分析,仅是学习用途,特此记录。

1.环境:Python3.7+PyCharm 1.1 所需要的库:datetime,requests,execjs(非必须)

1.2 为了更好的查看json数据,建议在chrome中安装JSONView插件(https://github.com/gildas-lormeau/JSONView-for-Chrome)

2.百度指数中的数据获取难点: 2.1 百度指数的URL请求地址返回的数据,并不是可以直接进行json解析使用的数据,而是加密之后的数据和uniqid,需要通过uniqid再次请求对应的地址(后面部分介绍)获取到解密的密钥,然后在前端页面进行解密,然后再渲染到折线图中。

2.2 必须要在百度指数页面登录百度账号,由于时间关系,本次数据爬取都是在登录之后进行的操作。

2.3 需要将前端解密代码转化为Python代码,获取直接使用前端代码也可以。

2.3.1 不转换像下面这样使用也可以解密,直接利用execjs直接JavaScript代码即可。

# Python的强大之处就在于,拥有很强大的第三方库,可以直接执行js代码,即对解密算法不熟悉,无法转换为Python代码时,直接执行js代码即可
    js = execjs.compile('''
            function decryption(t, e){
                for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)
                    n[a[o]]=a[a.length/2+o]
                for(var r=0;r<e.length;r++)
                    s.push(n[i[r]])
                return s.join("")
            }
    ''')
    res = js.call('decryption', key, source)  # 调用此方式解密,需要打开上面的注解

2.3.2 前端JavaScript代码对应的Python代码

# 搜索指数数据解密
def decryption(keys, data):
    dec_dict = {}
    for j in range(len(keys) // 2):
        dec_dict[keys[j]] = keys[len(keys) // 2 + j]

    dec_data = ''
    for k in range(len(data)):
        dec_data += dec_dict[data[k]]
    return dec_data

2.4 获取自己登陆之后的Cookie(必须要有,否则无法获取到数据),具体的Cookie获取如下图,请注意看我下图标红的地方。

3.爬取数据的步骤 3.1 构建请求头,爬虫必须,请求头直接全部复制2.4中的请求头即可。

header = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Cookie': '你登陆之后的Cookie',
        'Host': 'index.baidu.com',
        'Referer': 'https://index.baidu.com/v2/main/index.html',
        'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'Cipher-Text': '你登录之后的 Cipher-Text'
    }

``

3.2 分析url

3.2.1 请求数据的url,2.4已经给出

```python
dataUrl = 'https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22%E4%B8%BD%E6%B1%9F%E5%8F%A4%E5%9F%8E%22,%22wordType%22:1%7D]]&days=30'

其中,汉字和部分符号被替换,只需找到对应的汉字部分即可,%22是",所以,哪里是汉字,对比浏览器的地址栏就晓得了吧,url最后的days=30,代表获取一个月的数据,从当前日期的前一天往前推一个月,可以根据需要修改days获取更多的数据或者更少的数据。在浏览器中输入dataUrl中的内容,可以得到以下数据

经过对all,pc,wise对应的数据进行解密,和搜索指数的折线图显示的数据对比,发现all部分的数据就是搜索指数的数据。本次请求返回的数据就在这里了,可以看到uniqid,而且每次刷新加密的数据和uniqid都会变。

3.2.2 获取密钥的url

经过多次分析,发现请求数据的url下面的uniqid出现在了下面这个url中

因此需要先对请求数据对应的url进行数据获取,解析出搜索指数对应的加密数据和uniqid,然后拼接url获取密钥,最后调用解密方法解密即可获取到搜索指数的数据。

keyUrl = 'https://index.baidu.com/Interface/ptbk?uniqid='

3.2.3 找到了对应的url,我们的爬虫也就完成了,接下来就是发送请求,解析数据,然后对数据进行解密即可。

4.完整代码

import datetime

import requests
import execjs


# 搜索指数数据解密
def decryption(keys, data):
    dec_dict = {}
    for j in range(len(keys) // 2):
        dec_dict[keys[j]] = keys[len(keys) // 2 + j]

    dec_data = ''
    for k in range(len(data)):
        dec_data += dec_dict[data[k]]
    return dec_data


if __name__ == "__main__":
    scenicName = '丽江古城'

    dataUrl = 'https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22' + scenicName + '%22,%22wordType%22:1%7D]]&days=30'
    keyUrl = 'https://index.baidu.com/Interface/ptbk?uniqid='
    header = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Cookie': '你登陆之后的Cookie',
        'Host': 'index.baidu.com',
        'Referer': 'https://index.baidu.com/v2/main/index.html',
        'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'Cipher-Text': '你登录之后的 Cipher-Text'
    }
    # 设置请求超时时间为30秒
    resData = requests.get(dataUrl, timeout=30, headers=header)

    uniqid = resData.json()['data']['uniqid']
    print("uniqid:{}".format(uniqid))
    keyData = requests.get(keyUrl + uniqid, timeout=30, headers=header)
    keyData.raise_for_status()
    keyData.encoding = resData.apparent_encoding

    # 开始对json数据进行解析
    startDate = resData.json()['data']['userIndexes'][0]['all']['startDate']
    print("startDate:{}".format(startDate))
    endDate = resData.json()['data']['userIndexes'][0]['all']['endDate']
    print("endDate:{}".format(endDate))
    source = (resData.json()['data']['userIndexes'][0]['all']['data'])  # 原加密数据
    print("原加密数据:{}".format(source))
    key = keyData.json()['data']  # 密钥
    print("密钥:{}".format(key))

    # Python的强大之处就在于,拥有很强大的第三方库,可以直接执行js代码,即对解密算法不熟悉,无法转换为Python代码时,直接执行js代码即可
    # js = execjs.compile('''
    #         function decryption(t, e){
    #             for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)
    #                 n[a[o]]=a[a.length/2+o]
    #             for(var r=0;r<e.length;r++)
    #                 s.push(n[i[r]])
    #             return s.join("")
    #         }
    # ''')
    # res = js.call('decryption', key, source)  # 调用此方式解密,需要打开上面的注解

    res = decryption(key, source)
    # print(type(res))
    resArr = res.split(",")

    dateStart = datetime.datetime.strptime(startDate, '%Y-%m-%d')
    dateEnd = datetime.datetime.strptime(endDate, '%Y-%m-%d')
    dataLs = []
    while dateStart <= dateEnd:
        dataLs.append(str(dateStart))
        dateStart += datetime.timedelta(days=1)
        # print(dateStart.strftime('%Y-%m-%d'))

    ls = []
    for i in range(len(dataLs)):
        ls.append([scenicName, dataLs[i], resArr[i]])

    for i in range(len(ls)):
        print(ls[i])

5.总结 总的来说,本次爬虫大体完成,在代码的编写之余,查阅了解密算法的Python实现,还查看了对日期的操作博客,所有的博客地址如下:

https://blog.csdn.net/weixin_41074255/article/details/90579939
https://blog.csdn.net/junli_chen/article/details/52944724
https://blog.csdn.net/lilongsy/article/details/80242427
https://blog.csdn.net/philip502/article/details/14004815/

感谢各位大牛的博客,因为有了你们我才能完成这篇博客,本文只为记录我在实际中遇到的问题和解决的方法,如有不足还请见谅,若有更好的解决方式,可以评论出来大家一起参考。

自己使用抓取指数程序

  • baidu.py

# coding: utf-8

# import execjs
import threading
import queue
from _env import _global, _proxies, _open, _from_file_name, _to_file_name, _error_file_name, _read_time, _startDate, _endDate, _threads
import requests
import time
import pandas as pd
import random
from fake_useragent import UserAgent
import re


num_of_threads = _threads  # 假如有 5 个线程
q = queue.Queue()  # 创建一个FIFO队列对象,不设置上限
threads = []   # 创建一个线程池


# 搜索指数数据解密
def decryption(keys, data):
    dec_dict = {}
    for j in range(len(keys) // 2):
        dec_dict[keys[j]] = keys[len(keys) // 2 + j]

    dec_data = ''
    for k in range(len(data)):
        dec_data += dec_dict[data[k]]
    return dec_data


# 获取数据
def response(word, Cookie, Cipher_Text):
    scenicName = word

    dataUrl = 'https://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22' + \
        scenicName + '%22,%22wordType%22:1%7D]]&startDate=' + _startDate  + '&endDate=' + _endDate
    # keyUrl = 'https://index.baidu.com/Interface/ptbk?uniqid='
    header = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Cookie': Cookie,
        'Host': 'index.baidu.com',
        'Referer': 'https://index.baidu.com/v2/main/index.html',
        'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'User-Agent': UserAgent().random,
        'Cipher-Text': Cipher_Text
    }
    
    # 判断是否开启了代理模式
    if _open:
    # 设置请求超时时间为30秒
        resData = requests.get(dataUrl, timeout=30,headers=header, proxies=get_proxy())
    else:
        resData = requests.get(dataUrl, timeout=30,headers=header)

    _res = resData.json()

    _search = re.search('uc_login_unique=.*?;', Cookie)
    # print(Cookie)
    # print("调用Cookies: {0}".format(_search.group()))

    if _res['status'] == 10018:
        print("="*60)
        print("\n")
        print("Cookies: {0}\n警告: {1}\n\n如何处理?: 先暂停此账户,过一会再重新使用!!!".format(_search.group(), _res['message']))
        print("\n")
        print("="*60)

    if _res['status'] == 10000:
        print("="*60)
        print("\n")
        print("Cookies: {0}\n警告: {1}!".format(_search.group(), _res['message']))
        print("\n")
        print("="*60)

    return _res

    # print(resData.json())


def get_data(_res_data):
    _start_time = _res_data['userIndexes'][0]['all']['startDate']  # 开始时间
    _end_time = _res_data['userIndexes'][0]['all']['endDate']     # 结束时间

    _search_word = _res_data['generalRatio'][0]['word'][0]['name']  # 关键词
    _all_avg = _res_data['generalRatio'][0]['all']['avg']      # 整体日均值
    _all_yoy = _res_data['generalRatio'][0]['all']['yoy']      # 整体同比
    _all_qoq = _res_data['generalRatio'][0]['all']['qoq']      # 整体环比

    _pc_avg = _res_data['generalRatio'][0]['pc']['avg']        # PC日均值
    _pc_yoy = _res_data['generalRatio'][0]['pc']['yoy']        # PC同比
    _pc_qoq = _res_data['generalRatio'][0]['pc']['qoq']        # PC环比
  
    _wise_avg = _res_data['generalRatio'][0]['wise']['avg']    # 移动日均值
    _wise_yoy = _res_data['generalRatio'][0]['wise']['yoy']    # 移动同比
    _wise_qoq = _res_data['generalRatio'][0]['wise']['qoq']    # 移动环比

    return [_search_word, _all_avg, _all_yoy,
          _all_qoq, _pc_avg, _pc_yoy, _pc_qoq, _wise_avg, _wise_yoy, _wise_qoq, _start_time, _end_time]

# 创建 EXCEL
def create_form(excel_file_name):
    form_header = ['关键词', '整体日均值', '整体同比',
                   '整体环比', 'PC日均值', 'PC同比', 'PC环比', '移动日均值', '移动同比', '移动环比', '开始时间','结束时间']
    df = pd.DataFrame(columns=form_header)
    df.to_excel(excel_file_name, index=False)

# 写入数据到 EXCEL
def add_info_to_form(excel_file_name, data=[]):
    df = pd.read_excel(excel_file_name)
    row_index = len(df) + 1  # 当前excel内容有几行
    df.loc[row_index] = data
    df.to_excel(excel_file_name, index=False)


# 未搜索到关键词写入到文件
def error_to_txt(_txt):
    fp = open(_error_file_name, 'a+', encoding='utf8')
    fp.write(_txt+"\n")
    fp.close()


def worker(i):
    while True:
        item = q.get()
        if item is None:
            print("线程%s: 消息队列发现了一个None,可以休息了^-^" % i)
            break
        # do_work(item)做具体的工作
        time.sleep(random.randint(0, int(_read_time)))

        # 获取 cookies
        _cookie = get_cookie()
        # 搜索关键词
        _res = response(word=str(item.replace(" ", "")),Cookie=_cookie['Cookie'], Cipher_Text=_cookie['Cipher_Text'])

        # 如果cookie是否错误或者是否登录
        if _res['status'] == 10018 or _res['status'] == 10000:
            break

        # 判断返回数据
        if _res['status'] == 10002:
            print("线程%s: 百度指数搜索 NOTFOUND <%s>" % (i, item))
            error_to_txt(item)

        
        try:
            if _res['status'] == 0:
                data = get_data(_res['data'])
                add_info_to_form(_to_file_name, data)
                print("线程%s: 百度指数搜索 SUCCESS <%s>" % (i, item))
        except Exception as e:
            print("线程%s: 百度指数搜索 ERROR <%s> " % (i, item))
            error_to_txt(item)



        # 做完后发出任务完成信号,然后继续下一个任务
        q.task_done()


# 读取 txt 文件,返回文件内的所有数据,为任务队列准备
def read_filename(fromFileName):
    _source = []
    with open(fromFileName, 'r', encoding='utf-8') as file:
        _source = file.read().splitlines()
    file.close()

    print('关键字数量: <%s>' % len(_source))
    return _source



def main():
    print('='*60)
    print('\n')
    print('正在启动......')
    create_form(_to_file_name)
    print('开始读取: %s' % _from_file_name)
    _source = read_filename(fromFileName=_from_file_name)

    # 多线程运行 worker 函数,并把他们添加到线程池里
    for i in range(1, num_of_threads+1):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()

    # 每隔0.5秒发布一个新任务
    for item in _source:
        time.sleep(0.1)
        q.put(item)

    q.join()
    print("-----搜索都完成了-----")

    # 停止工作线程
    for i in range(num_of_threads):
        q.put(None)
    for t in threads:
        t.join()




# 获取代理
def get_proxy():
    proxy_ip = random.choice(_proxies)

    # 随机代理
    proxies = {'http': proxy_ip, 'https': proxy_ip}
    return proxies

# 测试使用
def get_cookie():
    _index = random.randint(0, len(_global) - 1)    # 获取变量数量, 并随机获取,列表下标从0开始,则减1
    _keys = list(_global.keys())                    # 获取变量 key,并组合成列表

    _use_key = _keys[_index]                        # 随机获取一个 key
    _cookie = _global[_use_key]                     # 通过随机 key 获取对应 cookie
    return _cookie


if __name__ == "__main__":
    main()


  • _env.py

_threads = 8    # 百度指数搜索并发线程数,自己决定,最好是你当前CPU*2
_read_time = 3  # 百度指数搜索每个线程间隔时间,必须大于0

# ===========================================
#       百度指数关键词文件,数据文件,错误文件
# ===========================================
_from_file_name = '关键词.txt'
_to_file_name = '关键词.xls'
_error_file_name = '未搜索关键词.txt'


# ===========================================
#        百度指数搜索天数、Cookie,自行填写
# ===========================================
# 搜索统计日期范围:2022-06-29 ~ 2022-07-28
_startDate = '2022-06-29'
_endDate = '2022-07-28'


_global = {
    # 百度账户一: xxxx
    '_var1': {
        'Cookie': 'BAIDUID=FEB688DCA7A2A3F745D140835D5A17EB:FG=1; Hm_lvt_d101ea4d2a5c67dab98251f0b5de24dc=1659071713; SIGNIN_UC=70a2711cf1d3d9b1a82d2f87d633bd8a04090841788b8wIk4yyecOyxgTYqPRVIrUOHjSmrWkAkMU5fLxWMCeGis%2BOwrGDihIlQvNTg1fn8%2BLE67Y9HcwzSOn1vWDxCGsrDS1JrRDiS4BVAK88wNX39zALNPBS9MwkJ8x%2F5Ksx40d313q1IV3O0MIQ2wWYutUVxJckUKcJaG7uk6rTRcIMcKgCzfLwNoC8lP2Sv%2FzZmjIOJ6L0LsGXV%2FPbww0IHBVs4S5o%2FX9D%2FRKwiSHBgnR2bF7XsEnNgJh2QhiymdGzSR6FyUM%2BEIEbGLAyl%2Bn7tw%3D%3D30907553640450600111758967547676; uc_login_unique=d9d6d671b925d6f40d189e40315a24b5; uc_recom_mark=cmVjb21tYXJrXzM0MDM0OTMz; __cas__st__212=a8b1ee2ce91f6a8df98168f341232674e8fb167b5268f51e7b71b5d6af13e60af6cbc529f24d7913566891f4; __cas__id__212=34034933; __cas__rn__=409084178; CPID_212=34034933; CPTK_212=2037297134; Hm_up_d101ea4d2a5c67dab98251f0b5de24dc=%7B%22uid_%22%3A%7B%22value%22%3A%2234034933%22%2C%22scope%22%3A1%7D%7D; bdindexid=9b6n8dbcfl9pvf2d3re6so5g22; Hm_lpvt_d101ea4d2a5c67dab98251f0b5de24dc=1659071753; ab_sr=1.0.1_MzBhYWRiMzhmMzk3ZTJmZmU1NDAwOTc3ODExY2U4NmVjOTc5NzEwODc5NmMyNGZiZWY1NWY0YmQzMmUyZmE4OGJiNDdlM2ZlYTNjMDllNDMxNjAwMjA3NmVkODU3YjlhNTQ2NmRmNGNlMjZiNmZlNDI4ZGVlZmRlMDYwYmZmZjljMmExYTdlZTM3ZGMyMTUyNWYzZjU1NWVmY2U1NmQ0MQ==; RT="z=1&dm=baidu.com&si=b6a4f9c4-9cee-44bd-b25b-ae8b15118980&ss=l660gkx5&sl=e&tt=c93&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=z00"',
        'Cipher_Text': '1658991609296_1659071764244_q1ZmVh/bml4j1LkN4yaPImQ9fVSrYOaycdWSxqCcP4BAfWhr0X8ZYdmQrvYh28BM1jwSi6br4M+biqxnh6revxn1AgSmy86omMWbiaS7geWFgQxm4/8/fYxAD2rf0lxDJLQyTXM7YxoKw3KHuu1QmAcjUUEjSvxsIccRfsPZcMLYrwZwBkya7uVS4zhC2CWj45aiXwKW7T+fdgBOwFEPCkkyEq1lQzRYMOJNdfKpsVRECtxU33x6HB4Z6+qh1HFnPdEQO/HTTesIXlNKKA9J/h31W5Ro4+jAjuiObCU+B5qFmRFEx9TWmkHJKOQNPysB6+klClikwc0151OMWYp38EBNCrQ0MTWL60th/5w+8N0P1oM8AicfVg6v/PngW1qj'
    },
    # 百度账户二: xxxx
    '_var2': {
        'Cookie': 'BIDUPSID=4A348FD99309494578B4C851F95560EC; PSTM=1655810429; BAIDUID=4A348FD9930949454B2582A91BC3CF79:FG=1; BAIDUID_BFESS=4A348FD9930949454B2582A91BC3CF79:FG=1; ZFY=1xUxhTYbUvlKMnXO:A:Az0ZauuAj4:BYq9R6mvvllP2LmA:C; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BA_HECTOR=8kak842120aga5048k8ip2br1he4l8816; uc_login_unique=d7ac76c88f88040ec973600869743eb1; H_PS_PSSID=36554_36625_36255_36726_36414_36840_36954_36165_36917_36569_36652_36745_26350_36865_36649; delPer=0; PSINO=2; BCLID=10649298767364973054; BDSFRCVID=ZIkOJexroG0leprDIU_7DRpU-rpWxY5TDYrELPfiaimDVu-VJeC6EG0Pts1-dEu-EHtdogKKymOTHrAF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF=tR30WJbHMTrDHJTg5DTjhPrMW4rWWMT-MTryKKJs54JKshTaBTJU0R8Aqq5jLbvkJGnRh4oNBUJtjJjYhfO45DuZyxomtfQxtNRJQKDE5p5hKq5S5-OobUPU2fc9LUvH0mcdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-D_GDjuM3e; BCLID_BFESS=10649298767364973054; BDSFRCVID_BFESS=ZIkOJexroG0leprDIU_7DRpU-rpWxY5TDYrELPfiaimDVu-VJeC6EG0Pts1-dEu-EHtdogKKymOTHrAF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR30WJbHMTrDHJTg5DTjhPrMW4rWWMT-MTryKKJs54JKshTaBTJU0R8Aqq5jLbvkJGnRh4oNBUJtjJjYhfO45DuZyxomtfQxtNRJQKDE5p5hKq5S5-OobUPU2fc9LUvH0mcdot5yBbc8eIna5hjkbfJBQttjQn3hfIkj2CKLK-oj-D_GDjuM3e; Hm_lvt_d101ea4d2a5c67dab98251f0b5de24dc=1658991306,1659010575,1659066565,1659071534; SIGNIN_UC=70a2711cf1d3d9b1a82d2f87d633bd8a04090840555%2BfYDAukYB0EMdCSB9fNk5K6A%2F8XyKPwSTZLSK85wB4q6qDU0HGagkjS%2FHKxEETVXQedXr%2FwFXNFFGkQdUhi2h33LFrF2HZlGju4d40SFcrO3wd%2FD6grexJwmOlJ%2BLY4dKhzqHz1b4xsL1wiwaO6FqLkiF%2Bev4PfkcvQQq1c6UGDX5TClH4ovXx4fZwjj1g0lpsB2ug7bL6ttrCkusbyXoaHZjPnBLmPwDbHp9j0rC2q2Qzm74GQIMKL%2BSaXFvVuoqrpdZ%2Bno4Qtm9jD3sI%2FYyQ%3D%3D47412425789526699753615829911668; uc_recom_mark=cmVjb21tYXJrXzMzOTc5MDkz; __cas__st__212=c38f91a94579d3d6b084f8424371621cc67b2872a920b6ed2b2c88f23632c18195469761ebc925e6132dd0a2; __cas__id__212=33979093; __cas__rn__=409084055; CPID_212=33979093; CPTK_212=1949800301; Hm_up_d101ea4d2a5c67dab98251f0b5de24dc=%7B%22uid_%22%3A%7B%22value%22%3A%2233979093%22%2C%22scope%22%3A1%7D%7D; bdindexid=dm4rlcp0va4a5s6un38sao3uq3; Hm_lpvt_d101ea4d2a5c67dab98251f0b5de24dc=1659071625; ab_sr=1.0.1_MzA2NjNkNzEzOGIxMDE4YWY4MzM4ZWVhOWY5ODY5N2VhZmMxZGY1MzNmOTZmYTBjN2RhYTNlMmFmYTkyODE0ZTJmZDdhNzRiNmY4YmM1YzZiZTQ3NDc2ODEzYWY0Y2Y1ZTg5YzNjNDE1OWMxOTJmNTM0YjRkYTgwZTc2Y2QwYjRkNTI0YTc1Y2EwMmJiNDJlODA0YTQ2MWU3OGU0NmEwZA==; RT="z=1&dm=baidu.com&si=38baa5bf-fbb6-4170-8899-a33a051ee109&ss=l660csaw&sl=n&tt=gic&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=2cb4"',
        'Cipher_Text': '1658991609296_1659071645467_q1ZmVh/bml4j1LkN4yaPImQ9fVSrYOaycdWSxqCcP4BAfWhr0X8ZYdmQrvYh28BM1jwSi6br4M+biqxnh6revxn1AgSmy86omMWbiaS7geXyJkXG40GYuO0UsL0vlybzUNPaKbgBwFL5F0qZr38iTTzfnLER1MdHJ/Atj9DKQYIKctYJoJOV/v5PFXN+2d7Wq12fcOk3Ch27M8MYmZdby/vtt0QlG2zwTtedpQ57S5HfE30ikEHoKdHJtv0UdREVLC9DulieA4U0+qUK9HB0P9CAOz2HztqRy7ty1jjOPLlcQr+OOUeOq1n21O/Qne49hk0L60fuqahLFxLfUMCYcEXBgnxf1cCClaz0a69WQB1YOvQhbO5UWlCwlP81X9/xTovWhJIpW+y9qyZ2ro6ECw=='
    },
}

# ===========================================
#        百度指数爬虫是否开启代理
#        HTTP已测,其他代理未测试
# ===========================================
_open = False   # 默认为开启

_proxies = [
    "http://proxy.xxx.com:60001",
]

_

  • 关键词放在: 关键词.txt

百度首页搜索关键词获取URL

# -*- coding:utf-8 -*-

#获取网页内容文件
import requests


class MySpider(object):
    def __init__(self):
        self.url = "http://www.baidu.com/s?wd={name}"
        #写清楚获取headers途径
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
        }


    def get(self):
        """请求并返回网页源代码"""
        response = requests.get(self.url, self.headers)
        if response.status_code == 200:
            return response.text

    def write(self, text):
        # print(text)
        with open("%s.html" % self.target, "w", encoding="utf-8") as f:
            f.write(text)

    def parse():
        with open("python.html", "r", encoding="utf-8") as f:
            self.html = etree.HTML(f.read())
            #获取标题
            h3_tags = self.html.xpath("//h3[contains(@class,"t")]//text()")
            h3_tags = [i.strip() for i in h3_tags]
            print(h3_tags)


    def main(self):
        #处理url
        self.target = input("请输入你感兴趣的内容:")
        self.url = self.url.format(name=self.target)
        #请求
        text = self.get()
        #写入文件
        self.write(text)

if __name__ == "__main__":
    spider = MySpider()
    spider.main()


# 参考:https: // www.yht7.com/news/130433
# https: // www.helloworld.net/p/9491097957
PreviousPython经过OpenSSL获取指定域名对应的SSL证书NextPython中反斜杠u类型(uXXXX)字符串转换为Unicode字符串

Last updated 2 years ago