网页抓取酒店评论至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里的其他评论条目。 - 数据收集逻辑错误:你每次循环都创建新的
pagereviewsDataFrame,之前的数据会被直接覆盖;而且你直接把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
相关产品推荐
相关产品推荐

