1. 引言
在当今电商数据分析和市场研究中,获取京东商品数据是许多企业和研究者的核心需求。然而,京东作为国内领先的电商平台,采用了复杂的反爬机制,包括动态渲染、AJAX加载和验证码等,使得传统的静态页面爬取方法难以奏效。本文将介绍如何使用 Selenium 这一强大的浏览器自动化工具,结合Python编程,高效抓取京东基于关键字搜索的商品数据,并提供完整的实现代码。
1.1 爬虫目标
- 输入关键字(如"笔记本电脑"),自动打开京东搜索页面
- 模拟真实用户行为滚动页面加载完整商品列表
- 提取商品名称、价格、店铺名称、评论数、商品链接等关键信息
- 处理京东的反爬机制,确保爬虫稳定运行
1.2 技术选型
- Selenium:用于自动化浏览器操作,处理JavaScript渲染
- ChromeDriver:与Chrome浏览器配合使用的驱动程序
- BeautifulSoup:辅助解析HTML内容
- Pandas:用于数据整理和存储
2. 环境准备
2.1 安装必要库
2.2 下载浏览器驱动
Selenium需要浏览器驱动来操作浏览器。我们使用**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">webdriver-manager</font>**自动管理驱动:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
3. 爬虫实现
3.1 京东搜索页面分析
京东搜索URL格式:
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">keyword</font>**参数指定搜索内容**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">page</font>**参数控制页码
页面特点:
- 采用懒加载技术,滚动到页面底部才会加载更多商品
- 商品信息通过JavaScript动态渲染
- 需要完整模拟用户浏览行为
3.2 基础爬虫代码实现
(1)初始化浏览器
(2)搜索关键字并加载完整页面
def search_jd(keyword, pages=3):
base_url = "https://search.jd.com/Search?keyword="
all_products = []
for page in range(1, pages+1):
url = f"{base_url}{keyword}&page={page}"
driver.get(url)
# 模拟滚动加载所有商品
for i in range(5):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # 等待加载
# 等待商品列表加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".gl-item"))
)
# 获取页面源码并用BeautifulSoup解析
page_source = driver.page_source
products = parse_page(page_source)
all_products.extend(products)
time.sleep(3) # 避免请求过于频繁
return all_products
(3)解析商品信息
from bs4 import BeautifulSoup
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
items = soup.select('.gl-item')
products = []
for item in items:
try:
name = item.select('.p-name em')[0].get_text(strip=True)
price = item.select('.p-price i')[0].get_text(strip=True)
shop = item.select('.p-shop a')[0].get_text(strip=True) if item.select('.p-shop a') else "自营"
comment = item.select('.p-commit a')[0].get_text(strip=True) if item.select('.p-commit a') else "0"
link = "https:" + item.select('.p-img a')[0]['href']
products.append({
'name': name,
'price': price,
'shop': shop,
'comment': comment,
'link': link
})
except Exception as e:
print(f"解析商品出错: {e}")
continue
return products
(4)保存数据
import pandas as pd
def save_to_csv(products, filename='jd_products.csv'):
df = pd.DataFrame(products)
df.to_csv(filename, index=False, encoding='utf_8_sig')
print(f"数据已保存到 {filename}")
(5)完整调用示例
if __name__ == "__main__":
try:
keyword = input("请输入要搜索的商品关键字: ")
products = search_jd(keyword, pages=3)
save_to_csv(products)
finally:
driver.quit() # 确保浏览器关闭
4. 数据存储与扩展
4.1 存储到数据库
import sqlite3
def save_to_db(products, db_name='jd_products.db'):
conn = sqlite3.connect(db_name)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS products
(name TEXT, price TEXT, shop TEXT, comment TEXT, link TEXT)''')
for p in products:
c.execute("INSERT INTO products VALUES (?,?,?,?,?)",
(p['name'], p['price'], p['shop'], p['comment'], p['link']))
conn.commit()
conn.close()
4.2 扩展功能
- 价格监控系统:定期爬取并比较价格变化
- 商品比价功能:多平台数据对比
- 自动化报告生成:使用数据分析生成市场报告
5. 总结
本文详细介绍了如何使用Selenium构建一个能够应对京东反爬机制的动态渲染爬虫,主要技术要点包括:
- Selenium浏览器自动化:模拟真实用户浏览行为
- 页面滚动加载处理:确保获取完整商品列表
- 反爬策略:模拟人类行为、使用代理IP等
- 数据存储方案:CSV和数据库存储