You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Python脚本爬取Tonies产品时长与价格的问题求助

技术优化建议

一、解决仅能获取21条数据的问题

当前脚本固定爬取第9页,要获取所有产品需遍历所有分页:

  • 先通过页面分页控件或接口返回数据确定总页数
  • 循环从第1页到最后一页,逐个请求页面获取产品数据

二、高效获取时长与价格(无需Selenium)

网站的产品数据已嵌入页面的__NEXT_DATA__脚本标签中,直接解析该数据即可,无需逐个请求详情页,更稳定高效:

优化代码示例

import requests
import json
from bs4 import BeautifulSoup

def scrape_all_tonies():
    all_tonies = []
    base_url = "https://tonies.com/en-gb/tonies/?page="
    page_num = 1
    
    while True:
        resp = requests.get(base_url + str(page_num))
        soup = BeautifulSoup(resp.text, "html.parser")
        
        # 提取页面中的产品数据脚本
        data_script = soup.find("script", id="__NEXT_DATA__")
        if not data_script:
            break
        
        try:
            data = json.loads(data_script.string)
            products = data["props"]["pageProps"]["products"]
        except (json.JSONDecodeError, KeyError):
            print(f"解析第{page_num}页数据失败")
            break
        
        if not products:
            break
        
        for prod in products:
            tonie_item = {
                "name": prod["name"],
                "url": f"https://tonies.com{prod['url']}",
                "duration": prod.get("runTime", "未知"),
                "price": f"£{prod['price']['current']['value']/100:.2f}"
            }
            all_tonies.append(tonie_item)
        
        print(f"完成第{page_num}页爬取,共{len(products)}个产品")
        page_num += 1
    
    return all_tonies

if __name__ == "__main__":
    tonies_data = scrape_all_tonies()
    
    for idx, item in enumerate(tonies_data, 1):
        print(f"产品 {idx}:")
        print(f"  名称: {item['name']}")
        print(f"  链接: {item['url']}")
        print(f"  时长: {item['duration']}分钟")
        print(f"  价格: {item['price']}")
        print("-" * 30)

三、若需使用Selenium处理Cookie弹窗

如果后续必须用浏览器自动化,处理Shadow DOM的Cookie弹窗可通过执行JavaScript实现:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://tonies.com/en-gb/tonies/")

# 等待Shadow Host加载并执行JS点击同意按钮
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located(("css selector", "#usercentrics-root"))
)
driver.execute_script("""
    const shadowRoot = document.querySelector('#usercentrics-root').shadowRoot;
    const acceptBtn = shadowRoot.querySelector('[data-testid="uc-accept-all-button"]');
    if (acceptBtn) acceptBtn.click();
""")

但仍优先推荐API解析方式,避免浏览器自动化的性能与稳定性问题。

内容的提问来源于stack exchange,提问作者TrustNo1UK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:30:22