查看原文
其他

红袜子、红内裤成最In年货,Python真相了~

阿广 Python大本营 2019-02-22


作者 | 阿广

编辑 | Jane

出品 | Python大本营


【导语】腊月二十八,你的年货都备齐了吗?今天的文章我们专门爬取了几千条年货购买数据,看看大家都在买什么,还分析了一些有意思的数据。下面就一起来看一下 2019 年的年货购买报告~


前言


先看看今天将带大家分析哪些内容:


  1. 城市/农村购买年货占比

  2. 购买大军是80后还是90后?

  3. 年货年度高频词总结

  4. 卖年货的商铺排名

  5. 各个省的年货销量是什么情况?

  6. 年货订单最多的省份 TOP10 分析

  7. 年度商品热度 TOP3


技术分析


本次爬虫使用 selenium,数据库使用 mysql,分词使用 jieba,图表显示使用 echars+wordart。



数据介绍


本文使用 selenium 爬取某宝共 4393 条有效数据,如有侵犯某宝权益,本人会及时删除整个项目。



实现过程


使用 pymysql 连接数据库


1import pymysql.cursors
2conn = pymysql.connect(host='localhost',
3               user='root',
4               password='qweqwe',
5               db='taobao-aguang',
6               charset='utf8',
7               cursorclass=pymysql.cursors.DictCursor)
8cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)


我们爬取的步骤是:搜索某宝网站->爬取年货->下一页



主函数 main()


1def main():
2   cursor.execute("create table if not exists products(price text, deal text, title text, shop text, location text)")
3   total = search()
4   total = int(re.compile('(\d+)').search(total).group(1))
5   for i in range(2, total + 1):
6       next_page(i)
7   browser.close()
8   conn.close()


搜索函数 search()


1def search():
2  try:
3      browser.get('https://www.taobao.com')
4      input = wait.until(
5          EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
6      )
7      submit = wait.until(
8          EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))
9      )
10      input.send_keys('年货')
11      submit.click()
12      total = wait.until(
13          EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))
14      )
15      get_products()
16      return total.text
17  except TimeoutException:
18      return search()


获得某宝上下一页的内容 next_page(page_number)


1def next_page(page_number):
2   try:
3       input = wait.until(
4           EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
5       )
6       submit = wait.until(
7           EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
8       )
9       input.clear()
10       input.send_keys(page_number)
11       submit.click()
12       wait.until(
13           EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number))
14       )
15       get_products()
16   except TimeoutException:
17       next_page(page_number)


获得年货产品 get_products()


1def get_products():
2   wait.until(
3       EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item' ))
4   )
5   html = browser.page_source
6   doc = pq(html)
7   items = doc('#mainsrp-itemlist .items .item').items()
8   for item in items:
9       product = {
10           'price': item.find('.price.g_price.g_price-highlight').text(),
11           'deal': item.find('.deal-cnt').text()[:-3],
12           'title': item.find('.row.row-2.title').text(),
13           'shop': item.find('.shop').text(),
14           'location': item.find('.location').text()
15       }
16       print(product)
17       price = product['price']
18       deal = product['deal']
19       title = product['title']
20       shop = product['shop']
21       location = product['location']
22       sql = "insert into products(price,deal,title,shop,location) values('%s', '%s', '%s', '%s', '%s');" % (price, deal, title, shop, location)
23       try:
24           with conn.cursor() as cursor:
25               cursor.execute(sql)
26           conn.commit()
27           print('数据插入成功')
28       except Exception as e:
29           print('数据插入失败')


统计结果


2019 年春节前几天,我用了海量数据为大家解读中国年货的“迁徙”图景,呈现一个消费升级、红红火火的中国年!


下面我们看一下城市/农村占比,移动端和PC端购买年货占比


1# 农村成交占比
2x_major_Locator = MultipleLocator(country.number)
3# 移动端成交占比
4y_major_Locator = MultipleLocator(city.number)
5
6plt.figure(1)
7plt.grid(True, linestyle="-", color="b", linewidth="0.5")


结果如下:



下面分析一下购买的主力军是 90 后还是 80 后呢?下面是结果!


1# 80后人数
2x_major_Locator = MultipleLocator(eight.number)
3# 90后人数
4y_major_Locator = MultipleLocator(nine.number)
5# 其他人数
6z_major_Locator = MultipleLocator(other.number)
7
8plt.figure(1)
9plt.grid(True, linestyle="-", color="b", linewidth="0.5")



可见 80 后的购买力量依然是大于 90 后的。


通过分析数据,使用苹果作为基础模板,得到了热门年货搜索词表。



某宝上的年货统计词中,年货、零食、大礼包、批发、礼盒等词语出现较多。


你们想知道备年货的商铺中所占的比例各多少吗?下面来看一看!



通过上表可看出,某猫超市卖年货的商家占了半壁江山,意料之内。第二名是 gigwwx,这是什么鬼?刚才查了一下,原来是卖喜糖的企业店,大家要甜甜蜜蜜呀~


那么全国范围内各省的年货销量是什么情况呢?



总体来看,沿海地区的销量领先于内地地区。可见,浙江,上海,江苏等年货销量较大,也许是和浙江温州皮革厂倒闭了有关系?


下面让我们来看一下销量和价格的关系:



整体的趋势是价格越高,销量越少。


将数据上传到表单中


1#上传表单
2class Upload(Form):
3   pcap = FileField('pcap', validators=[DataRequired()])


然后对表单按照省份做分析得出年货订单 TOP10




可以看出,年货订单第一的省份为:广东省。广东人民是真有钱啊。


通过数据得出本年度商品热门为:


  • 红内裤

  • 红袜子

  • 红手链

红红火火过大年,红色果然是首选,大家的年货都买了什么?


源码地址:

https://github.com/zandaoguang/year_goods


(本文为 Python大本营原创文章,转载请微信联系 1092722531。)



推荐阅读:

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存