爬虫案例学习6

获取淘宝商品数据2024-12-18

参考学习:
大佬博客
视频教程
通过搜索发现,数据是通过发送请求过来的,不是静态存在源代码的
在这里插入图片描述
所以我们需要请求这个接口获取数据:比如标题,价格,图片等信息
https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/
但是我们直接发请求,携带上参数,无法获取到数据,会返回非法请求的字样。
因为有个参数sign是加密的,我们需要逆向

逆向参数获取sign

sign参数:貌似是一些参数经过哈希加密算法之后生成的32位小写加密参数。
具体的需要查看对应的js
点击main.js
在这里插入图片描述
在这里插入图片描述
搜素sign:相关的,分析
在这里插入图片描述
eT = eE(em.token + "&" + eC + "&" + eS + "&" + ep.data)这一行就是生成sign
在这里插入图片描述
点击断点,可以查看变量的值
不过这里推荐打断点的时机,先鼠标滚动到下面的页码处,再接着打断点,点击下一页,此时进入js源码的参数才是正确的。
如果不这样做,鼠标滚轮下滑也进入了断点,ep.data的值不是我们需要的,需要放行很多次。
在这里插入图片描述
在这里插入图片描述
切换到控制台,输出这些值,等一下在python代码中需要使用,这里先记录一下

eE(em.token + "&" + eC + "&" + eS + "&" + ep.data) # 返回值是sign的值
em.token
eC 
eS 
ep.data

在这里插入图片描述

获得sign 8a3593958c55ff4115e359745dc9a665是0-9,a-f MD5加密的字符串
我们需要带代码中生成sign

构建字符串MD5加密

#构建字符串str = em.token + "&" + eC + "&" + eS + "&" + ep.data
#Ec是时间
def getSign(eC):
    em = 'cbee62bc9b064d508514dd6eb1c6cebd' # em变量存储token
    eS = '12574478'
    # signParam 是ep.data中的params字段
    signParam = {
	"device": "HMA-AL00",
	"isBeta": "false",
	"grayHair": "false",
	"from": "nt_history",
	"brand": "HUAWEI",
	"info": "wifi",
	"index": "4",
	"rainbow": "",
	"schemaType": "auction",
	"elderHome": "false",
	"isEnterSrpSearch": "true",
	"newSearch": "false",
	"network": "wifi",
	"subtype": "",
	"hasPreposeFilter": "false",
	"prepositionVersion": "v2",
	"client_os": "Android",
	"gpsEnabled": "false",
	"searchDoorFrom": "srp",
	"debug_rerankNewOpenCard": "false",
	"homePageVersion": "v7",
	"searchElderHomeOpen": "false",
	"search_action": "initiative",
	"sugg": "_4_1",
	"sversion": "13.6",
	"style": "list",
	"ttid": "600000@taobao_pc_10.7.0",
	"needTabs": "true",
	"areaCode": "CN",
	"vm": "nw",
	"countryNum": "156",
	"m": "pc",
	"page": 2,
	"n": 48,
	"q": "%E8%A3%A4%E5%AD%90",
	"qSource": "url",
	"pageSource": "",
	"tab": "all",
	"pageSize": "48",
	"totalPage": "100",
	"totalResults": "137306",
	"sourceS": "0",
	"sort": "_coefp",
	"bcoffset": "-13",
	"ntoffset": "13",
	"filterTag": "",
	"service": "",
	"prop": "",
	"loc": "",
	"start_price": None,
	"end_price": None,
	"startPrice": None,
	"endPrice": None,
	"categoryp": "",
	"ha3Kvpairs": None,
	"couponFilter": 0,
	"myCNA": "4PjnHzPgIA0CARsm5jekDfQ+"
}

