轻松绕过 Graphql 接口爬取有米有数的商品数据

有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql。所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输。

模拟登录,获取 sessionId

调用登录接口,进行模拟登录。

cookies = {}
headers = {}
json_data = {
'operationName': 'userLogin',
'query': 'mutation userLogin(\n $account: String!\n $password: String!\n $appId: String\n $goto: String\n $riskData: JSON\n $keep_login: Int\n $confirm_agreement: Int\n $params: JSON\n ) {\n login(\n account: $account\n password: $password\n appId: $appId\n goto: $goto\n riskData: $riskData\n keep_login: $keep_login\n confirm_agreement: $confirm_agreement\n params: $params\n ) {\n \n user {\n user_id\n mobile\n email\n wx_union_id\n mobile_verified\n email_verified\n register_at\n extendInfo {\n industry\n duty\n company\n contact_name\n wx_nickname\n avatar\n }\n }\n\n goto\n }\n }',
'variables': {
'keep_login': 1,
'account': 'xxx',
'password': 'xxx',
'params': {
'app_id': '',
'goto': 'https://finance.youcloud.com/account/password',
},
'appId': '',
'goto': 'https://finance.youcloud.com/account/password',
},
} response = requests.post('https://api-auth.youcloud.com/graphql', cookies=cookies, headers=headers, json=json_data)
print(response.cookies.items())

从 Cookie 数据中,获取到的 sessionId。

