Python爬虫之慢慢买历史低价爬取-【原创】

前话:

最近计划从Java转向爬虫,假期闲来无事想着找点事情做,于是就想着能不能把慢慢买的商品历史价格爬下来。(PS:作者平时购物喜欢使用慢慢买查看历史价格,不过用的是app :-)

正文

首先使用谷歌浏览器打开慢慢买网页,F12然后随意点击一个商品,查看接口:在这里插入图片描述
发现有我们需要的价格,然后再看看参数:
在这里插入图片描述
请求头:
在这里插入图片描述

emmm,参数挺简单的,只有一个cxid咱不知道,于是我看了一下网址:http://cu.manmanbuy.com/discuxiao_4076382.aspx。 emmm,参数这就齐全了?我马上打开Pycharm编写了如下代码:

import requests
resp = requests.get('http://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=&bjid=&spbh=&cxid=4076382&zkid=&w=310&token=')
print(resp.text)

输出:

{"datePrice":"[1602518400000,20.90,\"\"],[1602604800000,20.90,\"\"],[1602691200000,20.90,\"\"],[1602777600000,20.90,\"\"],[1602864000000,20.90,\"\"],[1602950400000,20.90,\"\"],[1603036800000,20.90,\"\"],[1603123200000,20.90,\"\"],[1603209600000,20.90,\"\"],[1603296000000,20.90,\"\"],[1603382400000,20.90,\"\"],[1603468800000,20.90,\"\"],[1603555200000,20.90,\"\"],[1603641600000,20.90,\"\"],[1603728000000,20.90,\"\"],[1603814400000,20.90,\"\"],[1603900800000,17.9000,\"\"],[1603987200000,17.90,\"\"],[1604073600000,17.90,\"\"],[1604160000000,17.90,\"\"],[1604246400000,17.90,\"\"],[1604332800000,17.90,\"\"],[1604419200000,17.90,\"\"],[1604505600000,17.90,\"\"],[1604592000000,17.90,\"\"],[1604678400000,17.90,\"\"],[1604764800000,17.90,\"\"],[1604851200000,17.90,\"\"],[1604937600000,17.90,\"\"],[1605024000000,17.90,\"\"],[1605110400000,17.90,\"\"],[1605196800000,17.90,\"\"],[1605283200000,17.90,\"\"],[1605369600000,17.90,\"\"],[1605456000000,17.90,\"\"],[1605542400000,17.90,\"\"],[1605628800000,17.90,\"\"],[1605715200000,17.90,\"\"],[1605801600000,17.90,\"\"],[1605888000000,17.90,\"\"],[1605974400000,17.90,\"\"],[1606060800000,17.90,\"\"],[1606147200000,17.90,\"\"],[1606233600000,17.90,\"\"],[1606320000000,17.90,\"\"],[1606406400000,17.90,\"\"],[1606492800000,17.90,\"\"],[1606579200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606665600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606752000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606838400000,15.36,\"购买5件,当前价:16.80,满减:满3件,打9.5折,优惠券:满69减3\"],[1606924800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607011200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607097600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607184000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607270400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607356800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607443200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607529600000,16.8,\"京东秒杀价:16.8\"],[1607616000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607702400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607788800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607875200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607961600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608048000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1608134400000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1608220800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608307200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608393600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608480000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608566400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608652800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608739200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608825600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608912000000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1608998400000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1609084800000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1609171200000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609257600000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609344000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609430400000,17.90,\"\"],[1609516800000,17.90,\"\"],[1609603200000,17.90,\"\"],[1609689600000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609776000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609862400000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],
...

因内容太长截取得时候省略了很多,对比了一下页面的信息可以发现,返回的dataPrice字段里的列表第一个是日期时间戳,第二个是价格,第三个是满减信息

我心想这就爬下来了?于是我就去搜索多找了几个商品实验了一下:
在这里插入图片描述
这是一个京东商品参数,emmm好像就是把cxid换成了bjid?于是我把bjid参数带回刚刚的代码测试发现也是能正常跑通的,查看了页面一下bjid能不能拿到
在这里插入图片描述
emmm,能拿到,没问题。但是前面两个bjid是0的是什么鬼?我又接着看bjid为0的两个商品在这里插入图片描述
竟然加载不出来?跳转过去看看在这里插入图片描述

竟然还有这样的页面,而且调的接口不是同一个?WF?还有这种操作,于是我又看了看参数在这里插入图片描述
竟然给多出了个token。emmm,这TM坑爹,不用想肯定是前端js生成的,只能开始慢慢debug js吧。

首先在左侧F12按下CTRL+F打开搜索框,搜索token(毕竟是token参数,js里总不能没有这个字符串吧)
在这里插入图片描述
观察了一下可以看到后面几个token都是在URL里的,这种肯定是先获取到token才会传参带上token的,就不用看了,主要浏览前面几个js文件。经过我的不懈观察,最终发现token是在cutomRequest.js文件里的,为什么呢?看下图:
在这里插入图片描述
里面有给token赋值的操作,而且仔细去看还有ajaxPost操作,这里暂不截图看下问,既然找到了token,那就好办了,点击Source进入源码(查看接口的上面的tab是network,source一般在network左侧)在这里插入图片描述
从之前的Network的图中可以发现cutomRequest.js文件是在tool.manmanbuy.com/Scripts目录下的,什么?你没看见?那我再给你截图标明一下:
在这里插入图片描述
这时候我们在source下打开刚刚的文件(谷歌浏览器打开源文件会有个pretty-print提示,要点确认啊,这是格式化js代码,不然眼镜看瞎了也照不出来),在刚刚token的位置打上断点,什么?断点也不会打?看下图
在这里插入图片描述
颜色变蓝了就是打上断点了,这时候再刷新页面就可以可以debug停顿和看到数据信息了
在这里插入图片描述
现在仔细看看参数,WF?都是什么鬼变量?不用看肯定是js混淆搞的鬼,既然这样从这个方法第一行开始debug(毕竟要知道入参才能知道token是怎么生成的嘛)
在这里插入图片描述
emmm,如此那一个method和一个商品链接,能拿到,那就往下debug。纳尼?你不知道怎么往下debug?要跳到哪一行就在哪一行打上断点然后点击右上角蓝色的向右箭头,第一个是定义变量不用管,跳到下面有个设置t参数:
在这里插入图片描述
鼠标选中悬停一会儿能够显示整个块运行的结果如上图,emmm,我js虽然不太好,但是大致意思应该是先new一个Date对象再调用valueOf方法把,继续去下一行在这里插入图片描述
emmm,看debug信息上面那行应该是生成一个当前时刻的毫秒级时间戳,可以拿去时间戳解析平台对比下,这里就不对比了。从上面的debug可以看出来,先要把传入的数据加上t参数存入当前时间戳,继续往下:
在这里插入图片描述
foreach应该是循环把,上面把数据的key提了并进行排序(按字符从小到大,这里就不截图了)出来,这里应该是遍历遍历key,继续往下:
在这里插入图片描述
如果是方法遍历的话点一下f这一行是可以跳转的,这一整块循环的逻辑大概是把之前参数的json对象复制到一个新的json对象,感兴趣的小伙伴可以自己去debug试试,这里就不占位置了,接着我们继续往下:
在这里插入图片描述
WF?secret又是啥子东东?我这里直接用快速探测法探测这个secret是不是固定的。WHAT?怎么探测?刷新几次页面等debug到这里对比几个值是不是一样的,如果是一样的大概率就是固定值。这里我测试了一下secret是固定的,所以直接记下来就可以了,再看之后的循环,简单debug了下,都是判断俩不等于的,而且都是成立的,所以咱直接看里层的逻辑就可以了:
在这里插入图片描述
又是嵌套函数,debug跳过去看看发现是求和函数,那就是求两个参数的和了,再看看两个参数:在这里插入图片描述
求和函数中又嵌套了一个调用函数,这破函数就是就是让xxx(a, b)变成a(b)函数调用,所以一个个参数和第二个参数都是要被encodeURIComponent调用,再看看俩参数是个啥:
在这里插入图片描述
发现第一个参数是key,第二个参数的链接,这。。。不就是刚刚json的key和value吗?那这个循环的逻辑应该就是对key和value进行urlencode编码再拼接?继续往下看:
在这里插入图片描述
果然如此,这一行又+=了一个secret,所以最后还会有一个secret,前面部分和我们分析的一致,继续往下走:
在这里插入图片描述
emmm,要转一次大写,再往下:在这里插入图片描述
emmm,hex_md5大家应该都能猜到是md5,md5完之后还要再转一次大写,这样token的生成就生成完了,我在这里把整个逻辑用代码写一遍就是:

import time
from urllib.parse import quote
import hashlib

def parse_req(d):
    # 设置当前时间ms
    d['t'] = int(time.time() * 1000)
    # 拷贝对象
    n = copy.deepcopy(d)
    # 提取key
    ks = list(n.keys())
    # key排序
    ks.sort()
    # secret
    ask = 'c5c3f201a8e8fc634d37a766a0299218'
    # token先拼一个secret
    mask = ask
    # 循环key
    for k in ks:
        # token拼接key和value urlencode后的结果
        # 这里说一下key都是英文,urlencode后没有什么变化的,所以就省略了
        # 还有一点urllib的quote库不会把/转为%2F, 所以这里自己转了下,大家有什么好用只对参数进行urlencode的包可以分享一下
        mask += f'{k}{quote(str(n[k])).replace("/", "%2F")}'
    # token最后再拼一个secret
    mask += ask
    # token转大写
    mask = mask.upper()
    # md5 编码
    md5 = hashlib.md5()
    md5.update(mask.encode('utf-8'))
    # 获取md5编码后的结果再转一次大写就是token的值
    d['token'] = md5.hexdigest().upper()
    # 最后把含t和token的参数返回
    return d

到这里就把整个token获取流程搞定了,激动的我赶紧写了代码去测试一下:

# parse_req上面写了这里就不写了
req = parse_req({'key': 'https://detail.tmall.com/item.htm?id=638265162028', 'method': 'getHistoryTrend'})
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641186149; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641186149',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': 'Windows',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Site': 'same-origin',
    'Accept-Encoding': 'gzip, deflate, br',
    'Sec-Fetch-User': '?1',
    'Connection': 'keep-alive',
    'Host': 'tool.manmanbuy.com',
    'Origin': 'https://tool.manmanbuy.com',
    'Referer': 'https://tool.manmanbuy.com/HistoryLowest.aspx?url=https%3a%2f%2fitem.jd.com%2f100011493273.html',
}
print(headers)
print(req)
resp = requests.post(f'http://tool.manmanbuy.com/api.ashx', data=req, headers=headers)
print(resp.status_code)
print(resp.text)