在这里插入图片描述
json在线格式化
在这里插入图片描述
复制到python的函数的signParam字典中,将null值修改为None
接着继续完善getSign函数的MD5加密工作
import hashlib

 n = json.dumps(signParam)
    # print(json.dumps(json.dumps(signParam)))
    data = {
        "appId": "34385",
        "params": n
    }
    # print(data)
    n_data = json.dumps(data).replace(" ", "")
    eC= "1734492057250" # 时间戳
    str = em + "&" + eC + "&" + eS + "&" + json.dumps(data).replace(" ","")
    # print(str)
    MD5 = hashlib.md5()
    MD5.update(str.encode("utf-8"))
    sign = MD5.hexdigest()
    return sign,n_data

调用函数,获取签名sign,上面的时间戳我是写死静态可,可以删除,改为动态的,
等一下在完整源码中会修改为动态当前时间戳

date_time = str(int(time.time() * 1000))
sign,n = getSign(eC = date_time)
# print(sign)
# f94586b665e0d865a20aa6d3acf708f3

有了sign,就可以发起请求,获取数据了,直接上完整源码
请求数据所在的api接口
https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/

完整源码

# 可以运行版
# 获取淘宝数据:https://s.taobao.com/
# 搜索键盘相关数据,会自动拦截登录页面(所以需要cookie)
import csv
import time

import requests
from pprint import pprint
import hashlib
import json
import re
url = "https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Referer": "https://s.taobao.com/",
    "cookie":"自己的cookie"
}
"""
 mtopjsonp6({"api":"mtop.relationrecommend.wirelessrecommend.recommend","data":{},"ret":["FAIL_SYS_ILLEGAL_ACCESS::非法请求"]
 sign参数每次请求都会变化,导致请求不到数据(参数sign逆向)
"""
# eE(em.token + "&" + eC + "&" + eS + "&" + ep.data)
def getSign(eC):
    em = 'db1e1adce046132af55f1e37728ca39b'
    eS = '12574478'
    signParam = {
	"device": "HMA-AL00",
	"isBeta": "false",
	"grayHair": "false",
	"from": "nt_history",
	"brand": "HUAWEI",
	"info": "wifi",
	"index": "4",
	"rainbow": "",
	"schemaType": "auction",
	"elderHome": "false",
	"isEnterSrpSearch": "true",
	"newSearch": "false",
	"network": "wifi",
	"subtype": "",
	"hasPreposeFilter": "false",
	"prepositionVersion": "v2",
	"client_os": "Android",
	"gpsEnabled": "false",
	"searchDoorFrom": "srp",
	"debug_rerankNewOpenCard": "false",
	"homePageVersion": "v7",
	"searchElderHomeOpen": "false",
	"search_action": "initiative",
	"sugg": "_4_1",
	"sversion": "13.6",
	"style": "list",
	"ttid": "600000@taobao_pc_10.7.0",
	"needTabs": "true",
	"areaCode": "CN",
	"vm": "nw",
	"countryNum": "156",
	"m": "pc",
	"page": 1,
	"n": 48,
	"q": "%E8%A3%A4%E5%AD%90",
	"qSource": "url",
	"pageSource": "",
	"tab": "all",
	"pageSize": "48",
	"totalPage": "100",
	"totalResults": "5000",
	"sourceS": "48",
	"sort": "_coefp",
	"bcoffset": "-26",
	"ntoffset": "0",
	"filterTag": "",
	"service": "",
	"prop": "",
	"loc": "",
	"start_price": None,
	"end_price": None,
	"startPrice": None,
	"endPrice": None,
	"categoryp": "",
	"ha3Kvpairs": None,
	"couponFilter": 0,
	"myCNA": "4PjnHzPgIA0CARsm5jekDfQ+"
}
    n = json.dumps(signParam)
    # print(json.dumps(json.dumps(signParam)))
    data = {
        "appId": "34385",
        "params": n
    }
    # print(data)
    n_data = json.dumps(data).replace(" ", "")
    str = em + "&" + eC + "&" + eS + "&" + json.dumps(data).replace(" ","")
    # print(str)
    MD5 = hashlib.md5()
    MD5.update(str.encode("utf-8"))
    sign = MD5.hexdigest()
    return sign,n_data

