您的位置:首页 > 数据库

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

2018-01-30 15:56 204 查看
本次主要是想练习一下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_pric
a285
e 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,这个功能有待以后进行完善。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 爬虫