没想到竟然给我返回这个

{"msg":"无效的票据","code":1,"data":null,"count":0}

WHAT?难道还有隐藏参数?我又去翻了一遍请求头,发现竟然还有个Authorization参数
在这里插入图片描述
emmm,这么坑的的吗?没办法,只能继续研究呗,在回到刚刚的customRequest里面,我们可以看到有一个ajaxPost的方法,整个逻辑调用就是从这里进入的。纳尼?你问我怎么知道从这里?ajaxGet和其他的我都debug过了,流程没有走到那边就不会停顿。所以现在我们要再看看ajaxPost整块的处理逻辑在这里插入图片描述
可以看到这里就是调用前端ajax的方法了,我们去看看里面,url,type,data肯定都没办法设置请求头的,所以不出意外应该就是在beforeSend里面了(额外提一下data的参数值就是调用的getParam方法,就是刚刚咱们获取t和token的方法,感兴趣的小伙伴可以自己debug看看)在这里插入图片描述
在beforeSenc方法里面,第一个是创建对象不用管,直接debug到if里面,debug了下if条件一定为真,所以直接看里面的逻辑就可以了(接下来就是本文的重点了
在这里插入图片描述
先看第一个变量是setRequestHeader函数,有戏,继续往下在这里插入图片描述
这不就是咱要的参数吗?不容易TAT,继续看后面值是咋弄的在这里插入图片描述

本地函数,跳转过去是求和函数(个人习惯把function(a,b) return a+b;的函数叫做求和函数,实际上可能是个字符串拼接,刚刚上面token也是同理),继续往后:
在这里插入图片描述
BasicAuth,说明前面先添加一个BasicAuth加一个空格的字符串,继续往下:
在这里插入图片描述
再拼一个getTicket()方法,emmm,那咱再去看看这个方法:
在这里插入图片描述
同理第一个定义对象咱不看,这里调用了本地函数的函数引用,大致应该就是这样(function(a,b) return a(b))
在这里插入图片描述
什么鬼,$ 引用 #ticket ?还好懂一丢丢jquery,知道jquery里面能直接$()引用dom,不然就凉凉了,那这里的逻辑大胆猜测应该就是 $("#ticket"),再往后看在这里插入图片描述
val方法?估计应该就是 $("#ticket").val() ?好久没写jquery不知道是不是这样写的,大概意思应该就是获取页面id为ticket的value值?WHAT?还能这样玩?这不debug过来谁能知道,还加过混淆了根本搜索不出来。。内心只有一个字:牛逼。我们再去页面搜索下ticket:
在这里插入图片描述
好家伙,还偷偷在这埋了一手,咱先继续看刚刚js之后的逻辑,ticket之后咱可以调一次页面拿到:
在这里插入图片描述
if条件是永远为真的,总是判断176 > 4 ?这不是废话吗,if里面的逻辑大家可以自己去debug下,手快敲断了敲不动了这里就直接说下逻辑,里面又是调substr又是调substring,核心逻辑就是实现从ticket中拿到的字符串从176往前取4个放在前面,再把第一个到第172个放在后面。???我当时就想黑人问号,这么个逻辑能混淆的这么复杂?用python描述下就是ticket[:176][-4:] + ticket[:172],脑阔痛。所以Auth这个参数的值大概就是BasicAuth xxxxxxxxxxxx这样,于是我又改了下写了如下代码

import copy
import requests

import time
from urllib.parse import quote
import hashlib

def parse_req(d):
    """
    这是解析请求啊,增加t和token参数
    """
    d['t'] = int(time.time() * 1000)
    n = copy.deepcopy(d)
    ks = list(n.keys())
    ks.sort()
    ask = 'c5c3f201a8e8fc634d37a766a0299218'
    mask = ask
    for k in ks:
        mask += f'{k}{quote(str(n[k])).replace("/", "%2F")}'
    mask += ask
    mask = mask.upper()
    md5 = hashlib.md5()
    md5.update(mask.encode('utf-8'))
    d['token'] = md5.hexdigest().upper()
    return d

def parse_basic_auth(ticket):
    """
    这是解析ticket的值啊,就是上面说的那逻辑
    """
    return ticket[:176][-4:] + ticket[:172]

# 请求头从network里面先都copy过来吧,不知道服务器会校验哪些头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605,1641210384; sheng=广东; app-activity-download-close2=1; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641215142; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641215142',
    'Upgrade-Insecure-Requests': "1",
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': 'Windows',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Site': 'same-origin',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-User': '?1',
    'Connection': 'keep-alive',
    'Host': 'tool.manmanbuy.com',
    'Referer': 'https://tool.manmanbuy.com/ValidateAlibaba.aspx'
}
# 先调取页面获取ticket值,之前js里面读的就是页面的input标签的值啊,所以咱要先调一次页面搞到ticket的值
resp = requests.get('http://tool.manmanbuy.com/HistoryLowest.aspx?url=https://item.jd.com/100011493273.html', headers=headers)

