爬取加拿大超市网站时获取错误HTML代码的问题求助
解决方案:获取Real Canadian Superstore的动态渲染HTML/营养数据
你的问题核心是目标网站采用JavaScript动态渲染内容,urllib这类静态HTTP请求工具只能获取页面的初始骨架HTML,无法拿到浏览器执行JS后生成的实际内容(包括营养数据)。以下是两种适合新手的高效解决方案:
方案1:用Selenium模拟浏览器加载(直观易上手)
Selenium会模拟真实浏览器打开页面,等待JS执行完成后再获取完整HTML,完全还原手动浏览的效果。
步骤:
- 安装依赖:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,需和你的浏览器版本匹配),放到Python可调用的路径下。
示例代码:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化Chrome浏览器驱动 driver = webdriver.Chrome() try: # 打开目标商品页面 driver.get('https://www.realcanadiansuperstore.ca/honey-nut-cheerios-breakfast-cereal-family-size-wh/p/21103495_EA') # 等待营养数据区域加载完成(可根据页面实际元素调整等待条件) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'nutrition-facts')) ) # 获取完整渲染后的HTML full_html = driver.page_source print(full_html) # 后续用你已掌握的方法从full_html提取营养数据即可 finally: # 关闭浏览器 driver.quit()
方案2:直接请求后端API(更高效,无需模拟浏览器)
多数电商网站的商品数据(包括营养信息)是通过AJAX请求从后端API获取的,直接请求这类接口拿JSON数据,比解析HTML更高效。
抓包找API方法:
- 打开浏览器开发者工具(F12),切换到「Network」面板
- 刷新目标页面,筛选「XHR」或「Fetch」类型的请求
- 查找包含nutrition、product等关键词的请求,这类通常就是返回营养数据的接口
示例代码(需替换为实际抓包到的API地址):
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', # 可根据抓包结果补充Referer、Cookie等其他必要请求头 } # 替换为实际抓包到的营养数据API地址 api_url = 'https://www.realcanadiansuperstore.ca/api/product/nutrition/21103495_EA' response = requests.get(api_url, headers=headers) nutrition_data = response.json() print(nutrition_data) # 直接从JSON结构中提取所需营养值即可
补充:你原代码的小语法错误
原代码中这一行存在语法问题,需拆分为两行:
# 错误写法 mystr = mybytes.decode("utf8") urlopen(fp).close() # 正确写法 mystr = mybytes.decode("utf8") urlopen(fp).close()
内容的提问来源于stack exchange,提问作者tina.m444
相关产品推荐
相关产品推荐