date_time = str(int(time.time() * 1000))
sign,n = getSign(eC = date_time)
print(sign)
params = {
'jsv': '2.7.4',
'appKey': '12574478',
't': date_time,
'sign': sign,
'api': 'mtop.relationrecommend.wirelessrecommend.recommend',
'v': '2.0',
'timeout': '10000',
'type': 'jsonp',
'dataType': 'jsonp',
'callback': 'mtopjsonp6',
'data': n
}
resp = requests.get(url,params=params, headers=headers)
# print(resp.text)
html = resp.text
# 采集数据
info = re.findall(r'mtopjsonp\d+\((.*)', html)[0].replace(')','')
# pprint(info)
jsonData = json.loads(info)
# 循环获取数据
with open('taobao.csv',mode="w",newline='',encoding="utf-8") as f:
    writer = csv.writer(f)
    # 写入表头
    head = ['标题','图片链接','价格','地区','销量','店铺']
    writer.writerow(head)
    for item in jsonData['data']['itemsArray']:
        dit = {
            'title': item['title'].replace('<span class=H>', '').replace('</span>',''),
            'img': item['pic_path'],
            'price': item['price'],
            'procity': item['procity'],
            'realSales': item['realSales'],
            'shopName': item['nick'],
        }
        writer.writerow(dit.values())
        print(dit)



在这里插入图片描述
在这里插入图片描述

注:需要获取其他数据

修改源码几个参数
url所在浏览器位置
在这里插入图片描述
改Referer和cookie
在这里插入图片描述

重写getSign函数的em值,eS值,signParam值
data中的appid也改
修改真正数据接口的参数:params
在这里插入图片描述
最后运行代码,即可获取数据
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习——9_Ubuntu Linux操作系统

Ubuntu Linux操作系统 Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shuttleworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布 Ubuntu是一个以桌面应用为主的Linux发行版操作系统 Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区…

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大&#xff0c;容错率低&am…

各向同性重建(3D荧光图像)

文章目录 一、基本知识1.1、各向同性&#xff08;isotropic&#xff09; 各向异性&#xff08;anisotropic&#xff09;1.2、像素尺寸 像素间距 像素分辨率1.3、点扩散函数&#xff08;PSF&#xff09;1.3.1、高斯函数 二维高斯PSF1.3.2、二维高斯PSF&#xff1a;代码生成 …

计算机毕业设计论文指导

计算机毕业设计论文指导 计算机毕业设计辅导一站式&#xff01;太香了&#x1f4aa; [赞R][赞R][赞R]嗨喽&#xff01;计算机专业的宝子们&#xff01; 计算机毕设辅导专业靠谱的他来了&#xff01;&#xff01; 是不是还在为选题程序不会做而感到苦难&#xff1f; 论文没思路赶…

【Windows版】opencv 和opencv_contrib配置

一、参考资料 &#xff08;四十一&#xff09;CMakeVSopencv/opencv_contrib 环境配置 从源码安装&#xff2f;penCV&#xff0c;使用python windowsvscodeopencv源码安装配置 二、关键步骤 1. opencv与opencv_contrib版本对齐 下载 opencv 下载 opencv_contrib opencv…

如何制作搞笑配音视频?操作方法

在数字娱乐盛行的今天&#xff0c;搞笑配音视频凭借其独特的幽默感和创意&#xff0c;在网络上赢得了大量观众的喜爱。如果你也想尝试制作一部让人捧腹的搞笑配音视频&#xff0c;那么请跟随以下步骤&#xff0c;从撰写搞笑文案到视频配音剪辑&#xff0c;一步步打造你的作品。…

C++手动实现一个HashMap

1.HashMap原理 参考我的博客&#xff1a;https://blog.csdn.net/Revendell/article/details/110009858 开链法&#xff1a;STL的hashtable便是采用开链法解决冲突。这种做法是在每一个表格元素中维护一个list&#xff1a;散列函数为我们分配某一个list&#xff0c;然后我们在…

threejs+vue3+js旋转词云

