前言
大家好,我是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("青少年")