
在当今电商数据分析和市场研究中,获取京东商品数据是许多企业和研究者的核心需求。然而,京东作为国内领先的电商平台,采用了复杂的反爬机制,包括动态渲染、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 删除。