websocket爬虫

人群看板需求分析

先找到策略中心具体的数据。对应数据库中的数据

看看接口是否需要被逆向

  1. 点开消费者细分,可以找到人群包(人群名称)
    在这里插入图片描述

  2. 点击查看透视
    在这里插入图片描述

label字段分类:

在这里插入图片描述

预测年龄:tagTitle

在这里插入图片描述

苹果id(perspecttaskId)——>详细标签数据信息接口

在这里插入图片描述

负载信息

在这里插入图片描述

响应数据信息
{"rate": 20.955497819874278,"tagValue": "917007982","count": -1,"nullCount": 0,"nullRate": 0,"nullEncryptedCount": 0,"tagName": "daas_tag_pred_age_level_20200415093010","tagValueName": "[18,24]"
}

在这里插入图片描述

——>苹果ID接口(id)

在这里插入图片描述

响应数据信息
 {"throwed": false,"gmtModified": 1689168616000,"statusInfo": "","isReplace": false,"description": "","crowdAdbStatus": 1,"baseId": "026130413","source": "STRATEGY_CUSTOM","isThrowed": false,"uniMemberReportAuth": null,"syncValid": true,"inheritable": false,"rootSource": null,"gmtUpdate": 1689168616000,"uniMemberReportInfo": null,"validInDatahub": false,"perspective": 1,"id": 66703384,"gmtUpdateReal": null,"blurred": true,"statusInfoCode": 0,"category2": "STRATEGY_CUSTOM","category3": "STRATEGY_CUSTOM","canUpdate": false,"crowdDivisionStatus": null,"reportId": 7744917,"category1": "STRATEGY_CUSTOM","withConditionGroup": true,"count": 22000,"gmtCreate": 1689168568000,"customType": "","fullLinkPlatform": "NOT_FULL_LINK","brandId": "64284","updateSettedFlag": false,"name": "苹果已购人群-23-6","reportStatusInfo": "","sourceName": null,"smartId": 914,"projectId": 183575,"status": "CREATED"},
问题

在做完上述分析之后我很疑惑,这个获取详细标签数据信息的接口总是刷新不出来。如果一个网站的接口,刷新之后就找不到了,是什么原因呢?和缓存有关系吗?。。。后来发现这不是普通的HTTP爬虫啦。换了一种协议传输数据。

后续的分析我们着重讲一下案例的原理和实战干货。因为博主很苦逼的研究了一周,发现网上关于websocket的案例实在不多,大多都是讲原理,那咋不去教前端捏。哈哈。少有的案例,不是国外的网站,就是需要加密破解。正好。因为网站的特殊性,没有对相关的请求信息做加密处理。所以可以很纯粹的给大家讲讲websocket非异步爬虫实战,分享一下我辛苦一周钻研出来的小小心得。

浅浅展示一下博主努力做案例的过程。

加密的数据

在这里插入图片描述

看到这里麻烦点个赞和关注,精彩的要来了

websocket爬虫

原理:

我特意做了一个流程图,因为我发现很多博文中都把websocket请求和接收数据的过程原理化了,这样实际调用的方法和实际操作不能匹配。这也是我困扰很久的地方。

在这里插入图片描述

