马上就要618了,准备好剁手了吗,其实你会发现其实618买东西并不会便宜多少,甚至还可能比平时贵一点(别问我为什么知道,我就遇到过),还要和平台商家勾心斗角的,稍有不慎就会进坑。最近发现一个浏览器插件-购物党,这个插件可以帮助我们了解过去一段时间的价格趋势。
目录:
1、分析请求
2、代码实现
1、分析请求
如图1的价格趋势,其实我们需要的只是活动价的数据,点击进入历史促销明细。这个网站的价格都乘了100,也就是说77.9在接口返回时其实是7790,如下图1-1,通过ctrl+F轻松找到数据接口。
接下来就是查看是不是有加密,我的习惯是直接用postman生成一段测试代码,跑一下就知道了,具体可以查看以下链接。
coder-谢公子:3秒完成一个标准的请求头1、代码实现
在从postman拿到的测试代码上进行修改,postman拿到的headers中包含了cookie,先把cookie去掉,查看是不是可以正常请求。
貌似可以正常请求,但其实返回的数据并不是我们需要的数据,只有带着cookie请求才可以拿到数据。一开始以为碰到硬骨头了,准备研究cookie的生成逻辑,但我突发奇想着随意改了改这cookie的密文,看看能否成功请求。结果可以正常拿到数据?
换个url试试,居然也可以,后台都检测一下的吗?我一开始以为这个加密逻辑怎么也是产品id加时间戳进行各种加密,不检测也好省心咯。
但在我进行了大量的爬取时,发现时不时就会有一次无法爬取的情况,能请求成功就说明代码是没有问题的,只是可能有什么细节没注意到。再仔细看看headers有什么需要注意的。发现cookie中有一个类似时间戳的数字,读取一个时间戳来对比一下就可以知道这串数字就是时间戳,那我将这个参数跟随着系统时间一起变化就好了。
实现代码:
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']))
运行结果: