使用 Selenium 爬取京东手机销量与评分数据

小白学大数据
• 阅读 1

在电商数据分析场景中,京东作为头部电商平台,其手机品类的销量、评分数据是洞察市场趋势、分析用户偏好的核心依据。相较于静态网页爬取,京东采用动态渲染技术加载商品数据,传统的 Requests+BeautifulSoup 组合难以获取完整信息,而 Selenium 凭借模拟浏览器行为的特性,能完美解决动态数据爬取问题。本文将详细讲解如何基于 Selenium 实现京东手机销量与评分数据的爬取,并完成数据清洗与初步分析。 一、技术选型与环境准备

  1. 核心技术栈 ● Selenium:模拟 Chrome 浏览器操作,加载动态页面并定位元素; ● ChromeDriver:Chrome 浏览器的驱动程序,实现 Selenium 与浏览器的通信; ● Pandas:数据清洗、存储与初步分析; ● BeautifulSoup:辅助解析网页 HTML 结构,提取目标数据。
  2. 环境配置 (1)ChromeDriver 配置 ● 查看本地 Chrome 浏览器版本(设置→关于 Chrome); ● 前往ChromeDriver 官方下载页下载对应版本的驱动; ● 将 ChromeDriver.exe 放入 Python 安装目录(或配置系统环境变量),确保命令行可直接调用。 二、爬取逻辑设计
  3. 爬取目标 以京东 “手机” 关键词搜索结果为数据源,提取以下信息: ● 商品名称; ● 商品价格; ● 商品销量(付款人数); ● 商品评分; ● 评论数。 三、完整实现代码
    运行
    import time
    import pandas as pd
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from bs4 import BeautifulSoup
    

代理配置信息(单独定义,便于维护)

proxyHost = "www.16yun.cn" proxyPort = "5445" proxyUser = "16QMSOML" proxyPass = "280651"

class JDPhoneSpider: def init(self): # 配置Chrome选项,避免弹窗与自动化提示 chrome_options = Options() # 无头模式(可选,注释后可见浏览器操作) # chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-blink-features=AutomationControlled') chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) chrome_options.add_experimental_option('useAutomationExtension', False)

    # ========== 核心修改:添加代理配置 ==========
    # 1. 配置HTTP代理(包含主机和端口)
    chrome_options.add_argument(f'--proxy-server=http://{proxyHost}:{proxyPort}')
    # 2. 处理代理账号密码认证(需通过Chrome扩展或DesiredCapabilities,这里用更通用的方式)
    # 注:Chrome 90+版本需通过selenium的ChromeDevTools协议注入认证信息
    self.proxy_auth = (proxyUser, proxyPass)

    # 初始化浏览器
    self.driver = webdriver.Chrome(options=chrome_options)
    # 注入代理认证(关键:避免代理需要账号密码时访问失败)
    self._set_proxy_auth()

    self.driver.execute_script('Object.defineProperty(navigator, "webdriver", {get: () => undefined})')
    self.driver.implicitly_wait(10)  # 隐式等待10秒
    self.wait = WebDriverWait(self.driver, 15)  # 显式等待对象
    self.data_list = []  # 存储爬取的商品数据

def _set_proxy_auth(self):
    """注入代理账号密码认证,解决带密码的代理访问问题"""
    try:
        # 通过Chrome DevTools协议设置代理认证
        self.driver.execute_cdp_cmd(
            'Network.enable', {}
        )
        self.driver.execute_cdp_cmd(
            'Network.setExtraHTTPHeaders',
            {'headers': {'Proxy-Authorization': f'Basic {self._get_base64_auth()}'}}
        )
    except Exception as e:
        print(f"代理认证配置警告:{e},部分代理可能无需此步骤")

def _get_base64_auth(self):
    """将代理账号密码转为Base64编码(HTTP Basic认证要求)"""
    import base64
    auth_str = f"{self.proxy_auth[0]}:{self.proxy_auth[1]}"
    return base64.b64encode(auth_str.encode('utf-8')).decode('utf-8')

