Python爬取Sephora网站数据存CSV仅输出表头无数据问题排查
问题根因
- 返回200状态码仅代表服务器接收请求并返回了初始HTML文档,丝芙兰的商品列表完全靠前端JavaScript动态拉取数据渲染,
requests拿到的源码只是个没有实际商品内容的页面框架,根本不存在class为s-card-container的商品卡片节点,因此lists变量是空列表,后续循环解析逻辑从头到尾没执行,自然写不进商品数据,文件最后只剩你预设的表头。 - 代码里用的
css-12vkztw、css-0是前端打包时生成的随机哈希类名,网站每次发版都可能变化,就算拿到渲染完成的页面,这类选择器稳定性极差,大概率选不到目标元素。 - 现有代码缺少空值判断:如果循环中找不到标题或价格节点,直接调用
.text会抛出AttributeError中断程序,你运行时没碰到这个报错,也能侧面证明循环根本没进入。
修复方法
- 放弃直接用
requests请求页面HTML的思路,二选一即可:要么抓浏览器加载商品时调用的后端接口,接口直接返回结构化JSON商品数据,解析效率和稳定性远高于爬取HTML;要么用playwright、selenium这类能模拟浏览器运行JS的工具,等页面把商品全部渲染完成后再提取源码解析。 - 替换掉随机哈希类选择器,优先用元素上固定不变的属性定位,比如
data-*自定义属性、aria-label属性、对应产品名/价格的语义化标签,不要用css-开头的随机类名。 - 解析逻辑加空值判断,找不到对应元素时给默认空值,避免单个商品数据缺失导致整个爬取任务崩溃。另外文件编码改成
utf-8-sig,可以避免Excel打开CSV时的乱码问题。
参考修复代码(基于playwright实现)
from csv import writer from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright url = "https://www.sephora.com/beauty/new-beauty-products" with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') page.goto(url, wait_until="networkidle") page.wait_for_selector('[data-comp="ProductCard"]') page_content = page.content() browser.close() soup = BeautifulSoup(page_content, 'html.parser') lists = soup.find_all('div', attrs={'data-comp': 'ProductCard'}) with open('Competition Pricing Sepho.csv', 'w+', encoding='utf-8-sig', newline='') as f: thewriter = writer(f) header = ['Title', 'Price'] thewriter.writerow(header) for item in lists: title_node = item.find('span', attrs={'data-at': 'sku_item_name'}) price_node = item.find('span', attrs={'data-at': 'sku_item_price_list'}) title = title_node.text.strip() if title_node else '' price = price_node.text.strip() if price_node else '' if title or price: thewriter.writerow([title, price])
提示:首次使用playwright需要先执行
playwright install命令安装对应浏览器内核,否则代码无法正常运行。
内容的提问来源于stack exchange,提问作者ItzJad
相关产品推荐
相关产品推荐

