首页新闻动态正文

Python告诉你iPhone有多热卖【黑马python培训】

更新时间:2019年07月26日 10时50分23秒 来源:黑马程序员论坛

老婆最近生气了,说强哥不肯给她买iPhone X。强哥觉得挺委屈的,强哥是小气的人么。老婆要买iPhone X,强哥当然支持了。强哥立刻转了一笔巨款给老婆
发完转账,老婆就把强哥给拉黑了。强哥当时的心情是这样的

带着沉重的心情,强哥决定深入了解一下老婆为什么这么喜欢iPhone X,于是强哥用Python爬取淘宝店铺的数据分析了一下iPhone X到底有多热卖。

我们先来看下淘宝上的销量数据长什么样。
淘宝上的销量数据有两种方式估算,一种方式是用累计付款人数近似销量,像下面这种
显示在这个数字里的每个人都至少购买了一部手机,所以总销量一定大于等于累计付款人数。
淘宝上并不是每一家店铺都显示累计付款人数,对于下面这种只显示评论数的情况
就只能用评论数来估算销量了。具体怎么估算后面会提到。

知道怎么获得销量数据,接下类我们就开始爬数据了。
我们要爬的数据藏在下面高亮的URL里
我们用Python的Scrapy框架来实现一个爬虫,爬取不同搜索页的URL
我们来抓取这站(www.idiancai.com)的URL
爬虫代码如下:
import timeimport jsonimport reimport scrapyimport pymongodef load_param():    try:        with open("/tmp/param") as f:            content = f.read()            data = json.loads(content)            start = data.setdefault("start", 0)            return start    except:        return 0def save_param(start):    with open("/tmp/param", "wb") as f:        result = json.dumps({            "start": start,        })        f.write(result)class QuotesSpider(scrapy.Spider):    name = "iphonex"    url_patt = 'https://www.smpeizi.com/search?data-key=s&data-value=%d&ajax=true&_ksTS=1513178695257_1962&callback=jsonp1963&q=iphone+x&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306&app=detailproduct&through=1&bcoffset=4&p4ppushleft=6%%2C48'    def start_requests(self):        start = load_param()        url = self.url_patt % (start)        self.start = start        yield scrapy.Request(url=url, callback=self.parse)    def parse(self, response):        content = response.body        patt = r'jsonp\d+\((.*)\);'        matched = re.search(patt, content, re.MULTILINE)        data = json.loads(matched.group(1))        items = data["mods"]["itemlist"]["data"]["auctions"]        client = pymongo.MongoClient()        db = client["iphonex"]        new_items = db.items.insert_many(items)        self.start = self.start + 44        save_param(self.start)        url = self.url_patt % (self.start)        time.sleep(2)        yield scrapy.Request(url=url, callback=self.parse)
我们爬得温柔点,这里设了爬完一次休息2秒再爬。

爬完的数据存入了mongodb,接下来我们将数据从mongodb中读出来,去除不相关的产品和重复的产品,估算一下缺失累计付款人数商品的销量数据,然后统计总的销量和销售额。

这里重点讲述一下怎么用评论数来估算商品销量。
淘宝上的商品的评论只有在购买成功后才能添加,一次购买行为最多对应一条评论(首评,追评都会归结到一条)。按常理分析,商品累计付款人数和评论数应该呈正相关的关系。
我们提取mongodb里累计付款人数大于0并且评论数大于200的商品。销量太少的商品的评论数量可能会存在一定随机性,因此我们限定用于分析的商品的评论数必须大于200。
用散点图画出累计付款人数和评论数的关系,如下
上图横轴是评论数,纵轴是累计付款人数,累计付款人数和评论数还是呈现很明显的正相关关系的。我们用线性来拟合这个关系,对于那些只有评论数的商品,我们用拟合出来的公式来推算该商品的累计付款人数,由此来估算销量。