title: threejs date: 2024-12-11 09:50:41 tags: threes Threejs 双行可展示旋转词云显示。 一、简单案例——旋转球体 以下代码使用vue3jsthreejs技术站进行的搭建&#xff0c;其中包含了场景创建、相机创建、渲染器创建、物体材创建等相关流程&#xff0c;构建了一个简单…

RocketMQ源码分析(四) 延迟消息源码分析

0.前文 RocketMQ源码分析&#xff08;三&#xff09; 消费者 RocketMQ源码分析&#xff08;二&#xff09; 生产者 RocketMQ源码分析&#xff08;一&#xff09;broker启动&remoting抽象 1. 概述 RocketMQ的延迟消息是指消息发送到Broker后&#xff0c;不会立即被消费者…

嵌入式单片机中对应GPIO外设详解实现

一、GPIO外设详解 大家可以看到,函数库开发的时候外设的使用流程都是一样的,接下来就讲解一下细节。 l定义一个外设的结构体变量 变量命名规则 PPP_InitTypeDef PPP_InitStructure; 每个外设都有对应的结构体,结构体的定义一般都是存放在每个外设的头文件内,比如GPIO外…

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

目录 说明 效果 模型 项目 ​编辑 代码 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分&#xff0c;首先&#xff0c;ppyoloe-plus-x 对边界框进行预测&#xff0c;并对置信度较高的表格边界…

智源研究院与腾讯达成战略合作,推动大模型技术前沿探索和应用落地

2024 年 12 月 18日&#xff0c; 智源研究院与腾讯签署战略合作协议&#xff0c;双方将在大模型研发、人工智能技术前沿探索及开源生态建设等领域展开深入合作。智源研究院院长王仲远、副院长兼总工程师林咏华&#xff0c;腾讯集团高级执行副总裁、云与智慧产业事业群总裁汤道生…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

[SAP ABAP] ALV报表练习1

销售订单明细查询报表 业务目的&#xff1a;根据选择屏幕的筛选条件&#xff0c;使用 ALV 报表&#xff0c;显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面(部分截图) 完整代码如下所示 主程序(zsd001_437) *&----------------------------------…

Docker日志与监控

一、引言 随着容器技术在生产环境中被广泛应用&#xff0c;Docker容器的日志管理与监控变得尤为重要。在现代应用程序中&#xff0c;容器化的应用通常是由多个容器组成的服务&#xff0c;而容器中的日志与监控则是确保服务健康运行、诊断问题和优化性能的关键。通过日志和监控…

信号槽【QT】

文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…

3.zabbix中文设置

1、zabbix中文设置 2、中文乱码的原因 zabbix使用DejaVuSan.ttf字体&#xff0c;不支持中文&#xff0c;导致中文出现乱码。解决方法很简单&#xff0c;把我们电脑里面字体文件传到zabbix服务器上。 3、解决zabbix乱码方法 3.1、从Window服务器找到相应的字休复制到zabbix S…

电脑连接不上手机热点 找不到到服务器的ip地址

手机热点连接不上 找不到到服务器的ip地址 emmm希望不会有人不会吧 解决方法&#xff1a; 1.点击右上角图标进入设置 2.点击更改所有wifi网络的DNS设置 3.查看自己的IP分配和DNS分配是不是DHCP自动分配&#xff0c;不是的话就不对了&#xff0c;需要点击编辑手动改一下 4.改完…

计算机网络之王道考研读书笔记-2

第 2 章 物理层 2.1 通信基础 2.1.1 基本概念 1.数据、信号与码元 通信的目的是传输信息。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。码元是数字通信中数字信号的计量单位&#xff0c;这个时长内的信号称为 k 进制码…

MySQL数据库04|内置函数、存储过程、视图、事务、索引

目录 十三、MySQL常用内置函数 1、字符串函数 1️⃣拼接字符串&#xff1a;concat(str1,str2,…) 2️⃣包含字符个数&#xff1a;length(str) 3️⃣截取字符串&#xff1a;left(str,len)、right(str,len)、substring(str,pos,len) 4️⃣去除空格&#xff1a;ltrim(str)、r…