Python爬虫 | 不再多花一分钱

马上就要618了,准备好剁手了吗,其实你会发现其实618买东西并不会便宜多少,甚至还可能比平时贵一点(别问我为什么知道,我就遇到过),还要和平台商家勾心斗角的,稍有不慎就会进坑。最近发现一个浏览器插件-购物党,这个插件可以帮助我们了解过去一段时间的价格趋势。

5335f703c852ceaa3e3a26edf71f520f.jpeg
图1


目录:

1、分析请求

2、代码实现

1、分析请求

如图1的价格趋势,其实我们需要的只是活动价的数据,点击进入历史促销明细。这个网站的价格都乘了100,也就是说77.9在接口返回时其实是7790,如下图1-1,通过ctrl+F轻松找到数据接口。

3b5f726566ca355b5d9cf965b54877c0.jpeg
图1-1

接下来就是查看是不是有加密,我的习惯是直接用postman生成一段测试代码,跑一下就知道了,具体可以查看以下链接。

coder-谢公子:3秒完成一个标准的请求头

6dd653f006654680a4f751555d8629fd.jpeg
图1-2


1、代码实现

在从postman拿到的测试代码上进行修改,postman拿到的headers中包含了cookie,先把cookie去掉,查看是不是可以正常请求。

3b451d26b4e85633da471ebdfa9b1717.jpeg
图2-1

貌似可以正常请求,但其实返回的数据并不是我们需要的数据,只有带着cookie请求才可以拿到数据。一开始以为碰到硬骨头了,准备研究cookie的生成逻辑,但我突发奇想着随意改了改这cookie的密文,看看能否成功请求。结果可以正常拿到数据?

edcb293d8ceae5688938eaab6d5986f3.png

换个url试试,居然也可以,后台都检测一下的吗?我一开始以为这个加密逻辑怎么也是产品id加时间戳进行各种加密,不检测也好省心咯。

但在我进行了大量的爬取时,发现时不时就会有一次无法爬取的情况,能请求成功就说明代码是没有问题的,只是可能有什么细节没注意到。再仔细看看headers有什么需要注意的。发现cookie中有一个类似时间戳的数字,读取一个时间戳来对比一下就可以知道这串数字就是时间戳,那我将这个参数跟随着系统时间一起变化就好了。

1ac7420e8a2c25e23787a79612c945ee.jpeg
图2-2

实现代码:

headers = {
    'authority': 'www.gwdang.com',
    'accept': 'application/json, text/javascript, */*; q=0.01',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cookie': '__utmz=188916852.1653471417.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; '
              'guid=bd8119f3309e6edac2d682121f2d9223; addFavor=1; fp=c30542ecc0c82d26c5ae98c1e5724544; '
              'Hm_lvt_7705e8554135f4d7b42e62562322b3ad=1654486412,1654666331,1654756678,1655101071; '
              'fp=c30542ecc0c82d26c5ae98c1e5724544; __utma=188916852.67656521.1653471417.1654762020.1655101071.8; __utmc=188916852; '
              'dfp=0H88kUZe0VJM0H88kUZM0H88kUPe0H88kUZM0CM8kUZM0CZ8kUZe6q080UcN0UP5; '
              'downloadPageShow=1; PHPSESSID=afh5mjv52rrsbfm7phhd4njhn3; __utmb=188916852.10.10.1655101071; '
              f'Hm_lpvt_7705e8554135f4d7b42e62562322b3ad={int(time.time())}; ',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36',
    'x-requested-with': 'XMLHttpRequest'
}
url = 'https://www.gwdang.com/trend/data_www?dp_id=100018349680-3&show_prom=true&v=2&get_coupon=2&price='
response = requests.request("GET", url, headers=headers)
result = response.json()
date, price, promotion, promotion_way = [], [], [], []
for i in result['promo_detail']:
    print(i)
    price.append(i['price']/100)
    promotion.append(i['msg'][0]['tag'])
    promotion_way.append(i['msg'][0]['text'])
    date.append(get_standard_date(i['time']))

运行结果:

95863831edc8a7da9e3391c4db68c3c0.jpeg
图2-3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值