from bs4 import BeautifulSoup

b = BeautifulSoup(resp.text, 'html.parser')
ticket = b.select('#ticket')[0]['value']
print(ticket)

# 测试请求参数
req = parse_req({'key': 'https://detail.tmall.com/item.htm?id=638265162028', 'method': 'getHistoryTrend'})

# 通过ticket构建auth
auth = parse_basic_auth(ticket)

# 这是调用api.ashx接口的请求头,能扣过来也都扣过来,免得检车不通过
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605,1641210384; sheng=广东; app-activity-download-close2=1; _gat_gtag_UA_145348783_1=1; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641216852; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641216852',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': 'Windows',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Site': 'same-origin',
    'Accept-Encoding': 'gzip, deflate, br',
    'Sec-Fetch-User': '?1',
    'Connection': 'keep-alive',
    'Host': 'tool.manmanbuy.com',
    'Origin': 'https://tool.manmanbuy.com',
    'Referer': 'https://tool.manmanbuy.com/HistoryLowest.aspx?url=https%3a%2f%2fitem.jd.com%2f100011493273.html',
    'X-Requested-With': 'XMLHttpRequest',
    # 这个就是咱要加上的参数
    'Authorization': 'BasicAuth ' + auth,
}
print(headers)
print(req)
# 调用api获取历史价结果
resp = requests.post(f'http://tool.manmanbuy.com/api.ashx', data=req, headers=headers)
print(resp.status_code)
print(resp.text)

