使用 Selenium 解决闲鱼爬虫问题 - 详细步骤指南

X Lv2

闲鱼是中国一个广受欢迎的二手交易平台,包含丰富的商品信息。对于需要进行市场调研、价格分析或数据收集的用户来说,爬取闲鱼的数据是一个有价值的需求。然而,由于闲鱼网站使用了动态内容加载和登录验证,传统的爬虫方法(如使用 BeautifulSoup)往往难以应对。本教程将详细介绍如何使用 Selenium 解决闲鱼爬虫问题,包括登录处理、数据提取和数据清洗的完整流程。此外,我们还将提供代码并将其整理到 GitHub 上,供大家参考。

以下是解决闲鱼爬虫问题的详细步骤:


1. 引言:为什么要爬取闲鱼?

闲鱼作为一个二手交易平台,汇聚了大量用户发布的商品信息,包括标题、价格、图片和“想要的人数”等数据。这些数据对于分析市场趋势、价格波动或消费者偏好非常有用。然而,闲鱼的网页内容通过 JavaScript 动态加载,且部分页面需要登录才能访问,这增加了爬取难度。本文将展示如何使用 Selenium 模拟浏览器行为,解决这些问题。


2. 准备工作:设置 Selenium 环境

Selenium 是一个强大的工具,可以自动化浏览器操作,非常适合处理动态网页。以下是设置 Selenium 的步骤:

  • 安装 Python
    确保你的电脑上安装了 Python 3.x。你可以从 python.org 下载并安装。

  • 安装 Selenium
    在终端或命令行中运行以下命令安装 Selenium:

    1
    pip install selenium
  • 安装 ChromeDriver
    Selenium 需要一个 WebDriver 来控制浏览器。本教程使用 Chrome 浏览器,因此需要下载与你 Chrome 浏览器版本匹配的 ChromeDriver。下载后,将其解压并添加到系统 PATH 中(例如放在 /usr/local/bin 或 Windows 的环境变量中)。

  • 验证安装
    运行以下代码,检查 Selenium 是否正常工作:

    1
    2
    3
    4
    5
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get("https://www.google.com")
    print(driver.title)
    driver.quit()

    如果成功打开谷歌并打印页面标题,说明环境配置完成。


3. 处理登录:自动化登录闲鱼

闲鱼的部分页面需要登录才能访问,因此我们需要使用 Selenium 模拟登录过程。以下是具体步骤:

  • 打开登录页面
    使用 Selenium 打开闲鱼的登录页面(假设为 https://login.idlefish.com,实际 URL 可能不同,请根据网站调整)。

  • 输入用户名和密码
    定位登录表单的用户名和密码输入框,输入你的账号信息。

  • 点击登录按钮
    找到登录按钮并模拟点击。

以下是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 初始化浏览器
driver = webdriver.Chrome()

# 打开登录页面
driver.get("https://login.idlefish.com")

# 等待用户名输入框出现
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))

# 输入用户名和密码
driver.find_element(By.ID, "username").send_keys("你的用户名")
driver.find_element(By.ID, "password").send_keys("你的密码")

# 点击登录按钮
driver.find_element(By.ID, "login_button").click()

# 等待登录成功(假设页面上有某个元素表示已登录)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logged_in_element")))

print("登录成功!")

注意

  • 替换 "你的用户名""你的密码" 为你的实际账号信息。
  • 实际的元素 ID(如 usernamepasswordlogin_button)需要根据闲鱼登录页面的 HTML 结构调整。你可以通过浏览器开发者工具(F12)查看元素属性。
  • 如果遇到验证码,可以手动处理,或者添加额外的自动化验证码识别逻辑。

4. 爬取数据:从搜索页面提取信息

登录成功后,我们可以导航到目标页面(例如搜索结果页面)并提取数据。假设我们要爬取商品的标题、价格、“想要的人数”和图片 URL,以下是实现步骤:

  • 导航到搜索页面
    使用 driver.get() 打开搜索结果页面,例如 https://idlefish.com/search?q=iPhone

  • 等待动态内容加载
    因为闲鱼使用 JavaScript 加载内容,我们需要等待目标元素出现。

  • 提取数据
    遍历商品列表,提取每个商品的标题、价格、“想要的人数”和图片 URL,并保存到 CSV 文件中。

以下是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import csv
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 导航到搜索页面
driver.get("https://idlefish.com/search?q=iPhone")

# 等待商品列表加载
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "item")))

# 提取商品数据
items = driver.find_elements(By.CLASS_NAME, "item")
data = []

for item in items:
title = item.find_element(By.CLASS_NAME, "title").text
price = item.find_element(By.CLASS_NAME, "price").text
wanted_by = item.find_element(By.CLASS_NAME, "wanted_by").text
image_url = item.find_element(By.TAG_NAME, "img").get_attribute("src")
data.append([title, price, wanted_by, image_url])