数据分析部分的代码如下:
def get_iphonex():    client = pymongo.MongoClient()    db = client["iphonex"]    items = db["items"]    prices = []    sales = []    com_counts = []    urls = []    titles = []    nids = []    for item in items.find():        title = item["raw_title"]        if (re.search(r"iphonex", title, re.I) or \            re.search(r"iphone x", title, re.I)) and \            not re.search(r"iphone 8", title, re.I) and \            not re.search(r"iphone8", title, re.I):            titles.append(title)        else:            continue        nids.append(item["nid"])        url = item["detail_url"]        urls.append(url)        view_price = item.setdefault("view_price", "0")        prices.append(float(view_price))        comment_count = 0         if "comment_count" in item and item["comment_count"]:            comment_count = int(item["comment_count"])        com_counts.append(comment_count)        view_sales = item.setdefault("view_sales", "0")        matched = re.match(r'(\d+)', view_sales)        if matched:            view_sales_num = matched.group(1)            sales.append(int(view_sales_num))        else:            sales.append(-1)    pd.set_option('display.max_colwidth', -1)     df = pd.DataFrame({"price": prices, "sales": sales, "urls": urls, "titles": titles, "nids": nids, "comment_count": com_counts})    df.drop_duplicates(subset="nids", keep="last", inplace=True)    df_test = df[df.price>6000][(df.sales!=0) | (df.comment_count!=0)]    df_train = df_test[df_test.comment_count > 200][df_test.sales > 0]    reg = sklearn.linear_model.LinearRegression(fit_intercept=False)    reg.fit(df_train[["comment_count"]], df_train["sales"])    df_tofill = df_test[df_test.sales==0]    df_tofill["sales"] = reg.predict(df_tofill[["comment_count"]])    df_test[df_test.sales == 0] = df_tofill    print "iPhone X sold number:", df_test.sales.sum()    print "iPhone X sold money:", np.sum(df_test.sales*df_test.price)get_iphonex()
上面这段代码有如下的输出:
iPhone X sold number: 194037.766983iPhone X sold money: 1605100188.36
代码已经ok了,我们可以看一下这个站(www.pzzs168.com)的销售情况
可以看到,至今为止,iPhone X在淘宝上共卖出了19万部,销售额达到了16亿多。

这个销售量到底什么水平呢?我们可以统计一下差不多同期上市的几款手机的销量,做个比较。
用同样的方法,我们从淘宝上爬取了iPhone 8,华为Mate 10,小米Mix 2的销量数据,将它们和iPhone X放在一起做比较,有如下的数据
可以看到iPhone X无论在销量还是销售额上都遥遥领先,远远超过其他手机。
当然淘宝只是iPhone X的一个销售平台,同样在销售iPhone X的还有京东,苏宁,苹果线上和线下的实体商店等。由于很多大平台并不公开销量数据,要统计iPhone X总的销售量还有很大的难度。但根据之前新闻报道iPhone X开卖2小时招行销售额破20亿、双十一京东购机预约数量破200万、苹果商店门前排起长队、黄牛将一部手机价格炒到2万等这些来判断,这次的iPhone X一定是大受好评的。

至此,强哥算是明白老婆为什么这么喜欢iPhone X了。强哥知道错了,强哥这就给老婆买iPhone X去。

推荐了解热门学科

java培训 Python人工智能 Web前端培训 PHP培训
区块链培训 影视制作培训 C++培训 产品经理培训
UI设计培训 新媒体培训 产品经理培训 Linux运维
大数据培训 智能机器人软件开发




传智播客是一家致力于培养高素质软件开发人才的科技公司“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。

传智播客从未停止思考

传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”

中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。

何为中高级程序员课程?

传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。




黑马程序员热门视频教程【点击播放】

Python入门教程完整版(懂中文就能学会) 零起点打开Java世界的大门
C++| 匠心之作 从0到1入门学编程 PHP|零基础入门开发者编程核心技术
Web前端入门教程_Web前端html+css+JavaScript 软件测试入门到精通


在线咨询 我要报名
和我们在线交谈!