[('sessionId', 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJqdGkiOiI5SDVNMFI3TEFGMVdVNjQ0NWYwYTY4YzZhZiIsImV4cCI6MTY4NDg5NzE5MCwic3ViIjoiNzY4MDY4In0.JeVFFbkIQxe60SwBGqBj93q13OP5ZtA8vC__9ymQwf_wOxfIxooiD4n5TMRPWjRl8ITnHlAEEDxttCxCZ4z8ww')]

爬取商品列表数据

将上面获取到的 sessionId,应用到其他接口;这里调用商品列表接口。

cookies = {
'sessionId': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJqdGkiOiJZMzBEMzM1OU4yUjJBNjQ0M2EwNmVjYmQxYyIsImV4cCI6MTY4NDc0NTU4Miwic3ViIjoiNzY4MDY4In0.li3sxOomDNH7fiA06uMDmLn4cjAZRPWHwx9liHD3yT4iitbAv4EkIFohoHr1o3_CmrZzTPtuB-hq3EJsc0njfQ',
} headers = {} json_data = {
'operationName': 'productRealTimeList',
'query': '\n query productRealTimeList (\n $site_id: String\n $category: String\n $promotionType: String\n $shopType: String\n $hasBrand: String\n $min_qs_incr_24h: String\n $max_qs_incr_24h: String\n $min_qs_incr_12h: String\n $max_qs_incr_12h: String\n $min_qs_incr_6h: String\n $max_qs_incr_6h: String\n $min_qs_total: String\n $max_qs_total: String\n $min_qs_incr_day: String\n $max_qs_incr_day: String\n $min_qs_incr_amount_day: String\n $max_qs_incr_amount_day: String\n $page: Int!\n $sort: ProductListSort!\n $min_measure: String\n $max_measure: String\n $isExport: Boolean!\n ) {\n productRealTimeList (\n site_id: $site_id\n category: $category\n promotionType: $promotionType\n shopType: $shopType\n hasBrand: $hasBrand\n min_qs_incr_24h: $min_qs_incr_24h\n max_qs_incr_24h: $max_qs_incr_24h\n min_qs_incr_12h: $min_qs_incr_12h\n max_qs_incr_12h: $max_qs_incr_12h\n min_qs_incr_6h: $min_qs_incr_6h\n max_qs_incr_6h: $max_qs_incr_6h\n min_qs_total: $min_qs_total\n max_qs_total: $max_qs_total\n min_qs_incr_day: $min_qs_incr_day\n max_qs_incr_day: $max_qs_incr_day\n min_qs_incr_amount_day: $min_qs_incr_amount_day\n max_qs_incr_amount_day: $max_qs_incr_amount_day\n sort: $sort\n page: $page\n min_measure: $min_measure\n max_measure: $max_measure\n isExport: $isExport\n ) {\n data {\n product {\n \n id @skip(if: $isExport)\n category @skip(if: $isExport) {\n \n id\n name\n\n }\n header_image @skip(if: $isExport) {\n \n path\n\n }\n url\n title\n price\n site {\n \n id\n name\n icon\n\n }\n shop {\n \n id\n name\n qualification_url\n dsr\n\n has_brand\n talent {\n \n uid\n avatar_url\n nickname\n\n track_url\n }\n }\n seller_company {\n \n id\n screenName\n\n }\n first_monitor_time\n modify_time\n isNew @skip(if: $isExport)\n\n }\n promotionType {\n \n id\n name\n shortName\n\n }\n measureValue\n qs_incr_24h\n qs_incr_24h_ratio\n qs_incr_12h\n qs_incr_6h\n qs_incr_3h\n qs_incr_1h\n qs_amount_incr\n qs_total\n }\n total\n limit\n }\n }\n ',
'variables': {
'site_id': '10501',
'sort': 'qs_incr_24h',
'page': 1,
'isExport': False,
},
} response = requests.post('https://api.youshu.youcloud.com/graphql', cookies=cookies, headers=headers, json=json_data)
print(response.json())

返回的数据结果,这里只展示部分数据。

{
'data': {
'productRealTimeList': {
'data': [{
'product': {
'id': 'wlI57Tgth3VaIt6gNOKwfAU=',
'category': [{
'id': '110',
'name': '食品饮料'
}, {
'id': '11002',
'name': '休闲食品'
}, {
'id': '1100203',
'name': '饼干蛋糕'
}, {
'id': '1100203041',
'name': '传统糕点'
}],
'header_image': {
'path': 'https://lp-ag.umcdn.cn/5414a5c887fe3848a70068b22bd438f2/material.jpeg?x-oss-process=image/resize,m_lfit,w_552/quality,Q_80/format,jpg/interlace,1/watermark,size_16,text_5oqW5bqX,shadow_0,t_80,x_16,y_8,color_ffffff,g_sw/watermark,size_16,text_5oqW5bqX,shadow_0,t_80,x_16,y_8,color_212329,g_se'
},
'url': 'https://link.youcloud.com?app_id=youshu&goto=https%3A%2F%2Fhaohuo.jinritemai.com%2Fviews%2Fproduct%2Fdetail%3Fid%3D3609573286356382944',
'title': '【9.9元150包】宣美乐小麻花香酥可口休闲解馋零食六种口味混合',
'price': '9.9',
'site': {
'id': '10502',
'name': '抖店',
'icon': 'dd'
},
'shop': {
'id': 'wlI57Tgth3Vat2sz_laEd3I=',
'name': '宣美樂食品旗舰店',
'qualification_url': 'https://link.youcloud.com?app_id=youshu&goto=https%3A%2F%2Flb.jinritemai.com%2FshopQualification%3FshopId%3DMIjPNXI%26shopName%3D%E5%AE%A3%E7%BE%8E%E6%A8%82%E9%A3%9F%E5%93%81%E6%97%97%E8%88%B0%E5%BA%97',
'dsr': '4.82',
'has_brand': '0',
'talent': {
'uid': '4363307679752784',
'avatar_url': 'https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_9b49ae8d11db430bb8815416f7a0f286.jpeg?from=116350172',
'nickname': '宣美樂食品旗舰店',
'track_url': '/kol/4363307679752784/overview'
}
},
'seller_company': {
'id': '',
'screenName': '-'
},
'first_monitor_time': '2023.04.07 16:15',
'modify_time': '2023.04.24 10:34',
'isNew': False
},
'promotionType': [{
'id': '1',
'name': '广告',
'shortName': '广告'
}, {
'id': '3',
'name': '直播',
'shortName': '直播'
}],
'measureValue': '1,000',
'qs_incr_24h': '232.81万',
'qs_incr_24h_ratio': '-23%',
'qs_incr_12h': '65.29万',
'qs_incr_6h': '17.07万',
'qs_incr_3h': '11.73万',
'qs_incr_1h': '6.88万',
'qs_amount_incr': '2409.26万',
'qs_total': '2126.82万'
}],
'measureValue': '1,000',
'qs_incr_24h': '37.76万',
'qs_incr_24h_ratio': '-7%',
'qs_incr_12h': '14.25万',
'qs_incr_6h': '6.51万',
'qs_incr_3h': '4.98万',
'qs_incr_1h': '2.97万',
'qs_amount_incr': '462.52万',
'qs_total': '312.04万'
],
'total': 1487478,
'limit': 20
}
}
}

小结

  • 有米有数数据接口使用的是 graphql 查询语言。
  • 调用登录接口,获取到 sessionId。
  • 使用 sessionId 便可以爬取到商品数据。
  • 最后,声明本篇文章仅供学习参考,网络不是法外之地,切勿进行非法用途
  • 源代码 Github 地址:https://github.com/yxhsea/mock_login/tree/master/youcloud

轻松绕过 Graphql 接口爬取有米有数的商品数据的更多相关文章

  1. python3 爬取boss直聘职业分类数据(未完成)

    import reimport urllib.request # 爬取boss直聘职业分类数据def subRule(fileName): result = re.findall(r'<p cl ...

  2. python3 爬取汽车之家所有车型数据操作步骤(更新版)

    题记: 互联网上关于使用python3去爬取汽车之家的汽车数据(主要是汽车基本参数,配置参数,颜色参数,内饰参数)的教程已经非常多了,但大体的方案分两种: 1.解析出汽车之家某个车型的网页,然后正则表 ...

  3. 04 Python网络爬虫 <<爬取get/post请求的页面数据>>之requests模块

    一. urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib ...

  4. 爬取掌阅app免费电子书数据

    主要介绍如何抓取app数据及抓包工具的使用,能看到这相信你已经有爬虫基础了 编不下去了,主要是我懒,直接开干吧! 一.使用环境和工具 windows + python3 + Jsonpath + Ch ...

  5. 甜咸粽子党大战,Python爬取淘宝上的粽子数据并进行分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 爬虫 爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览 ...

  6. Python开发爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据

    所谓静态页面是指纯粹的HTML格式的页面,这样的页面在浏览器中展示的内容都在HTML源码中. 目标:爬取豆瓣电影TOP250的所有电影名称,网址为:https://movie.douban.com/t ...

  7. Scrapy实战篇(七)之爬取爱基金网站基金业绩数据

    本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...

  8. Python转页爬取某铝业网站上的数据

    天行健,君子以自强不息:地势坤,君子以厚德载物! 好了废话不多说,正式进入主题,前段时间应朋友的请求,爬取了某铝业网站上的数据.刚开始呢,还是挺不愿意的(主要是自己没有完整的爬取过网上的数据哎,即是不 ...

  9. Scrapy实战篇(二)之爬取链家网成交房源数据(下)

    在上一小节中,我们已经提取到了房源的具体信息,这一节中,我们主要是对提取到的数据进行后续的处理,以及进行相关的设置. 数据处理 我们这里以把数据存储到mongo数据库为例.编写pipelines.py ...

  10. Scrapy实战篇(一)之爬取链家网成交房源数据(上)

    今天,我们就以链家网南京地区为例,来学习爬取链家网的成交房源数据. 这里推荐使用火狐浏览器,并且安装firebug和firepath两款插件,你会发现,这两款插件会给我们后续的数据提取带来很大的方便. ...

随机推荐

  1. cmd中怎么清屏--cls

    平时我们在 Linux 系统中清除屏幕 用的命令是:  clear 现在在Windows上用的清屏命令是 : cls

  2. Hive 查看,删除分区

    查看所有分区 show partitions 表名; 删除一般会有两种方案 1.直接删除hdfs文件 亲测删除hdfs路径后 查看分区还是能看到此分区 可能会引起其他问题 此方法不建议 2. 使用删除 ...

  3. android android7以上无法连接蓝牙

    前言 在开发android 蓝牙的时候,发现一个问题,那就是android7无法连接上蓝牙. 原因 <!-- 管理蓝牙设备的权限 --> <uses-permission andro ...

  4. 英语 one day

    前言 I do not know if it work,but just go. 内容 1.quote vt:摘要,引用 n:引语 He quote a passage from the presid ...

  5. 重走py 之路 ——列表(一)

    前言 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>>这本书的时候觉得对有基础的有很多的赘余,打算 ...

  6. Flask、Tornado、Nginx搭建Https服务

    其实Flask可以直接用tornado部署就行: # coding=utf-8 from tornado.wsgi import WSGIContainer from tornado.httpserv ...

  7. java操作xml超简单的方法

    用dom4j?SAX?no,no,no,光看api和帮助文档就烦,有没有更简单的方法呢?答案是有的. 那就是默默无名的:JAXB jaxb是啥? 摘抄一段度娘百科的介绍: JAXB能够使用Jackso ...

  8. 力扣580(MySQL)-统计各专业人数(中等)

    题目: 一所大学有 2 个数据表,分别是 student 和 department ,这两个表保存着每个专业的学生数据和院系数据. 写一个查询语句,查询 department 表中每个专业的学生人数 ...

  9. Ingress Nginx 接连披露高危安全漏洞,是否有更好的选择?

    简介: 在<K8s 网关选型初判:Nginx 还是 Envoy>一文中,我们已经给出了这个新的选项:MSE 云原生网关.本文继续展开分析,为何 MSE 云原生网关有更好的安全性保障. 作者 ...

  10. [FAQ] Solidity 实现倒计时 (count down) ?

    思路:一种方式是使用 ethereum-alarm-clock,另一种是合约实现当前过去了多少时间,外部进行不间断调用获得. Any else? Refer:Solidity能倒计时吗 Link:ht ...