本次主要是想练习一下cookie的使用,爬取自己淘宝账号所有的购买记录(商品名称+价格)。同时练习运用sqlite3储数据。
这里cookie是我手动登录淘宝账户,在chrome浏览器中手动取得存放在本地的。
商品信息界面是动态申请的,通过js申请某个分页的信息。post信息中pageNum来表示申请的页数。RequestHeaders里的参数我也是直接手动复制chrome中获取的。
这里申请之后返回的是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的获取应该是可以通过selenium自动登录账户然后获取到的,这样可以免去每次重启浏览器或者一段时间后需要重新手动复制cookie,这个功能有待以后进行完善。