编写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
相关产品推荐
相关产品推荐

