查看原文
其他


    作者 | 阿广

    编辑 | 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。)



    推荐阅读:

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

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