
在当今电商数据分析和市场研究中,获取京东商品数据是许多企业和研究者的核心需求。然而,京东作为国内领先的电商平台,采用了复杂的反爬机制,包括动态渲染、AJAX加载和验证码等,使得传统的静态页面爬取方法难以奏效。本文将介绍如何使用 Selenium 这一强大的浏览器自动化工具,结合Python编程,高效抓取京东基于关键字搜索的商品数据,并提供完整的实现代码。
Selenium需要浏览器驱动来操作浏览器。我们使用webdriver-manager自动管理驱动:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager京东搜索URL格式:
https://search.jd.com/Search?keyword=笔记本电脑&page=1
keyword参数指定搜索内容page参数控制页码页面特点:
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_productsfrom 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 productsimport 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}")if __name__ == "__main__":
try:
keyword = input("请输入要搜索的商品关键字: ")
products = search_jd(keyword, pages=3)
save_to_csv(products)
finally:
driver.quit() # 确保浏览器关闭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()本文详细介绍了如何使用Selenium构建一个能够应对京东反爬机制的动态渲染爬虫,主要技术要点包括:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。