如何抓取Backmarket网站AirPods的全部753条用户评论?
抓取Backmarket AirPods全部用户评论的解决方案
你遇到的问题是因为Backmarket的评论是动态加载的——初始页面只返回前10条评论,剩下的评论需要滚动页面时通过API请求逐步加载,而你的requests代码只能获取页面首次渲染的静态内容,自然拿不到全部数据。下面是具体解决方法:
核心思路
放弃直接抓取页面HTML,转而调用网站加载评论的后端API接口,通过分页请求获取所有评论数据。
步骤说明
找到评论API接口
打开浏览器F12进入开发者工具,切换到「Network」标签,然后滚动评论区加载更多内容,找到类型为XHR的请求(通常URL里包含reviews字样)。比如AirPods评论的API接口格式大概是:https://www.backmarket.com/api/reviews?productFamilyId=345c3c05-8a7b-4d4d-ac21-518b12a0ec17&page={页码}&limit={每页条数}其中
page是当前页码,limit是每页返回的评论数(默认10),响应是JSON格式,直接包含所有评论字段。计算总页数
API响应里会返回total字段(总评论数753),用总评论数 ÷ 每页条数向上取整就能得到总页数,比如753/10=76页。循环请求所有分页
编写循环,从page=1到总页数,依次请求每个页面的API,解析JSON提取需要的字段,最后合并成DataFrame。
完整代码示例
import pandas as pd import requests import time # 评论API基础URL和固定参数 base_url = "https://www.backmarket.com/api/reviews" params = { "productFamilyId": "345c3c05-8a7b-4d4d-ac21-518b12a0ec17", "limit": 10 # 每页10条,和网站默认一致 } # 模拟浏览器请求头,避免被拦截 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" } # 先请求第一页,获取总评论数和总页数 response = requests.get(base_url, params=params, headers=headers) data = response.json() total_reviews = data["total"] total_pages = (total_reviews + params["limit"] - 1) // params["limit"] # 向上取整计算总页数 # 存储所有评论的列表 all_reviews = [] # 循环请求每一页 for page in range(1, total_pages + 1): params["page"] = page print(f"正在抓取第 {page}/{total_pages} 页...") try: response = requests.get(base_url, params=params, headers=headers) response.raise_for_status() # 检查请求是否成功 page_data = response.json() # 提取每条评论的字段,和你原代码的字段对应 for review in page_data["items"]: reviewer_info = review["reviewer"] all_reviews.append({ "reviewers_name": reviewer_info["displayName"], "purchase_date": review["purchaseDate"], "country": reviewer_info["country"], "products": review["product"]["name"], "review": review["content"], "review_ratings": review["rating"] }) time.sleep(1) # 加1秒延时,避免请求太频繁被封 except Exception as e: print(f"抓取第 {page} 页失败: {str(e)}") continue # 转换成DataFrame df = pd.DataFrame(all_reviews) print(f"共抓取到 {len(df)} 条评论") # 可以保存到CSV # df.to_csv("backmarket_airpods_reviews.csv", index=False)
注意事项
- 请求头模拟:一定要加
User-Agent,否则网站可能直接拒绝请求 - 请求频率控制:加适当的延时(比如1秒),避免触发反爬机制
- 异常处理:代码里加入了异常捕获,避免某一页请求失败导致整个程序终止
内容的提问来源于stack exchange,提问作者Sharif
相关产品推荐
相关产品推荐