# 保存到 CSV 文件
with open("raw_data.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["title", "price", "wanted_by", "image_url"])
writer.writerows(data)

print("数据爬取完成!")
driver.quit()

注意

  • 替换 itemtitlepricewanted_by 等类名为实际的 HTML 类名。
  • 使用 WebDriverWait 确保动态内容加载完成,避免提取到空数据。
  • 你可以添加参数(如 --url--output)使脚本更灵活,具体见 GitHub 代码。

5. 数据清洗:处理“想要的人数”列

爬取的数据可能存在不一致性,尤其是“想要的人数”列(wanted_by),其值可能是“5人想要”、“原价 ¥1000”或“N/A”。我们将使用 Pandas 和正则表达式清洗这些数据,生成新的列 wanted_count(想要人数)和 original_price(原价)。

以下是清洗步骤:

  • 读取 CSV 文件
    使用 Pandas 加载爬取的原始数据。

  • 解析“wanted_by”列
    使用正则表达式提取数字和价格。

  • 保存清洗后的数据
    将结果保存为新的 CSV 文件。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd
import re

# 读取原始数据
df = pd.read_csv("raw_data.csv")

# 定义清洗函数
def clean_wanted_by(value):
if pd.isna(value) or value == "N/A":
return None, None
# 提取“X人想要”
match = re.search(r"(\d+)人想要", value)
if match:
return int(match.group(1)), None
# 提取“原价 ¥X”
match = re.search(r"¥(\d+)", value)
if match:
return None, float(match.group(1))
return None, None

# 应用清洗函数
df["wanted_count"], df["original_price"] = zip(*df["wanted_by"].apply(clean_wanted_by))

# 保存清洗后的数据
df.to_csv("cleaned_data.csv", index=False)

print("数据清洗完成!")

输出示例

title price wanted_by image_url wanted_count original_price
iPhone 12 ¥3000 5人想要 http://…jpg 5 NaN
iPhone 11 ¥2000 原价 ¥4500 http://…jpg NaN 4500
iPhone X ¥1500 N/A http://…jpg NaN NaN

6. 总结

通过以上步骤,我们成功使用 Selenium 爬取了闲鱼的动态数据,处理了登录问题,并清洗了爬取结果。完整的代码(crawler.pycleaner.py)已整理并上传至 GitHub 仓库:[你的 GitHub 链接]。你可以在仓库中找到详细的安装和使用说明。

这个基础爬虫可以进一步扩展,例如支持分页爬取或处理网络错误。希望本教程对你有所帮助!


GitHub README.md 文件

以下是将爬虫程序 (crawler.py) 和数据清洗程序 (cleaner.py) 上传至 GitHub 时的 README.md 文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 闲鱼爬虫与数据清洗工具

这是一个使用 Python 开发的工具集,包含两个脚本:
1. `crawler.py`:使用 Selenium 从闲鱼爬取商品数据。
2. `cleaner.py`:清洗爬取的原始数据,处理“想要的人数”列。

## 项目描述

本项目旨在帮助用户从闲鱼(Idle Fish)爬取商品信息(如标题、价格、“想要的人数”和图片 URL),并对数据进行清洗以便后续分析。

## 安装

1. **安装 Python 3.x**
从 [python.org](https://www.python.org/) 下载并安装 Python。

2. **安装依赖库**
在终端运行以下命令:
```bash
pip install selenium pandas
  1. 安装 ChromeDriver
    下载与你的 Chrome 浏览器版本匹配的 ChromeDriver,并将其添加到系统 PATH 中。

使用方法

  1. 运行爬虫
    使用以下命令爬取数据:

    1
    python crawler.py --url https://idlefish.com/search?q=你的查询 --output raw_data.csv
    • --url:目标页面 URL。
    • --output:输出 CSV 文件路径。
  2. 运行数据清洗
    使用以下命令清洗数据:

    1
    python cleaner.py --input raw_data.csv --output cleaned_data.csv
    • --input:输入的原始 CSV 文件。
    • --output:输出的清洗后 CSV 文件。

示例

  • 爬取 iPhone 数据

    1
    python crawler.py --url https://idlefish.com/search?q=iPhone --output iphone_data.csv
  • 清洗爬取的数据

    1
    python cleaner.py --input iphone_data.csv --output cleaned_iphone_data.csv

输出文件示例cleaned_iphone_data.csv):

1
2
3
title,price,wanted_by,image_url,wanted_count,original_price
"iPhone 12","¥3000","5人想要","http://...jpg",5,
"iPhone 11","¥2000","原价 ¥4500","http://...jpg",,4500

注意事项

  • 在上传代码到 GitHub 前,请从 crawler.py 中删除敏感信息(如用户名和密码)。
  • 如果遇到网络问题或网站结构变化,请调整代码中的元素定位方式。

贡献

欢迎提交 Pull Request。对于重大更改,请先打开一个 Issue 讨论你的想法。

许可证

MIT


---

### 后续步骤

1. **完善代码**  
   将上述代码保存为 `crawler.py` 和 `cleaner.py`,并添加命令行参数(如 `--url` 和 `--output`)支持。你可以使用 `argparse` 模块实现。

2. **上传到 GitHub**  
   创建一个新的 GitHub 仓库,将 `crawler.py`、`cleaner.py` 和 `README.md` 上传。确保仓库是公开的,并提供链接。

3. **测试**  
   在本地运行代码,确保爬虫和清洗功能正常工作。

希望这篇教程和 README 文件对你有帮助!如果有任何问题,欢迎留言讨论。
  • 标题: 使用 Selenium 解决闲鱼爬虫问题 - 详细步骤指南
  • 作者: X
  • 创建于 : 2025-03-25 01:25:14
  • 更新于 : 2025-04-03 16:09:02
  • 链接: http://sightx.top/2025/03/25/使用 Selenium 解决闲鱼爬虫问题 - 详细步骤指南/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
使用 Selenium 解决闲鱼爬虫问题 - 详细步骤指南