新手求助:使用BeautifulSoup爬取TripAdvisor景点评论无输出问题排查
排查TripAdvisor爬虫无输出问题的思路和解决方案
作为爬过TripAdvisor的过来人,我来帮你一步步捋清楚问题所在:
第一步:先确认请求是否真的成功
你代码里打印了req.status_code,先看这个输出值:
- 如果是403 Forbidden:说明TripAdvisor的反爬机制拦住了你的请求。虽然你加了User-Agent,但可能不够贴近真实浏览器,或者需要补充
Referer这类请求头,建议换成你当前正在用的浏览器的最新UA(可以通过「浏览器设置→关于浏览器」查看版本,再找对应的UA字符串)。 - 如果是200 OK:那请求没问题,问题出在页面元素的定位上。
第二步:检查元素定位的class是否失效
TripAdvisor的页面结构经常会更新,你用的XllAv H4 _a这个class大概率已经过期了。你可以手动打开目标页面,右键点击任意一条评论的标题,选择「检查」,查看当前评论标题的正确class:
- 目前(2024年),TripAdvisor的评论标题对应的class是
QewHA H4 _a,评论内容对应的class是fIrGe _T。 - 另外,建议先定位评论列表的父容器(比如带
data-test-target="reviews-tab"属性的div),再在里面找子元素,这样能避免匹配到页面上的无关元素。
修改后的可运行示例代码
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', 'Referer': 'https://www.tripadvisor.co.uk/' } url = "https://www.tripadvisor.co.uk/Attraction_Review-g304141-d4782530-Reviews-Sigiriya_The_Ancient_Rock_Fortress-Sigiriya_Central_Province.html" try: req = requests.get(url, headers=headers, timeout=10) print("请求状态码:", req.status_code) if req.status_code == 200: soup = BeautifulSoup(req.content, 'html.parser') # 先定位评论列表的父容器,缩小查找范围 review_container = soup.find('div', {'data-test-target': 'reviews-tab'}) if not review_container: print("未找到评论容器,可能页面结构已更新,请重新检查元素") else: # 提取所有评论标题和内容 review_titles = review_container.find_all(class_="QewHA H4 _a") review_contents = review_container.find_all(class_="fIrGe _T") print("\n=== 爬取到的评论 ===") for idx, (title, content) in enumerate(zip(review_titles, review_contents), 1): print(f"\n评论{idx}:") print(f"标题:{title.get_text(strip=True)}") print(f"内容:{content.get_text(strip=True)}") else: print(f"请求失败,状态码:{req.status_code},请检查请求头或网络环境") except Exception as e: print(f"请求过程出错:{str(e)}")
额外提醒
- 如果运行后只拿到几条评论,那是因为TripAdvisor用了动态加载(滚动页面才会加载更多评论),这种情况下
requests就不够用了,需要用Selenium或Playwright模拟浏览器滚动来获取完整内容。 - 频繁爬取容易被封IP,建议每次请求后加个2-3秒的延迟(
import time后用time.sleep(2)),或者考虑用代理IP。
内容的提问来源于stack exchange,提问作者Shiron Pereira
相关产品推荐
相关产品推荐

