天冷了,我用Python爬取京东4950件羽绒服数据并可视化

前言

大家好,我是J哥。

前不久,我还穿着短袖羡慕着北方的下雪气氛。结果就在上周,深圳也迎来了降温,并成功加入“降温群聊”!
在这里插入图片描述

为了抵御严寒,我特地爬了下京东的羽绒服数据,以备不时之需。为啥不时天猫呢,理由很简单,滑块验证有点麻烦。本文数据集可在微信公众号「菜J学Python」后台输入「羽绒服」免费获取。

数据获取

京东网站是一个ajax动态加载的网站,只能通过解析接口或用selenium自动化测试工具去爬取。关于动态网页爬虫,本公众号历史原创文章介绍过,感兴趣的朋友可以去了解一下。

本次数据获取采用selenium,由于我的谷歌浏览器版本更新较快,导致原来的谷歌驱动失效。于是,我禁用了浏览器自动更新,并下载了对应版本的驱动。

接着,利用selenium在京东网搜索羽绒服,手机扫码登录,获得了羽绒服的商品名称、商品价格、店铺名称、评论人数等信息。限于篇幅,爬虫仅给出核心代码:

# -*- coding = uft-8 -*-
# @Time : 2020/12/01 20:20 
# @Author : 公众号 菜J学Python
# @File : jd_product_spider.py

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from lxml import etree
import random
import json
import csv
import time

browser = webdriver.Chrome('/菜J学Python/京东/chromedriver')
wait =WebDriverWait(browser,50) #设置等待时间
url = 'https://www.jd.com/'
data_list= [] #设置全局变量用来存储数据
keyword ="羽绒服" #关键词

def page_click(page_number):
    try:
        # 滑动到底部
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(random.randint(1, 3)) #随机延迟
        button = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
        )#翻页按钮
        button.click()#点击按钮
        wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
        )#等到30个商品都加载出来
        # 滑到底部,加载出后30个商品
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
        )#等到60个商品都加载出来
        wait.until(
            EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number))
        )# 判断翻页成功,高亮的按钮数字与设置的页码一样
        html = browser.page_source#获取网页信息
        prase_html(html)#调用提取数据的函数
    except TimeoutError:
        return page_click(page_number)

数据清洗

导入数据

import pandas as pd
import numpy as np
df = pd.read_csv("/Users/wangjia/Documents/2.技术公号/公号项目/爬虫/京东/羽绒服.csv")
df.sample(10)
title price shop_name comment
1736 雪中飞男士冬季中长款休闲时尚可脱卸帽毛领羽绒服2020潮流时尚羽绒服X001410173F2... 639.0 雪中飞男装京东自营优选店 100+
3552 Jane Deiune羽绒服男2020冬季新款时尚潮流加厚保暖外套男士时尚连帽上衣 黑色 175 399.0 jane Deiune服饰旗舰店 10+
826 罗蒙短款羽绒服男士轻薄款休闲羽绒外套2020冬季时尚简约白鸭绒男士纯色连帽羽绒服LM19YZ... 198.0 罗蒙(ROMON)男装京东自营专卖店 1500+
3813 南极人羽绒服男2020冬季新款情侣男女同款轻薄短款冬装韩版潮流帅气男士外套 黑色81925 XL 328.0 南极人远飞专卖店 400+
3461 雅鹿冬季渐变男中长款冬季外套新款潮流加厚派克羽绒服男潮牌 渐变粉 M 646.0 杭丰服饰专营店 4
1371 京东超市\nadidas阿迪达斯2020冬季男大童羽绒服GG3677黑色A164/建议身高1... 1077.0 阿迪达斯(adidas)童装童鞋京东自营专区 100+
4601 PANMAX潮流大码男装肥佬休闲外套男加肥加大胖子长款连帽羽绒服 浅蓝色 2XL 698.0 panmax官方旗舰店 20+
3323 南极人 羽绒服男2020冬季新款加厚羽绒服外套男韩版个性潮流帅气面包服男 1928 白色 XL 358.0 南极人迪卡专卖店 40+
612 花花公子(PLAYBOY)羽绒服男宽松冬季男士中长款连帽外套潮流工装加厚上衣保暖衣服男胖子加... 368.0 花花公子凯飞扬专卖店 1200+
3207 冬季新款男士羽绒服短款加厚韩版潮流帅气爆款羽绒外套(领子可脱卸,二种穿法) 黑色 180/X... 528.0 唐纳森男装旗舰店 4

重命名字段

df = df.rename(columns={
   'title':'商品名称','price':'商品价格','shop_name':'店铺名称','comment':'评论人数'})

查看数据信息

df.info()
'''
1.可能存在重复值
2.商店名称存在缺失值
3.评价人数需要清洗
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4950 entries, 0 to 4949
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   商品名称    4950 non-null   object 
 1   商品价格    4950 non-null   float64
 2   店铺名称    4949 non-null   object 
 3   评论人数    4950 non-null   object 
dtypes: float64(1), object(3)
memory usage: 154.8+ KB

删除重复数据

df = df.drop_duplicates()

缺失值处理

df["店铺名称"] = df["店铺名称"].fillna("无名氏")

商品名称清洗

适用人群
tmp=[]
for i in df["商品名称"]:
    if "儿童" or "少年" in i:
        tmp.append("青少年")
    
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值