使用 Selenium 和 CSS 选择器高效抓取 Patagonia 产品数据(高效.抓取.选择器.数据.产品...)

wufei123 发布于 2025-09-11 阅读(1)

使用 selenium 和 css 选择器高效抓取 patagonia 产品数据

本文旨在指导开发者使用 Selenium Webdriver 和 CSS 选择器从 Patagonia 网站抓取女性夹克的产品信息,包括标题、URL、图片 URL、价格、评分和评论数量。文章将提供代码示例,并着重讲解如何编写简洁高效的 CSS 选择器,以及如何处理动态加载内容和数据清洗,最终将抓取的数据保存为 CSV 文件。

环境配置

首先,确保你已经安装了以下依赖:

  • Python 3.6+
  • Selenium: pip install selenium
  • Chrome WebDriver: 下载与你的 Chrome 浏览器版本匹配的 WebDriver,并将其添加到系统 PATH 环境变量中。
核心代码实现

以下代码展示了如何使用 Selenium 和 CSS 选择器抓取 Patagonia 网站上的女性夹克信息,并将其保存为 CSV 文件。

PIA PIA

全面的AI聚合平台,一站式访问所有顶级AI模型

PIA226 查看详情 PIA
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import csv

# 配置 Chrome WebDriver
service = Service(executable_path='/path/to/chromedriver') # 替换为你的 chromedriver 路径
driver = webdriver.Chrome(service=service)

# 目标 URL
url = "https://www.patagonia.com/shop/womens"
driver.get(url)

# 用于存储产品信息的列表
product_data = []

def extract_product_data():
    """提取当前页面上的产品数据"""
    products = driver.find_elements(By.CSS_SELECTOR, '#product-search-results > div.row.product-grid.load-more-present > div[class^="col"]')
    for product in products:
        try:
            title = product.find_element(By.CSS_SELECTOR, 'div.product-tile__title > a > span').text
            product_url = product.find_element(By.CSS_SELECTOR, 'div.product-tile__title > a').get_attribute('href')
            image_url = product.find_element(By.CSS_SELECTOR, 'div.product-tile__image > a > img').get_attribute('src')
            price = product.find_element(By.CSS_SELECTOR, 'div.product-tile__price').text
            # 尝试获取评分和评论数量,如果不存在则设置为 None
            try:
                rating = product.find_element(By.CSS_SELECTOR, 'span.sr-only').get_attribute('aria-label')
                review_count = product.find_element(By.CSS_SELECTOR, 'span.oc-rating-count').text.strip('()')
            except NoSuchElementException:
                rating = None
                review_count = None

            product_data.append([title, product_url, image_url, price, rating, review_count])

        except NoSuchElementException as e:
            print(f"Error extracting data from a product: {e}")
            continue

def load_all_products():
    """滚动加载所有产品"""
    while True:
        try:
            # 找到并点击 "加载更多" 按钮
            load_more_button = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#product-search-results > div.row.product-grid.load-more-present > div.col-12.grid-footer > div > div > button'))
            )
            driver.execute_script("arguments[0].scrollIntoView({ behavior: 'auto', block: 'center' });", load_more_button)
            load_more_button.click()
            # 等待新内容加载 (可以根据实际情况调整等待时间)
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#product-search-results > div.row.product-grid.load-more-present > div[class^="col"]:nth-child(24)'))
            ) # 假设每次加载 24 个产品
        except (TimeoutException, NoSuchElementException):
            # 如果没有 "加载更多" 按钮或加载超时,则停止加载
            break

# 执行抓取流程
load_all_products()
extract_product_data()

# 保存数据到 CSV 文件
csv_file = "patagonia_womens_jackets.csv"
with open(csv_file, "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["product title", "product URL", "product image URL", "product price", "rating", "review count"]) # 写入表头
    writer.writerows(product_data)

print(f"Data saved to {csv_file}")

# 关闭浏览器
driver.quit()
代码解析
  1. 导入必要的库: selenium, csv等。
  2. 配置 WebDriver: 指定 Chrome WebDriver 的路径。
  3. 打开目标网页: 使用 driver.get() 方法打开 Patagonia 网站。
  4. 编写 CSS 选择器: 使用简洁的 CSS 选择器定位到需要抓取的数据。例如,div.product-tile__title > a > span 用于定位产品标题。
  5. 处理动态加载: 使用 WebDriverWait 和 expected_conditions 来等待 "加载更多" 按钮出现,并模拟点击,直到所有产品都加载完毕。
  6. 数据提取: 使用 find_elements 找到所有产品元素,然后遍历每个产品,提取标题、URL、图片 URL、价格、评分和评论数量。注意使用 try...except 块来处理可能不存在的元素。
  7. 数据存储: 将提取的数据保存到 CSV 文件中。
CSS 选择器优化

编写高效的 CSS 选择器是至关重要的。以下是一些建议:

  • 尽量使用 class 名称: class 名称通常比 id 名称更稳定。
  • 避免使用过于复杂的选择器: 选择器越复杂,执行效率越低。
  • 使用子选择器(>): 明确指定父子关系,提高选择器的准确性。
  • 利用属性选择器: 可以使用属性选择器来定位具有特定属性的元素,例如 img[src]。
  • 使用 nth-child() 选择器: 定位特定位置的子元素,例如上面例子中的 #product-search-results > div.row.product-grid.load-more-present > div[class^="col"]:nth-child(24)。
注意事项
  • 网站结构变化: 网站结构可能会发生变化,导致 CSS 选择器失效。需要定期检查和更新选择器。
  • 反爬虫机制: 网站可能会采取反爬虫措施,例如限制访问频率或使用验证码。需要采取相应的反反爬虫策略。
  • 遵守 robots.txt: 遵守网站的 robots.txt 协议,避免抓取不允许抓取的内容。
  • 异常处理: 完善异常处理机制,确保程序在出现错误时能够正常运行。
  • 数据清洗: 抓取到的数据可能需要进行清洗和转换,例如去除空格、转换数据类型等。
总结

本文介绍了使用 Selenium 和 CSS 选择器从 Patagonia 网站抓取产品数据的完整流程。通过编写简洁高效的 CSS 选择器,并结合动态加载处理和数据清洗,可以高效地获取所需数据。请务必遵守网站的使用条款和 robots.txt 协议,并注意网站结构变化和反爬虫机制。

以上就是使用 Selenium 和 CSS 选择器高效抓取 Patagonia 产品数据的详细内容,更多请关注知识资源分享宝库其它相关文章!

相关标签: css python go 浏览器 app ai 环境变量 爬虫 webdriver 属性选择器 Python css chrome pip 数据类型 try class 选择器 大家都在看: 使用BeautifulSoup高效查找HTML元素:解决注释与CSS类选择难题 Selenium中Iframe内元素的XPath与CSS选择器定位策略 高效抓取Iframe内元素:Selenium与XPath/CSS选择器实践指南 解决Django静态文件404错误:CSS加载失败的配置与引用指南 解决Django中CSS等静态文件加载失败的常见问题

标签:  高效 抓取 选择器 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。