唯品会数据采集-异步瀑布流
Posted TTyb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了唯品会数据采集-异步瀑布流相关的知识,希望对你有一定的参考价值。
数据分析离不开数据的支持,为了分析唯品会,特地采集唯品会数据。
采集入口为手机端,在火狐浏览器下ctrl+shift+M进入手机模式,并点击触屏模式,进入唯品会网站m.vip.com,刷新网页。
点击右上角的搜索:
点击品牌:
这时候打开火狐的firebug,随便进入一个店铺,这时候系统会向唯品会发送一个post,可以在firebug里面找到这个post如下图:
点开+号,选择post:
可以看到框起来的部分就是发送的post。由于唯品会这里属于异步瀑布流加载,我们下拉页面,观察下一个post,看一下翻页功能是哪一个。最终得到的页面如下:
可以看到np变成了3,其实老爬虫都会知道,np一般是代表翻页的,那么我们的程序可以写个翻页的代码:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 # 抓取的页数 4 try: 5 np = int(input("请输入抓取的页数:(默认10页):")) 6 if np == 0: 7 np = 10 8 except: 9 np = 10
接下来看到在页面首部有如下选项:
一个一个点击,比如有货商品,观察发送的post:
可以看到这个:
filter_stock:1
所以写下:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 # 是否包含售罄商品 4 try: 5 filter_stock = int(input("看全部商品请按0,只看有货请按1(默认看全部商品):")) 6 if filter_stock == 1: 7 filter_stock = 1 8 else: 9 filter_stock = 0 10 except: 11 filter_stock = 0
其他的价格排序和折扣排序也是这样子观察,最后得到:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 # 价格的排序方式 4 sort = input("综合排序请按0,价格升序请按1,降序请按2,折扣升序请按3,降序请按4(默认综合排序):") 5 try: 6 if sort == "1": 7 sort = "1" 8 elif sort == "2": 9 sort = "2" 10 elif sort == "3": 11 sort = "3" 12 elif sort == "4": 13 sort = "4" 14 else: 15 sort = "0" 16 except: 17 sort = "0"
翻页筛选搞定,下面看不同店铺之间哪里不一样,退到这个页面:
以此点开不同的专场,可以发现代表专场的post是这个:
brand-838319-0-0-0-1-0-1-20.html
其中838319是专场的id,在地址栏可以看得到的
而不同的商品种类的id也是不一样:
"id":1472638528843,
这个id暂时没有发现有什么规律,不过按照道理来说唯品会的商品类目也就那么几十种,做个穷举就行了。
最终的postdata构造完毕:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 postdata = {"method": "getGoodsList", 4 "params": { 5 "page": brandid, 6 "np": numbers, 7 "ep": 20, 8 "cat_id": "0", 9 "sort": sort, 10 "filter_stock": filter_stock, 11 "filter_size": "0", 12 "show": 0, 13 "query": ""}, 14 "id": 1472634230417, 15 "jsonrpc": "2.0"}
构造网址:
url = "http://m.vip.com/server.html"
上面为思路,搞定,下面是代码。
-----------------------------我是快乐的分割线--------------------------------
如果看过:
python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解
你就会知道这个也是要用上面解析头:
1 def postget(url, postdata): 2 # 制作头部 3 header = { 4 \'User-Agent\': \'Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5\', 5 \'Referer\': \'http://m.vip.com/\', 6 \'Host\': \'m.vip.com\', 7 \'Accept\': \'application/json\', 8 \'Accept-Encoding\': \'gzip, deflate\', 9 \'Accept-Language\': \'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\', 10 \'Connection\': \'keep-alive\', 11 \'Content-Type\': \'application/json\' 12 } 13 # post参数 14 res = requests.post(url=url, headers=header, json=postdata) 15 # (\'UTF-8\')(\'unicode_escape\')(\'gbk\',\'ignore\') 16 resdata = res.content 17 return resdata
利用这个解析头将解析出来的东西保存为json:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 # 解析得到json 4 data = postget(url, postdata) 5 # 将抓到的储存到json里面 6 savepath = r"../json/" 7 file = open(savepath + str(numbers) + \'.json\', \'wb\') 8 file.write(data) 9 file.close()
读取json,并采集自己需要的东西:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 # 读取json 4 checkpath = r"../json/" 5 files = listfiles(checkpath, \'.json\') 6 for filename in files: 7 try: 8 doc = open(filename, \'rb\') 9 doccontent = doccontent = doc.read().decode(\'unicode_escape\', \'ignore\') 10 doccontent = doccontent.replace(\' \', \'\').replace(\'\\n\', \'\').replace(\'<spanclass="salebg2">0.8<\\/span>折起\', \'\') 11 except Exception as err: 12 print(err) 13 pass 14 15 jsondata = json.loads(doccontent) 16 # 里面的格式为 17 # [{"method":"getClassifyList","result":{"products":[ 18 for item in jsondata: 19 onefile = item[\'result\'] 20 21 towfile = onefile["products"] 22 for item in towfile: 23 # 共有的项目是专场id、专场名字 24 itemlist = [item["brand_id"], item["brand_name"]] 25 # 货号 26 itemlist.append(item[\'merchandise_sn\']) 27 # 商品id 28 itemlist.append(item[\'product_id\']) 29 # 商品名字 30 itemlist.append(item[\'product_name\']) 31 # 图片网址 32 itemlist.append(item[\'small_image\']) 33 # 卖价 34 itemlist.append(item[\'vipshop_price\']) 35 # 折扣 36 itemlist.append(item[\'discount\']) 37 # 吊牌价 38 itemlist.append(item[\'market_price\']) 39 # sku_id 40 itemlist.append(item[\'sku_id\']) 41 # spu_id 42 itemlist.append(item[\'v_spu_id\'])
将其写入excel:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 4 # 创建一个Excel文件 5 workbook = xlsxwriter.Workbook(\'../excel/\' + today + \'.xlsx\') 6 # 创建一个工作表 7 worksheet = workbook.add_worksheet() 8 # 记录第一行 9 first = [\'商品种类id\', \'品牌名字\', \'专场id\', \'专场名字\', \'商品id\', \'商品名字\', \'图片网址\', \'卖价\', \'折扣\', \'吊牌价\', \'sku_id\', \'优惠\'] 10 # 写入excel的行数 11 num = 1 12 13 # 写入第一行 14 for m in range(0, len(first)): 15 worksheet.write(0, m, first[m]) 16 try: 17 worksheet.write(num, m, itemlist[m]) 18 except Exception as err: 19 worksheet.write(num, m, "") 20 print(err) 21 num = num + 1
顺便下载点图片:
1 # !/usr/bin/python3.4 2 # -*- coding: utf-8 -*- 3 4 pic = urllib.request.urlopen(item[\'small_image\']) 5 picno = time.strftime(\'%H%M%S\', time.localtime()) 6 filenamep = "../image/" + picno + \'-\' + validateTitle(item["merchandise_sn"] + \'-\' + item[\'product_name\']) 7 filenamepp = filenamep + \'.jpg\' 8 filess = open(filenamepp, \'wb\') 9 filess.write(pic.read()) 10 filess.close() 11 print("下载图片" + str(item[\'small_image\'])) 12 time.sleep(1)
全部搞定,效果图:
以上是关于唯品会数据采集-异步瀑布流的主要内容,如果未能解决你的问题,请参考以下文章