代码是按照之前写的一个改的,那会写的很简陋,代码格式也很丑,因为我是要拿数据也不改那么多了,原来是用正则获取商品列表页数据的,现在html结构变了,懒得再写正则了,那会是真有耐心。
换成了xpath获取文档数据,稳定性更好了。
再有就是改了改截取品牌的方法,过滤了更多的无用字符。
有个可以更新的地方是没有获取是否断货。

import requests
import json
import re
import os
import codecs
import time
from lxml import etree

s = requests.Session()
s.headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
def getgoodsbyxpath(url):
    html_data = s.get(url).text
    html_tree = etree.HTML(html_data)
    for item_tree in html_tree.xpath('//ul[@id="result"]/li'):
        yield {
            #价格
            'price':item_tree.xpath('div/div/p[@class="price"]/span/text()')[0],
            #tag
            'tag':'|'.join(item_tree.xpath('div/div/p[@class="saelsinfo"]/span/text()')),
            #名称
            'name':item_tree.xpath('div/a')[0].attrib.get('title'),
            #评论数量
            'comment':''.join(item_tree.xpath('div/div/p[@class="goodsinfo clearfix"]/a/text()')),
            #国家
            'country':''.join(item_tree.xpath('div/div/p[@class="goodsinfo clearfix"]/span/text()')),
            #商家
            'sp':''.join(item_tree.xpath('div/div/p[@class="selfflag"]/span/text()')),
            #url
            'url':item_tree.xpath('div/a')[0].attrib.get('href')
        }


#获取分类url
def geturl(a,b,page):
    return "https://www.kaola.com/category/{0}/{1}.html?pageNo={2}".format(a,b,page)

#存储所有数据
def save_csv(data,filename):
    writestr=''
    for i in data:
        writestr += '"' + '","'.join(i) + '"' + "\n"

    f=codecs.open(filename,'a','utf-8')
    f.write(writestr)
    f.close()
    
def formate_data(data, categoryName, categoryName_2, categoryName_3):
    #获取商品品牌
    brand = data['name']
    #过滤无关字符
    if brand.find('|') != -1:
        brand = brand.split('|')
        brand = brand[brand.__len__() - 1]
    if brand.find('|') != -1:
        brand = brand.split('|')
        brand = brand[brand.__len__() - 1]
    #去掉【】 分割
    brand = re.sub('【+.*?】+|\[+.*?\]+|\(+.*?\)+|(+.*?)+|“.*?”|"|「+.*?」+|《.*?》', ' ', brand).strip().split(' ')

    #如果分割空格之后只有一个数据,那么信息中没有品牌
    if brand.__len__() > 1:
        brand = brand[0].strip()
        if brand.__len__() > 20:
            brand = ''
    else:
        brand = ''
    
    return (
            #名称
            data['name'].strip(),
            #价格
            data['price'],
            #tag
            data['tag'],
            #国家
            data['country'],
            #商家
            data['sp'],
            #评论数量
            data['comment'],
            brand,            #品牌
            categoryName,    #一级分类
            categoryName_2,    #二级分类
            categoryName_3,    #三级分类
            #url
            "https://www.kaola.com" + data['url'],
    )

url = 'http://www.kaola.com/getFrontCategory.html'
r = requests.get(url)
category = r.json().get('frontCategoryList')
flag = False
#顶级分类
for i in category:
    
    #顶级分类名称
    categoryName = i['categoryName']
    #二级分类
    for o in i['childrenNodeList']:

        #二级分类名称
        categoryName_2 = o['categoryName']
        categoryId_2 = o['categoryId']
        
        #三级分类
        for p in o['childrenNodeList']:

            #三级分类名称
            categoryName_3 = p['categoryName']
            categoryId_3 = p['categoryId']
            print()
            print(categoryName, categoryName_2, categoryName_3)
            
            if flag:
                for l in range(1, 1000):
                    page_data = []
                    for goods_item in getgoodsbyxpath( geturl(categoryId_2, categoryId_3,l) ):
                        page_data.append(formate_data(goods_item, categoryName, categoryName_2, categoryName_3))
                    if page_data == []:
                        break
                    else:
                        print(l,end = ',')
                        save_csv(page_data, './kaola_180111_1129.csv')
                    # time.sleep(3)
            #半路开始判定
            if (categoryName == "服饰鞋包" and categoryName_2 == "女士箱包" and categoryName_3 == "手拿包"):
                flag = True

2018-1-15 今天复习了一下透视表的用法,看看考拉都卖了点什么。

首先看一下各大分类的商品的数量、评论总数、平均单价(姑且认为评论数量是真实的):

可以看到考拉从服饰鞋包上挣未婚女人的钱,从母婴专区挣新晋妈妈的钱,从运动户外挣产后塑身妈妈的钱,2333333(女同胞不要打我)

但是看到了评论总数,可以发现这个榜单主要还是被可回购产品占据,主要是消耗品,买的护理品,化妆品,给宝宝的奶粉,还有保健品,觉得不错可以回购,而且亲朋回购概率比较高。消耗品还是挣钱啊

从平均售价看,鞋包,数码,运动撑起了一片天,比较意外的是运动户外竟然也加入高单价系列,说明现在崇尚健身的人越来越多了,需要买更好的装备来更好的运动

微信图片_20180115204100.png

通过国家分类平均售价,我们发现单价最高的是芬兰,瑞士,意大利,我查了查芬兰和瑞士卖手表,意大利有Gucci,穷吊表示买不起买不起(删了几个特别低的国家)

微信图片_20180115204648.png

通过国家分类的评论量发现,那些高单价的商品其实购买的人还是很少的,销量大头都让日本的美妆和护理产品占去了,还有澳大利亚的奶制品

最后修改:2021 年 01 月 12 日
如果觉得我的文章对你有用,请随意赞赏