Python爬虫抓取Yelp评论无法写入JSON,请求排查修改
解决Yelp.ie爬虫无评论数据的问题
核心问题分析
你的代码无报错但抓不到数据,根源在三个地方:
- 未模拟浏览器请求:Yelp会拦截无浏览器标识的请求,返回的页面不含评论内容
- 元素选择器失效:Yelp页面的class类名已更新,原代码里的
card-item js-product-data等选择器匹配不到任何元素 - 分页URL格式错误:Yelp的分页参数不是
/review/p{page},正确分页需用start参数控制
修改后的完整代码
import requests from bs4 import BeautifulSoup import json url = "https://www.yelp.ie/biz/diwali-indian-restaurant-dublin" reviews = [] num_pages = 5 # 模拟浏览器请求头 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" } for page in range(num_pages): # 计算起始偏移量,Yelp每页默认20条评论 start = page * 20 review_url = f"{url}?start={start}" response = requests.get(review_url, headers=headers) # 检查请求是否成功,避免无效页面解析 if response.status_code != 200: print(f"第{page+1}页请求失败,状态码:{response.status_code}") continue soup = BeautifulSoup(response.content, "html.parser") # 匹配当前页面的所有评论容器 review_list = soup.find_all("div", class_="review__09f24__oHr9V border-color--default__09f24__NPAKY") for review in review_list: # 提取作者名称 author = review.find("a", class_="css-19v1rkv").text.strip() # 提取评论日期 date = review.find("span", class_="css-chan6m").text.strip() # 提取评论文本 text = review.find("p", class_="comment__09f24__gu0rG css-qgunke").text.strip() # 从图片alt属性提取评分(比如"5.0 star rating") score_img = review.find("img", class_="css-1q2nwpv") score = score_img["alt"].split()[0] if score_img else "无评分" reviews.append({ "author": author, "date": date, "text": text, "score": score }) # 保存时指定编码,避免中文乱码 with open("reviews.json", "w", encoding="utf-8") as outfile: json.dump({"reviews": reviews}, outfile, indent=4, ensure_ascii=False)
关键修改说明
- 添加请求头:通过
User-Agent模拟浏览器请求,绕过Yelp的基础反爬拦截 - 修正分页逻辑:用
start参数控制分页(第n页对应start=(n-1)*20),替换原错误的分页URL格式 - 更新元素选择器:根据当前Yelp页面的实际class类名,重新编写了评论容器、作者、日期、文本、评分的匹配规则
- 增加请求校验:对请求状态码做检查,避免无效页面解析导致的异常
- 优化JSON保存:添加
encoding="utf-8"和ensure_ascii=False,确保特殊字符正常保存
注意事项
- Yelp页面结构可能随时更新,若后续再次抓不到数据,需重新审查页面元素的class类名
- 控制请求频率,避免频繁访问触发IP封禁
内容的提问来源于stack exchange,提问作者MISHA
相关产品推荐
相关产品推荐

