You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页抓取酒店评论至Pandas DataFrame时重复数据问题求助

解决重复抓取同一条酒店评论的问题

嘿,我看看你的问题哈~你现在遇到的重复抓取同一条评论的问题,主要是代码里几个小逻辑没处理对,我帮你拆解下问题,再给你修正后的代码:

问题根源拆解

  • 分页请求未实现:你写了range(10)的循环,但每次都请求同一个首页URL,根本没获取到后面页码的评论。万豪酒店的评论分页是通过URL参数pageNumber控制的,比如第2页的URL是https://www.marriott.com/hotels/hotel-reviews/amsnt-amsterdam-marriott-hotel?pageNumber=2。
  • 固定引用单条评论:你在代码里定义了first = general_data[i],之后所有的提取操作都基于first,相当于每次都只拿同一条评论的信息,完全没遍历general_data里的其他评论条目。
  • 数据收集逻辑错误:你每次循环都创建新的pagereviews DataFrame,之前的数据会被直接覆盖;而且你直接把BeautifulSoup的标签对象存入DataFrame,最后显示的不是评论的文本内容。
  • 变量i的逻辑冗余:你初始化i=1后又i+=1,但这个变量根本没起到遍历评论的作用,反而让你固定抓取了general_data[1]这条评论。

修正后的代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 初始化空列表存储所有评论数据
all_reviews = []
base_url = 'https://www.marriott.com/hotels/hotel-reviews/amsnt-amsterdam-marriott-hotel'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

# 循环抓取10页评论
for page_num in range(1, 11):
    # 构造分页URL
    url = f"{base_url}?pageNumber={page_num}"
    # 发送请求,添加headers避免被反爬
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    # 获取当前页的所有评论
    general_data = soup.find_all(class_='bvseo-review')
    
    # 遍历当前页的每条评论
    for review in general_data:
        # 提取评论文本,处理可能的空值
        description_tag = review.find('span', attrs={'itemprop':'description'})
        description = description_tag.get_text(strip=True) if description_tag else "无评论内容"
        
        # 提取评分
        rating_tag = review.find('span', attrs={'itemprop':'ratingValue'})
        rating = rating_tag.get_text(strip=True) if rating_tag else "无评分"
        
        # 提取作者
        auteur_tag = review.find('span', attrs={'itemprop':'author'})
        auteur = auteur_tag.get_text(strip=True) if auteur_tag else "匿名用户"
        
        # 将当前评论数据添加到列表
        all_reviews.append({
            "description": description,
            "ratingValue": rating,
            "author": auteur
        })

# 将列表转换为DataFrame
pagereviews = pd.DataFrame(all_reviews)
# 查看结果
print(pagereviews.head())

代码说明

  • 分页处理:通过page_num构造带pageNumber参数的URL,实现10页评论的抓取。
  • 数据提取优化:使用find而不是find_all(因为每个评论里对应字段只有一个),并通过get_text(strip=True)提取纯文本,同时处理字段为空的情况。
  • 数据收集方式:先用空列表存储所有评论的字典数据,最后一次性转换为DataFrame,避免数据覆盖。
  • 反爬处理:添加User-Agent请求头,模拟浏览器请求,降低被网站拦截的概率。

内容的提问来源于stack exchange,提问作者Pythonamateur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:04