zoukankan      html  css  js  c++  java
  • 唯品会数据采集-异步瀑布流

    数据分析离不开数据的支持,为了分析唯品会,特地采集唯品会数据。

    采集入口为手机端,在火狐浏览器下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('
    ', '').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)

    全部搞定,效果图:

     

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/TTyb/p/5827123.html
Copyright © 2011-2022 走看看