Python爬虫实战:爬取京东商品信息

下面是一个基于 Python 使用爬虫技术来抓取京东商品信息的详细教程,并包含实际案例和代码示例。爬虫工具主要使用 requests 发送请求,BeautifulSoup 解析 HTML,json 处理数据,并且结合京东商品页面的 AJAX 动态加载技术。

一、环境准备

在开始爬取京东商品信息之前,需要先安装相关依赖库。我们将使用以下 Python 库:

  • requests: 用于发送 HTTP 请求
  • BeautifulSoup: 用于解析 HTML 文档
  • pandas: 数据处理与导出
  • json: 处理京东商品的 API 返回数据
pip install requests beautifulsoup4 pandas lxml

二、目标分析

我们以京东某个商品类别的商品列表为目标,比如搜索关键词“耳机”。通过分析发现京东的商品页面是通过 AJAX 请求加载商品数据的,因此我们可以直接抓取返回的 JSON 数据。

三、步骤详解

3.1 获取商品页面的 HTML 源代码

首先,我们构造一个搜索请求,访问京东商品列表页,并获取商品的 HTML 源代码。

代码示例:
import requests

# 设定请求的用户代理(User-Agent),模拟浏览器行为
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

# 搜索关键词“耳机”的京东商品列表页 URL
url = 'https://search.jd.com/Search?keyword=耳机&enc=utf-8'

# 发送 GET 请求,获取页面 HTML 源代码
response = requests.get(url, headers=headers)

# 打印返回的状态码(200 表示成功)
print(response.status_code)

# 获取 HTML 内容
html_content = response.text

3.2 使用 BeautifulSoup 解析 HTML

解析 HTML 文档,提取商品的基本信息(如商品名称、价格、评论数等)。我们用 BeautifulSoup 来解析 HTML 文档。

代码示例:
from bs4 import BeautifulSoup

# 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(html_content, 'lxml')

# 获取商品列表的 HTML 部分
goods_list = soup.find_all('li', class_='gl-item')

# 提取每个商品的名称、价格、评价数等信息
for item in goods_list:
    # 商品名称
    name = item.find('div', class_='p-name').text.strip()

    # 商品价格
    price = item.find('div', class_='p-price').text.strip()

    # 商品评价数
    comment = item.find('div', class_='p-commit').text.strip()

    print(f'商品名称: {name}, 价格: {price}, 评价数: {comment}')

3.3 获取 AJAX 加载的数据

我们通过观察发现,京东的商品信息是通过一个 AJAX 请求动态加载的。通过抓包可以发现,该请求返回的是一个 JSON 数据,包含我们需要的商品信息。我们可以直接抓取这个 JSON 数据。

代码示例:
import json

# 设定商品数据的 API 地址(以耳机商品为例)
api_url = 'https://search.jd.com/s_new.php?keyword=耳机&enc=utf-8&page=2'

# 发送 AJAX 请求
response = requests.get(api_url, headers=headers)

# 解析返回的 JSON 数据
json_data = json.loads(response.text)

# 商品信息在 JSON 数据的 'data' 字段中
for item in json_data['data']:
    product_name = item['name']
    product_price = item['price']
    product_comment_count = item['comment_count']

    print(f"商品名称: {product_name}, 价格: {product_price}, 评价数: {product_comment_count}")

3.4 数据保存到 CSV

我们可以将爬取到的数据存储到 CSV 文件中,以方便后续的数据分析。

代码示例:
import pandas as pd

# 存储商品信息的列表
data_list = []

# 模拟多页抓取
for page in range(1, 5):
    # 发送请求,获取 JSON 数据
    api_url = f'https://search.jd.com/s_new.php?keyword=耳机&enc=utf-8&page={page}'
    response = requests.get(api_url, headers=headers)
    json_data = json.loads(response.text)

    # 遍历 JSON 数据,提取商品信息
    for item in json_data['data']:
        data_list.append({
            '商品名称': item['name'],
            '价格': item['price'],
            '评价数': item['comment_count']
        })

# 将数据保存到 CSV 文件
df = pd.DataFrame(data_list)
df.to_csv('jd_earphone_data.csv', index=False, encoding='utf-8')
print('数据保存成功!')

四、完整代码

下面是整合后的完整代码示例:

import requests
from bs4 import BeautifulSoup
import json
import pandas as pd

# 请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

# 存储商品信息的列表
data_list = []

# 模拟抓取 5 页商品数据
for page in range(1, 6):
    # 发送请求,获取页面 HTML
    url = f'https://search.jd.com/Search?keyword=耳机&enc=utf-8&page={page}'
    response = requests.get(url, headers=headers)
    
    # 解析 HTML 内容
    soup = BeautifulSoup(response.text, 'lxml')
    goods_list = soup.find_all('li', class_='gl-item')
    
    for item in goods_list:
        name = item.find('div', class_='p-name').text.strip()
        price = item.find('div', class_='p-price').text.strip()
        comment = item.find('div', class_='p-commit').text.strip()
        data_list.append({
            '商品名称': name,
            '价格': price,
            '评价数': comment
        })

# 将数据保存到 CSV 文件
df = pd.DataFrame(data_list)
df.to_csv('jd_earphone_data.csv', index=False, encoding='utf-8')
print('数据保存成功!')

五、总结

本文详细介绍了如何使用 Python 爬虫爬取京东商品信息,讲解了爬取 HTML 页面、解析数据、获取 AJAX 加载的 JSON 数据并存储到 CSV 的步骤。通过这些步骤,你可以快速地抓取和分析京东商品数据。

注意: 爬取京东商品信息属于网络爬虫的一部分,要确保遵守相关网站的 robots.txt 规则,合理控制爬取频率,避免给服务器造成过大的负担。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只蜗牛儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值