爬虫学习记录——淘宝网获取自己已买到的宝贝(练习cookie和sqlite3)

时间:2021-02-06 20:40:25

本次主要是想练习一下cookie的使用,爬取自己淘宝账号所有的购买记录(商品名称+价格)。同时练习运用sqlite3储数据。

这里cookie是我手动登录淘宝账户,在chrome浏览器中手动取得存放在本地的。

爬虫学习记录——淘宝网获取自己已买到的宝贝(练习cookie和sqlite3)

商品信息界面是动态申请的,通过js申请某个分页的信息。post信息中pageNum来表示申请的页数。RequestHeaders里的参数我也是直接手动复制chrome中获取的。

爬虫学习记录——淘宝网获取自己已买到的宝贝(练习cookie和sqlite3)

这里申请之后返回的是json格式的数据,所以商品的名称和价格我直接采用了正则表达式来进行匹配。

关于商品信息的总页数暂时没有获取到,我选择在循环时采用比较大的数字,当某一页没有获取到商品信息时就break停止循环。


代码如下:

import requests
import re
import sqlite3


Headers = {'accept': 'application/json, text/javascript, */*; q=0.01',
           'accept-encoding': 'gzip, deflate, br',
           'accept-language': 'zh-CN,zh;q=0.9',
           'content-length': '249',
           'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
           'cookie': 'swfstore=295586; cna=QWbwEh8msVYCAW6yJNqXFu6k; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; enc=GKD1SWTYVs4X4%2BJtMHXxLdSqvOSD55ZGiY%2FKcfx8jpsFOrtVb2gPdjRHBq2wiwGWvwwq4XfaFdQtgVjyIjTJ0Q%3D%3D; v=0; _tb_token_=57533efe11193; uc3=sg2=AH5aTj%2FMSU3kjFDOwDTVPKvI9taDJ7TctYPdSJZRtvg%3D&nk2=EuRRQvKH8VPIxX8%3D&id2=UUkNZKYtQKRoSg%3D%3D&vt3=F8dBzLlsmmHvjxnm7C8%3D&lg2=WqG3DMC9VAQiUQ%3D%3D; existShop=MTUxNzI5MDU4Mg%3D%3D; uss=AiGbxdOabYHSHX4H1c1y9I5bQozCvoGCFxd5%2F139Qhb73k3WdwxSlzRn; lgc=qq393222266; tracknick=qq393222266; cookie2=394b02bddd7d094ee0cec794225b9660; sg=60e; mt=np=&ci=5_1; cookie1=AiAzGMZlcO5Bnv5epdbnC53jcBm1%2FTSq8DxB1ufTg14%3D; unb=2130288890; skt=4db57de75423e38a; t=f96832c7e34065fa18e3354a6c17d158; _cc_=UIHiLt3xSw%3D%3D; tg=0; _l_g_=Ug%3D%3D; _nk_=qq393222266; cookie17=UUkNZKYtQKRoSg%3D%3D; _m_user_unitinfo_=unit|unsz; _m_unitapi_v_=1508566261407; _m_h5_tk=686f3fd35e3445371e1a2c77ac7c4dd8_1517294247271; _m_h5_tk_enc=64d8523a00d247ed82491784ee70669e; uc1=cookie16=VT5L2FSpNgq6fDudInPRgavC%2BQ%3D%3D&cookie21=Vq8l%2BKCLjhS4UhJVbhgU&cookie15=VT5L2FSpMGV7TQ%3D%3D&existShop=false&pas=0&cookie14=UoTdfDRYlFGm2Q%3D%3D&cart_m=0&tag=8&lng=zh_CN; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; whl=-1%260%260%261517292926203; ucn=unsz; isg=BJ6eK2VsSLkpF5zHhcEU6Uaz7z0g92Me8e6hc0gkSOFhaz1FsO3K6NRFZ3fn01rx',
           'origin': 'https://buyertrade.taobao.com',
           'referer': 'https://buyertrade.taobao.com/trade/itemlist/list_bought_items.htm?spm=a1z02.1.1997525045.2.3254802b7AcG0R',
           'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36',
           'x-requested-with': 'XMLHttpRequest'}

requestURL = 'https://buyertrade.taobao.com/trade/itemlist/asyncBought.htm?action=itemlist/BoughtQueryAction&event_submit_do_query=1&_input_charset=utf8&smToken=6642c97f74e445979c573ee841759eac&smSign=Ek2oGLuSgKP2eqG6doCjXA%3D%3D'   def get_goods_src(pageNum,Headers,url):


    #post需要发送的参数 页码和页面显示数量  data = {
        'pageNum':pageNum,
        'pageSize':15,
        }
    #初始化存放商品名称的数组  goods_name_list = []
    #初始化存放商品价格的数组  goods_price_list = []
    #初始化存放商品名称和价格的字典  goods_src = {}

    #cookie手动从浏览器取得,存放在test.txt f=open(r'test.txt','r')#打开所保存的cookies内容文件  cookies={}#初始化cookies字典变量  for line in f.read().split(';'):   #按照字符:进行划分读取  #其设置为1就会把字符串拆分成2 name,value=line.strip().split('=',1)
        cookies[name]=value  #为字典cookies添加内容    #post请求页面  res = requests.post(url,data=data,cookies =cookies,headers = Headers)





    #通过正则表达式匹配商品名称,name_not中的字符串为不需要的信息,进行in判断去除  name_not = ['您确定要删除该订单吗?', '七天退换', '如实描述', '正品保证', '保险服务']
    goods_names = re.findall(r'"title":"(.*?)"',res.text)
    for good_name in goods_names:
        if good_name not in name_not:
            goods_name_list.append(good_name)

    # 通过正则表达式匹配商品价格,会将保险价格也取得。保险价格为0.00。这里不需要保险价格,进行判断去除  goods_prices = re.findall(r'"realTotal":"(.*?)"',res.text)
    for goods_price in goods_prices:
        if goods_price != '0.00':
            goods_price_list.append(goods_price)

    #将商品的名称和价格组成字典  goods_src = dict(zip(goods_name_list,goods_price_list))

    return goods_src

if __name__ == '__main__':
    #统计总商品数量  num = 0
    #统计总花费金额  money = 0
    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    try:
        cursor.execute('CREATE TABLE TB_GOODS (goods_name str ,goods_price str)')
        print('创建TB_GOODS表成功')
    except sqlite3.OperationalError:
        print('TB_GOODS表已创建')

    for pageNum in range(1,30):
        print('正在读取第%d页数据' %pageNum)
        goods_src = get_goods_src(pageNum,Headers,requestURL)
        if len(goods_src) != 0 :
            for key in goods_src:
                price = goods_src[key]
                name = key
                src = [name,price]
                num +=1
                money += float(price)
                cursor.execute('INSERT INTO TB_GOODS (goods_name,goods_price) VALUES (?,?)',src)
        else:
            print('本页没有内容')
            break  conn.commit()
    cursor.close()
    conn.close()
    print('总共在淘宝购物商品数量:',num)
    print('总共在淘宝花费金钱%d',money)



运行结果:

爬虫学习记录——淘宝网获取自己已买到的宝贝(练习cookie和sqlite3)



cookie的获取应该是可以通过selenium自动登录账户然后获取到的,这样可以免去每次重启浏览器或者一段时间后需要重新手动复制cookie,这个功能有待以后进行完善。