惟品會數據採集-異步瀑布流

數據分析離不開數據的支持,爲了分析惟品會,特意採集惟品會數據。html

採集入口爲手機端,在火狐瀏覽器下ctrl+shift+M進入手機模式,並點擊觸屏模式,進入惟品會網站m.vip.com,刷新網頁。python

點擊右上角的搜索:json

點擊品牌:瀏覽器

這時候打開火狐的firebug,隨便進入一個店鋪,這時候系統會向惟品會發送一個post,能夠在firebug裏面找到這個post以下圖:app

點開+號,選擇post:less

能夠看到框起來的部分就是發送的post。因爲惟品會這裏屬於異步瀑布流加載,咱們下拉頁面,觀察下一個post,看一下翻頁功能是哪個。最終獲得的頁面以下:異步

能夠看到np變成了3,其實老爬蟲都會知道,np通常是表明翻頁的,那麼咱們的程序能夠寫個翻頁的代碼:post

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:url

能夠看到這個:

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)

所有搞定,效果圖:

相關文章
相關標籤/搜索