def get_page_data(self, page_url):
    """爬取单页商品数据"""
    self.driver.get(page_url)
    # 模拟滚动加载(京东动态加载商品,需滚动到底部)
    for _ in range(3):
        self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
        time.sleep(2)

    # 等待商品列表加载完成
    self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-item')))

    # 解析页面源码
    soup = BeautifulSoup(self.driver.page_source, 'lxml')
    items = soup.find_all('li', class_='gl-item')

    for item in items:
        # 提取商品名称
        name_tag = item.find('div', class_='p-name').find('em')
        name = name_tag.get_text().strip() if name_tag else '未知'

        # 提取商品价格
        price_tag = item.find('div', class_='p-price').find('i')
        price = price_tag.get_text().strip() if price_tag else '0'

        # 提取销量(付款人数)
        sales_tag = item.find('div', class_='p-commit').find('a', class_='J_comment')
        sales = sales_tag.get_text().strip().replace('万+', '0000').replace('+', '') if sales_tag else '0'

        # 提取评分(部分商品无评分,需做容错)
        score_tag = item.find('div', class_='p-commit').find('span', class_='score')
        score = score_tag.get_text().strip() if score_tag else '无评分'

        # 提取评论数
        comment_tag = item.find('div', class_='p-commit').find('strong').find('a')
        comment_num = comment_tag.get_text().strip() if comment_tag else '0'

        # 整理数据
        self.data_list.append({
            '商品名称': name,
            '价格(元)': price,
            '销量': sales,
            '评分': score,
            '评论数': comment_num
        })
    print(f'当前页爬取完成,累计获取{len(self.data_list)}条数据')

def crawl(self, keyword='手机', page_num=3):
    """核心爬取函数"""
    base_url = f'https://search.jd.com/Search?keyword={keyword}&enc=utf8&page='
    for page in range(1, page_num * 2, 2):
        # 京东分页URL规则:第1页page=1,第2页page=3,第3页page=5...
        page_url = base_url + str(page)
        print(f'正在爬取第{(page+1)//2}页,URL:{page_url}')
        try:
            self.get_page_data(page_url)
            # 翻页间隔,避免请求过快被风控
            time.sleep(3)
        except Exception as e:
            print(f'第{(page+1)//2}页爬取失败:{str(e)}')
            continue

def save_data(self, filename='jd_phone_data.csv'):
    """将数据保存为CSV文件"""
    df = pd.DataFrame(self.data_list)
    # 数据清洗:价格转为数值型,销量做简单处理
    df['价格(元)'] = pd.to_numeric(df['价格(元)'], errors='coerce').fillna(0)
    df['评论数'] = df['评论数'].str.replace('万', '0000').replace('+', '')
    df['评论数'] = pd.to_numeric(df['评论数'], errors='coerce').fillna(0)

    df.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f'数据已保存至{filename},共{len(df)}条有效数据')

def close(self):
    """关闭浏览器"""
    self.driver.quit()

主程序执行

if name == 'main': spider = JDPhoneSpider() try: # 爬取3页手机数据 spider.crawl(keyword='手机', page_num=3) # 保存数据 spider.save_data() finally: # 确保浏览器关闭 spider.close()

四、代码核心解析
1. 浏览器配置
● 关闭webdriver特征检测:通过execute_script修改navigator.webdriver属性,避免京东识别出自动化程序;
● 隐式等待 + 显式等待结合:隐式等待处理全局元素加载,显式等待确保商品列表加载完成后再解析,避免数据缺失。
2. 动态数据加载处理
京东商品列表采用滚动加载机制,通过window.scrollTo模拟鼠标滚动,配合time.sleep等待数据加载,确保能获取完整的商品信息。
3. 数据提取与容错
● 针对 “无评分”“销量为空” 等异常情况,通过if-else做容错处理,避免程序崩溃;
● 使用 BeautifulSoup 解析页面,通过 class 定位元素,适配京东网页结构。
4. 数据清洗与存储
● 将价格、评论数转为数值型,方便后续分析;
● 保存为 UTF-8 编码的 CSV 文件,避免中文乱码问题。
五、爬取注意事项
1. 反爬机制规避:
  ○ 控制请求频率(设置time.sleep),避免短时间内大量请求;
  ○ 不使用高并发爬取,单线程爬取少量数据(如 10 页内)更安全;
  ○ 可添加随机 User-Agent,进一步降低被风控的概率。