WS协议请求demo
def on_message(ws, message):print(message)def on_error(ws, error):print(error)def on_close(ws, close_status_code, close_msg):print("### closed ###")def on_open(ws):def run(*args):for i in range(3):time.sleep(1)ws.send("Hello %d" % i)time.sleep(1)ws.close()print("thread terminating...")_thread.start_new_thread(run, ())# wss://ws-insight-engine.tmall.com/
if __name__ == "__main__":websocket.enableTrace(True)ws = websocket.WebSocketApp("wss://ws-insight-engine.tmall.com/", on_open=on_open,on_message=on_message, on_error=on_error, on_close=on_close)ws.run_forever()
  1. 定义了on_message函数,它在WebSocket客户端接收到来自服务器的消息时被调用。接收到的消息作为参数message传入,并被打印出来。
  2. 定义了on_error函数,它在WebSocket客户端遇到错误时被调用。错误信息作为参数error传入,并被打印出来。
  3. 定义了on_close函数,它在WebSocket连接关闭时被调用。它打印出一条消息表示连接已关闭。
  4. 定义了on_open函数,它在WebSocket连接成功打开后被调用。在这个函数内部,定义了一个名为run的嵌套函数,它将在一个新的线程中执行。
  5. run函数中,使用了一个循环来连续发送三条消息到WebSocket服务器。每条消息发送后,线程休眠1秒。发送完所有消息后,线程再次休眠1秒,然后关闭WebSocket连接,并打印出一条消息表示线程正在终止。
  6. on_open函数中,使用_thread.start_new_thread启动了一个新线程来运行run函数。
  7. if __name__ == "__main__":块中,这是Python中的常用模式,用于判断当前脚本是否作为主程序运行。
  8. websocket.enableTrace(True)启用了调试输出,这将打印出所有WebSocket事件的详细信息,帮助调试。
  9. 创建了一个WebSocketApp实例,指定了WebSocket服务器的URL(“wss://ws-insight-engine.tmall.com/”),并将之前定义的事件处理函数(on_open, on_message, on_error, on_close)绑定到相应的事件上。
  10. 调用ws.run_forever()开始运行WebSocket事件循环,这将保持连接开启直到它被关闭。

资料

关于WebSocket协议的爬虫资料,这里有一些有用的资源:1. **Python—WebSocket爬虫实战原创**:介绍了WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议,并提供了一个实战案例。[查看详情](https://blog.csdn.net/weixin_43060843/article/details/104798541)2. **【JS 逆向百例】WebSocket 协议爬虫,智慧树扫码登录案例分析**:分析了WebSocket协议简称为WS或者WSS(WebSocket Secure),并通过智慧树扫码登录案例进行了详细的讲解。[查看详情](https://cloud.tencent.com/developer/article/1914104)3. **websocket与爬虫 - 高金的博客**:讨论了WebSocket是一种在单个TCP连接上进行全双工通讯的协议,以及它与爬虫的关系。[查看详情](https://igaojin.me/2018/02/04/websocket%E4%B8%8E%E7%88%AC%E8%99%AB/)4. **WebSocket爬虫与JS逆向实战原创**:提供了一个基于Java的WebSocket爬虫示例,用于模拟客户端请求服务器,建立WebSocket连接,抓取对方数据。[查看详情](https://blog.csdn.net/Fleehom/article/details/133887962)5. **基于websocket爬虫- Sgoyi**:讨论了爬虫面对HTTP和WebSocket的情况,以及如何使用Python中的网络请求库进行模拟发送网络请求。[查看详情](https://www.cnblogs.com/yhll/p/10709593.html)6. **WebSocket在爬虫中的应用与实践**:介绍了WebSocket是一种网络通信协议,允许在单个TCP连接上进行全双工通信,在爬虫中的应用与实践。[查看详情](https://cloud.baidu.com/article/2927136)这些资料涵盖了WebSocket协议的基本概念、与爬虫的结合使用,以及一些实战案例。希望这些资源能够帮助你更好地理解和应用WebSocket协议进行爬虫开发。
Sec-WebSocket-Key分析
根据你的需求,关于`Sec-WebSocket-Key`及其逆向工程的资料,这里有一些相关的中文资源:1. [【JS 逆向百例】WebSocket 协议爬虫,智慧树扫码登录案例分析](https://juejin.cn/post/7038882823780417544) - 这篇文章详细分析了WebSocket协议在实际应用中的一个案例,包括`Sec-WebSocket-Key`的作用和如何在服务端处理这个密钥。2. [WebSocket协议浅析](https://itimetraveler.github.io/2018/10/27/WebSocket%E5%8D%8F%E8%AE%AE%E6%B5%85%E6%9E%90/) - 这篇文章提供了对WebSocket协议的基础分析,包括`Sec-WebSocket-Key`和`Sec-WebSocket-Accept`的作用,以及它们如何帮助提供基础的防护,减少恶意连接和意外连接。3. [一文了解WebSocket 协议](https://makonike.github.io/2023/05/06/%E4%B8%80%E6%96%87%E4%BA%86%E8%A7%A3WebSocket%E5%8D%8F%E8%AE%AE/index.html) - 这篇文章讨论了WebSocket协议的基本概念,包括`Sec-WebSocket-Key`和`Sec-WebSocket-Accept`的角色和作用。4. [What is Sec-WebSocket-Key for?](https://stackoverflow.com/questions/18265128/what-is-sec-websocket-key-for) - 虽然这是一个英文资源,但它详细解释了`Sec-WebSocket-Key`的作用,这个头部字段是在WebSocket开放握手中从客户端发送到服务器的,用于提供握手的一部分验证。`Sec-WebSocket-Key`是WebSocket握手过程中的一个重要组成部分,它是由客户端生成的一个Base64编码的随机字符串。服务器接收到这个密钥后,会按照特定的算法处理并返回一个加密的`Sec-WebSocket-Accept`响应头,这个过程是为了验证连接确实是WebSocket连接,防止非WebSocket连接的恶意请求。理解这一机制对于进行WebSocket通信和相关逆向工程非常重要。

Sec-WebSocket-Key是WebSocket握手过程中的一个重要组成部分,它是由客户端生成的一个Base64编码的随机字符串。服务器接收到这个密钥后,会按照特定的算法处理并返回一个加密的Sec-WebSocket-Accept响应头,这个过程是为了验证连接确实是WebSocket连接,防止非WebSocket连接的恶意请求。理解这一机制对于进行WebSocket通信和相关逆向工程非常重要。

以下是一些中文资料,您可以通过这些资料深入了解WebSocket协议中`Sec-WebSocket-Accept`值的生成过程及其重要性:1. [WebSocket协议浅析](https://itimetraveler.github.io/2018/10/27/WebSocket%E5%8D%8F%E8%AE%AE%E6%B5%85%E6%9E%90/) - 这篇文章提供了对WebSocket协议的基础分析,包括`Sec-WebSocket-Accept`和`Sec-WebSocket-Key`的作用。2. [响应头'Sec-WebSocket-Accept'的生成原创](https://blog.csdn.net/moasp/article/details/119915825) - 这篇文章详细讲解了`Sec-WebSocket-Accept`的生成原理和过程。3. [你不知道的Websocket协议,这次给你讲明白!](https://www.51cto.com/article/774923.html) - 这篇文章全面介绍了WebSocket协议的握手过程,包括`Sec-WebSocket-Accept`值的作用。这些资料将帮助您更好地理解WebSocket协议的工作原理,特别是握手阶段`Sec-WebSocket-Accept`值的生成和验证过程。
代码解析学习:

异步websocket爬虫:

# pip install websocketsimport websockets
import asyncio
import requests
# 发送  加密参数def req_html():# 写翻页功能res = requests.get('https://api.waitwaitpay.com/api/vendors/nearby?keyword=%E7%82%B8%E9%B8%A1&latitude&longitude&page=1&request_id=-1&type=search&with_vouchers=false',headers={'user-agent':'adasdasdasd'})return resasync def echo(websocket):message = '我是发送给客户端的信息'# 发送数据# 可以给他传 密文  发送给浏览器解密res = req_html()sent_text = res.textawait  websocket.send(sent_text)return  True# 接收  客户端返回的数据
async def recv_msg(websocket):while 1:# 接收resv_text = await websocket.recv()print(resv_text)with open('sss.txt','w',encoding='utf-8') as f:f.write(resv_text)# 入口
async def main_run(websocket):await echo(websocket)await recv_msg(websocket)stat_sever = websockets.serve(main_run,'127.0.0.1',9999)
print('成功建立连接')
loop = asyncio.get_event_loop()
loop.run_until_complete(stat_sever)# 保持长连接 需要不断的监听返回的数据
loop.run_forever()
目标:
  1. 找到接口了,响应的data值是加密后的。请求值也是加密的。(先尝试解密,不行的话可以看视频学补环境)
 wss_url = f"wss://www.jdz.gov.cn/1ywuKELSO2ahQuWZ/pr/{dGg2aCfMMK97Ro270mqBFu5qjC8TQbL2opnHvbEpM}/b/ws/{tableid}/{FW9uCWqlVzC22m1KfCMCjfvFHpRMsgt}"{dGg2aCfMMK97Ro270mqBFu5qjC8TQbL2opnHvbEpM}:Tifz8hd5p4O3AB%2BivrbJpAQR5gK2baZcp_zGlOnSooM%3D{tableid}:kmz6tx452s{FW9uCWqlVzC22m1KfCMCjfvFHpRMsgt}:6727e0bb-2881-405a-8056-6fa8b01d8581结果发现这里URL中加密的字段有两个都能在cookie信息中找到,说明是自动生成的。
报错:
  1. 错误的消息格式:客户端发送给服务器的消息格式可能不正确,不符合服务器期望的格式。这可能包括错误的数据编码、不正确的消息结构等。
  2. 服务器内部错误:服务器在处理客户端的WebSocket请求时内部出现错误,导致无法正确处理请求。

下面是分析过程。后续会优化,有需要的找我要。

测试:苹果兴趣人群-23-8

接口为:https://strategy.tmall.com/api/scapi?path=/api/v1/custom/listPerspective

响应信息如下:

{"throwed": false,"gmtModified": 1693274807000,"statusInfo": "","isReplace": false,"description": "","crowdAdbStatus": 1,"baseId": "026130413","source": "STRATEGY_CUSTOM","isThrowed": false,"uniMemberReportAuth": null,"syncValid": true,"inheritable": false,"rootSource": null,"gmtUpdate": 1693274807000,"uniMemberReportInfo": null,"validInDatahub": false,"perspective": 1,"id": 67080221,"gmtUpdateReal": null,"blurred": true,"statusInfoCode": 0,"category2": "STRATEGY_CUSTOM","category3": "STRATEGY_CUSTOM","canUpdate": true,"crowdDivisionStatus": null,"reportId": 7905461,"category1": "STRATEGY_CUSTOM","withConditionGroup": true,"count": 3500000,"gmtCreate": 1693274697000,"customType": "","fullLinkPlatform": "NOT_FULL_LINK","brandId": "64284","updateSettedFlag": false,"name": "苹果兴趣人群-23-8","reportStatusInfo": "","sourceName": null,"smartId": 914,"projectId": 183575,"status": "CREATED"},
苹果兴趣人群-23-8和 苹果已购人群-23-6
 test = {"method": "/iSheetCrowdService/offline","headers": {"rid": "171386533324303","type": "PULL","bizType": "STRATEGY"},"body": {"args": {"id": "661","perspectTaskId": "67080221","bizParam": {"crowdIds": ["67080221"],"tagList": ["daas_tag_pred_age_level_20200415093010"]},"appId": "209"}}}
对应的数据包名分别是:
预测年龄:[“daas_tag_pred_age_level_20200415093010”]
预测性别daas_tag_pred_gender_20200415091417
预测购买力:pref_purchasing_power
预测教育程度:daas_tag_pred_education_degree_20200421154731
预测省份:common_receive_province_180d
占比:rate
全网TGI对应tgi
兴趣偏好:interest_prefer
预测职业:pred_career_type
天猫通用消费人群意愿daas_tag_xfqx_crowd_name
月均消费金额:derive_pay_ord_amt_6m_015_range

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序webview和小程序通讯

1.背景介绍 1.1需要在小程序嵌入vr页面,同时在vr页面添加操作按钮与小程序进行通信交互 1.2 开发工具:uniapp开发小程序 1.3原型图 功能:.点击体验官带看跳转小程序的体验官带看页面 功能:点击立即咨询唤起小程序弹窗打电话 2.…

RPA机器人怎么操作知乎好物推荐自动点击【添加】商品按钮?

先看需要实现的效果(启动机器人-点击收益(打开商品卡片列表)-点击添加(自动添加商品卡片到文章)): 学员提问: 知乎上点击好物推荐【添加】商品按钮,iframe的元素是动态的…

表情识别 | 卷积神经网络(CNN)人脸表情识别(Matlab)

表情识别 | 卷积神经网络(CNN)人脸表情识别(Matlab) 目录 表情识别 | 卷积神经网络(CNN)人脸表情识别(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab使用卷积神经网络(CNN),进行人脸表情情绪识别…

数据结构(九)---并查集

目录 1.集合 2.集合的相关操作 (1)查(Find): •Find操作的优化 (2)并(Union): •Union操作的优化 1.集合 数据元素之间的逻辑关系可以为集合,树形关系,线性关系,图关系。对于集合而言,一个集合可以划…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上部署神经网络之指纹识别(Pytorch)的数据准备和模型训练过程等,…

Chrome 网络调试程序 谷歌网络调试 network

目录 1.网络面板总览2.概况了解3.Waterfall接口排队等待时间4.关注请求接口的Size,可能是占据内存溢出的接口5.过滤器一栏 fetch/xhr 什么意思6. Stalled 什么意思7.Queueing 什么意思8.Queueing和Stalled之间什么关系9.为什么会有阻塞状态10.Time列是pending 什么意思 1.网络面…

宏基因组|使用MEGAHIT组装

简介 MEGAHIT 是一款超快速且内存高效的下一代测序(NGS)组装工具,专门针对宏基因组进行了优化,同时在处理常规单个基因组(小型或哺乳动物规模)以及单细胞组装任务时也有出色表现。 主要特点与功能&#x…

node.js egg.js

Egg 是 Node.js 社区广泛使用的框架,简洁且扩展性强,按照固定约定进行开发,低协作成本。 在Egg.js框架中,ctx 是一个非常核心且常用的对象,全称为 Context,它代表了当前 HTTP 请求的上下文。ctx 对象封装了…

数据库和表创建练习

一丶要求 1.创建一个数据库db_classes 2 创建一行表db_hero 3. 将四大名著中的常见人物插入这个英雄表 二丶创建db_classes一个数据库, 使用数据库默认的字符集 create database db_classes; 三丶创建一行表db_hero 1.先切换到我们创建的db_classes;数据库中 use db_class…

怎么从回收站恢复已删除的文件?(5种恢复方法)

回收站是电脑操作系统中的一个特殊目录,用于存储被删除但尚未完全清除的文件和文件夹。当用户删除文件或文件夹时,它们并不立即从硬盘驱动器中移除,而是被移动到回收站。这样设计的目的是为了给用户一个“第二次机会”,如果他们意…

nvm的下载与安装

nvm(Node Version Manager)是一个用于管理 Node.js 版本的工具,它允许您在同一台计算机上安装和切换不同的 Node.js 版本。 一、下载地址 https://github.com/coreybutler/nvm-windows/releases 二、安装nvm 三、设置环境变量 在命令提示…

linux系统-FTP服务配置

目录 一、FTP简介 1.什么是FTP??? 2.FTP的两种模式 二、安装配置FTP服务 1.关闭防火墙和核心防护 2.安装VSFTPD 3.修改配置文件 4.黑白名单设置 一、FTP简介 1.什么是FTP?&…

uniapp-css多颜色渐变:左右+上下

案例展示 案例代码&#xff1a; 代码灵感&#xff1a;使用伪类进行处理 <view class"headBox"></view>.headBox {height: 200rpx;background: linear-gradient(to right, #D3D5F0, #F0DCF3, #F7F6FB, #DAE8F2, #E1D3EE);position: relative; }.headBox…

理解归并排序的两种方法(超详细)

目录 前言 一.方法一&#xff1a;归并排序 1.1 归并思路 1.1.1 递归(分解) 1.1.2 区间(排序) 1.1.3 合并拷贝回原数组(合并) 二.归并排序过程 2.1 递归(分解)图解 2.2 归并有序区间(排序)图解 2.2.1 单独一趟排序 2.2.2 有序区间递归排序 2.2.3 数组拷贝(合并) 2.3 归并全部代码…

SpringCloud(微服务介绍,远程调用RestTemplate,注册中心Nacos,负载均衡Ribbon,环境隔离,进程和线程的区别)【详解】

目录 一、微服务介绍 1. 系统架构的演变 1 单体架构 2 分布式服务 3 微服务 2. SpringCloud介绍 SpringCloud简介 SpringCloud版本 3. 小结 二、远程调用RestTemplate【理解】 1. 服务拆分 1 服务拆分原则 2 服务拆分示例 1) 创建父工程 2) 准备用户服务 1. 用户…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

Appium一本通

Appium介绍 概念&#xff1a;Appium是一个移动App(手机应用)自动化工具。 用途&#xff1a;重复性任务、爬虫、自动化测试。 特点&#xff1a;开源免费、多平台支持(ios\android)、多类型支持(native\webview)、类selenium支持多语言(java\python\js\ruby) Appium原理 三个主…

Java中的ArrayList

ArrayList<E>的特点 可调整大小的数组实现 <E>:是一种数据类型 ArrayList的构造方法 ArrayList list new ArrayList();创建一个空的集合对象 package dayhou40.day45; ​ import java.util.ArrayList; ​ public class Arraylisttest {public static void ma…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心&#xff0c;在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍&#xff0c;感兴趣可以参考安装。 背…

python使用opencv对图像的基本操作(2)

13.对多个像素点进行操作&#xff0c;使用数组切片方式访问 img[i,:] img[j,:] #将第j行的数值赋值给第i行 img[-2,:]或img[-2] #倒数第二行 img[:,-1] #最后一列 img[50:100,50:100] #50-100行&#xff0c;50-100列&#xff08;不包括第100行和第100列&#xff09; img[:100…