这下调用接口终于能拿到正常结果了

{"msg":"","code":0,"data":{"haveTrend":1,"changPriceRemark":"降幅4%","runtime":59,"zouShi_test":2,"changePriceCount":32,"spbh":"10|638265162028","spUrl":"https://item.taobao.com/item.htm?id=638265162028","spPic":"https://img.alicdn.com/bao/uploaded/i3/260808543/O1CN01wH0pMP2CykFkX6kO5_!!0-item_pic.jpg","currentPrice":133.0,"spName":"口红礼盒套装大牌正品全套盒化妆国风雕花小众彩妆生日礼物送女友","lowerDate":"2021-06-06T00:00:00","lowerPrice":116.33,"bjid":464502722,"zouShi":1,"siteId":10,"siteName":"天猫商城","datePrice":"[1613664000000,188.00,\"\"],[1613750400000,188.00,\"\"],[1613836800000,188.00,\"\"],[1613923200000,188.00,\"\"],[1614009600000,188.00,\"\"],[1614096000000,188.00,\"\"],[1614182400000,188.00,\"\"],[1614268800000,188.00,\"\"],[1614355200000,188.00,\"\"],[1614441600000,188.00,\"\"],[1614528000000,188.00,\"\"],[1614614400000,188.00,\"\"],[1614700800000,188.00,\"\"],[1614787200000,188.00,\"\"],[1614873600000,188.00,\"\"],[1614960000000,188.00,\"\"],[1615046400000,188.00,\"\"],[1615132800000,188.00,\"\"],[1615219200000,188.00,\"\"],[1615305600000,188.00,\"\"],[1615392000000,188.00,\"\"],[1615478400000,188.00,\"\"],[1615564800000,188.00,\"\"],[1615651200000,188.00,\"\"],[1615737600000,188.00,\"\"],[1615824000000,188.00,\"\"],[1615910400000,188.00,\"\"],[1615996800000,188.00,\"\"],[1616083200000,188.00,\"\"],[1616169600000,188.00,\"\"],[1616256000000,188.00,\"\"],[1616342400000,188.00,\"\"],[1616428800000,138.00,\"\"],[1616515200000,138.00,\"\"],[1616601600000,138.00,\"\"],[1616688000000,138.00,\"\"],[1616774400000,158.00,\"\"],[1616860800000,158.00,\"\"],[1616947200000,158.00,\"\"],[1617033600000,158.00,\"\"],[1617120000000,158.00,\"\"],[1617206400000,158.00,\"\"],[1617292800000,158.00,\"\"],[1617379200000,158.00,\"\"],[1617465600000,158.00,\"\"],[1617552000000,158.00,\"\"],[1617638400000,158.00,\"\"],[1617724800000,158.00,\"\"],[1617811200000,158.00,\"\"],[1617897600000,158.00,\"\"],[1617984000000,158.00,\"\"],[1618070400000,158.00,\"\"],[1618156800000,158.00,\"\"],[1618243200000,158.00,\"\"],[1618329600000,158.00,\"\"],[1618416000000,158.00,\"\"],[1618502400000,158.00,\"\"],[1618588800000,158.00,\"\"],[1618675200000,158.00,\"\"],[1618761600000,158.00,\"\"],[1618848000000,158.00,\"\"],[1618934400000,158.00,\"\"],[1619020800000,158.00,\"\"],[1619107200000,158.00,\"\"],[1619193600000,138.0000,\"\"],[1619280000000,138.00,\"\"],[1619366400000,138.00,\"\"],[1619452800000,138.00,\"\"],[1619539200000,138.00,\"\"],[1619625600000,138.00,\"\"],[1619712000000,138.00,\"\"],[1619798400000,138.00,\"\"],[1619884800000,138.00,\"\"],[1619971200000,138.00,\"\"],[1620057600000,138.00,\"\"],[1620144000000,138.00,\"\"],[1620230400000,138.00,\"\"],[1620316800000,138.00,\"\"],[1620403200000,138.00,\"\"],[1620489600000,138.00,\"\"],[1620576000000,138.00,\"\"],[1620662400000,138.00,\"\"],[1620748800000,138.00,\"\"],[1620835200000,138.00,\"\"],[1620921600000,138.00,\"\"],[1621008000000,138.00,\"\"],[1621094400000,138.00,\"\"],[1621180800000,138.00,\"\"],[1621267200000,138.00,\"\"],[1621353600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621440000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621526400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621612800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621699200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621785600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621872000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621958400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622044800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622131200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622217600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622304000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622390400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622476800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622563200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622649600000,138.0,\"\"],[1622736000000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622822400000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622908800000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622995200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1623081600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1623168000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"]

为了方便也只复制了一部分,想要尝试效果的小伙伴可以去试试。

最后

更多Python知识尽在【Python都知道】公众号,欢迎大家!!
扫描下方二维码,关注公众号,了解更多Python内容


小白学堂 » Python爬虫之慢慢买历史低价爬取-【原创】

就聊挣钱,一个带着你做副业的社群。

立即查看 了解详情