使用Requests爬取Tokopedia移动端商品链接无法获取全部内容的问题求助
嘿,这个问题我之前也碰到过!Tokopedia的移动端页面不少内容都是动态渲染的——也就是核心数据(比如价格、商品名)不是一开始就写在静态HTML里,而是页面加载后通过JavaScript异步请求加载的,这就是为啥你用简单的requests只能拿到空壳HTML,找不到目标内容的原因。咱们一步步来解决:
先优化请求头,模拟真实移动端浏览器
你当前的User-Agent太宽泛了,Tokopedia可能识别出这不是真实的移动端访问,所以没有返回完整内容。试试换成真实的移动端浏览器UA,再补充几个必要的请求头,让请求更贴近真实用户的行为:import requests headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.tokopedia.com/' } resp = requests.get("https://www.tokopedia.com/now/sumo-beras-putih-kemasan-merah-5-kg", headers=headers) # 之后再检查resp.text里有没有价格和商品名尝试直接抓取商品数据的API接口
很多电商平台会把商品详情数据通过AJAX接口返回,这种方式比爬页面更高效。你可以打开浏览器开发者工具(F12),切换到移动端模拟模式,加载目标商品页面后,在Network标签里过滤XHR/fetch请求,找包含product、detail、price这类关键词的JSON接口。找到后直接用requests请求这个API,就能拿到结构化的商品数据,不用费劲解析HTML。如果以上方法都不行,再用Selenium/Playwright模拟浏览器渲染
如果页面完全依赖JS渲染,那requests确实拿不到动态内容,这时候就需要用能模拟真实浏览器的工具。比如用Selenium,你需要先安装Selenium和对应浏览器的驱动(比如ChromeDriver),然后写代码等待页面加载完成后提取元素:from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化无头Chrome浏览器(也可以去掉--headless参数看可视化过程) options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1') driver = webdriver.Chrome(options=options) try: driver.get("https://www.tokopedia.com/now/sumo-beras-putih-kemasan-merah-5-kg") # 等待价格元素加载出来,注意替换成页面实际的元素选择器 price = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'css-1ksb19c')) ).text # 等待商品名称元素加载出来,同样替换成实际选择器 product_name = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'css-1j7u5rr')) ).text print(f"商品名称: {product_name}") print(f"价格: {price}") finally: driver.quit()注意:要通过浏览器的“检查元素”功能,找到价格和商品名对应的真实标签选择器,替换代码里的示例值。
最后提醒下:别忘了遵守Tokopedia的反爬规则,不要频繁发送请求,必要的时候加个时间延迟,避免IP被封禁。
备注:内容来源于stack exchange,提问作者Hal