2. 网页结构变更:京东网页 class 名称可能随版本更新变化,若爬取失败,需通过浏览器开发者工具(F12)重新定位元素的 class 或 XPath。
3. 合法合规性:本代码仅用于学习研究,爬取数据不得用于商业用途,需遵守京东平台的 robots 协议及相关法律法规。
六、数据应用示例
爬取完成后,可通过 Pandas 做简单分析:
python
运行
``` import pandas as pd

# 读取数据
df = pd.read_csv('jd_phone_data.csv')
# 1. 筛选评分≥4.8的商品
high_score_phones = df[df['评分'] != '无评分'][df[df['评分'] != '无评分']['评分'].astype(float) ≥ 4.8]
# 2. 统计价格区间分布
price_range = pd.cut(df['价格(元)'], bins=[0, 1000, 2000, 3000, 5000, 10000], labels=['千元内', '1-2千', '2-3千', '3-5千', '5千以上'])
price_dist = price_range.value_counts()
print(price_dist)

总结

  1. Selenium 是解决动态网页爬取的核心工具,通过模拟浏览器行为可获取京东动态加载的商品数据;
  2. 爬取过程中需重点处理动态加载、反爬机制、数据容错三大问题,确保数据完整性与程序稳定性;
  3. 爬取后的数据分析需基于 Pandas 完成数据清洗,才能挖掘出有价值的市场信息,同时需遵守平台规则与法律规定。
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
12个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
C# 爬虫技术:京东视频内容抓取的实战案例分析
摘要随着互联网技术的飞速发展,数据的获取和分析变得愈发重要。爬虫技术作为数据获取的重要手段之一,广泛应用于各个领域。本文将重点探讨C语言在京东视频抓取中的实现过程,分析其技术细节,并提供相应的代码实现。引言京东作为中国领先的电商平台,拥有海量的商品信息和用
解锁京东商品数据:商品详情API接口实战代码示例
在电子商务的繁荣时代,商品信息的准确性和实时性对于商家、消费者以及各类电商平台来说至关重要。京东,作为中国领先的电商平台之一,其商品信息更是蕴含着巨大的商业价值和市场洞察。本文将为您详细介绍如何使用京东商品详情API接口,轻松获取京东上的商品信息,并分享一
代理IP在电商数据爬取中的成本效益分析
在电子商务领域,数据的重要性不言而喻。它不仅关系到市场趋势的把握,还直接影响到产品定价、库存管理和客户服务等关键业务。电商数据爬取是获取这些数据的重要手段之一。然而,直接爬取电商网站数据可能会遇到IP被封禁、数据获取不全面等问题。代理IP作为一种解决方案,
京东云开发者 京东云开发者
12个月前
京点点AIGC平台:实现高效、可控、智能的多模态内容生成和优化
作者:京东零售高继航1前言2024年,京东零售技术自研的京点点AIGC内容生成平台(以下简称“京点点”)已覆盖电商运营涉及的20核心场景,AI能力单日调用超1000万次。“京点点”致力于电商场景下商品内容、营销素材的智能化、自动化生产和运营,已帮助京东3
小白学大数据 小白学大数据
9个月前
Scrapy结合Selenium实现滚动翻页数据采集
引言在当今的互联网数据采集领域,许多网站采用动态加载技术(如AJAX、无限滚动)来优化用户体验。传统的基于Requests或Scrapy的爬虫难以直接获取动态渲染的数据,而Selenium可以模拟浏览器行为,实现滚动翻页和动态内容加载。本文将介绍如何结合S
小白学大数据 小白学大数据
9个月前
Python 实现如何电商网站滚动翻页爬取
一、电商网站滚动翻页机制分析电商网站如亚马逊和淘宝为了提升用户体验,通常采用滚动翻页加载数据的方式。当用户滚动页面到底部时,会触发新的数据加载,而不是一次性将所有数据展示在页面上。这种机制虽然对用户友好,但对爬虫来说却增加了爬取难度。以淘宝为例,其商品列表
小白学大数据 小白学大数据
7个月前
动态网页爬取:Python如何获取JS加载的数据?
在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段。许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取方法难以奏效。然而,对于数据分析师、研究人员以及开发者来说,获取这些动态加载的数据仍然是一个重要的需求。本文
Java 爬虫如何实现分布式部署?
以下是Java爬虫实现分布式部署的关键要点及示例代码片段辅助理解:一、任务分配与管理划分任务:根据要爬取的目标网站结构和数据量,将爬取任务拆分成多个小的子任务。例如,如果要爬取一个大型电商网站的所有商品信息,可以按照商品类别进行划分,每个类别作为一个独立的
小白学大数据 小白学大数据
3小时前
拉勾网 Ajax 动态加载数据的 Python 爬虫解析
在招聘数据采集、职场趋势分析等场景中,拉勾网是重要的数据来源,但拉勾网采用Ajax动态加载技术渲染页面,传统的静态网页爬虫无法直接获取数据。本文将从Ajax动态加载原理入手,详解基于Python的拉勾网数据爬虫实现过程,包括请求分析、参数构造、反爬应对及数
小白学大数据
小白学大数据
Lv1
男 · 亿牛云 · python技术
宁为代码类弯腰,不为bug点提交!
文章
133
粉丝
5
获赞
18