使用BeautifulSoup生成空CSV文件的问题排查求助
Booking.com爬虫无法获取数据的解决方法
你的代码生成空CSV的核心原因是无法正确定位酒店元素,加上Booking的反爬机制拦截了请求,导致返回页面无有效数据。以下是具体问题分析和修复方案:
代码中的核心问题
- 缺少请求头,被反爬机制拦截:直接用
requests.get发送请求会被识别为机器人,返回页面不含酒店数据 - 酒店元素选择器错误:原代码中
data-testid="property-card"的写法不符合Beautiful Soup的语法,正确格式应为{'data-testid': 'property-card'} - HTML类名失效:网站页面结构已更新,原代码中的
sr-hotel__name、sr_rooms_table_block__prices等类名不再有效 - 未处理元素查找异常:若某元素找不到会直接报错终止程序,导致数据无法写入
- CSV表头与需求不符:你需要的是「酒店名称、评分分数、评级、评论数量」,但原表头包含了不需要的Price字段
修复后的完整代码
import requests from bs4 import BeautifulSoup import csv # 模拟浏览器请求头,绕过基础反爬 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' } # 目标URL url = 'https://www.booking.com/searchresults.en-gb.html?ss=Hurghada&sb=1' # 发送请求并解析页面 response = requests.get(url, headers=headers) response.encoding = 'utf-8' soup = BeautifulSoup(response.text, 'html.parser') # 定位前10个酒店卡片 hotels = soup.find_all('div', {'data-testid': 'property-card'})[:10] # 用with语句自动管理文件,避免资源泄漏 with open('booking.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) # 写入符合需求的表头 writer.writerow(['酒店名称', '评分分数', '评级', '评论数量']) for hotel in hotels: try: # 提取酒店名称 name = hotel.find('div', {'data-testid': 'title'}).text.strip() # 提取评分分数 score = hotel.find('div', {'data-testid': 'review-score'}).find('div').text.strip() # 提取评级(如Excellent/Very Good) rating = hotel.find('div', {'data-testid': 'review-score'}).find('span').text.strip() # 提取评论数量(仅保留数字) review_count = hotel.find('div', {'data-testid': 'review-score'}).find_all('div')[-1].text.strip().split()[0] # 写入CSV writer.writerow([name, score, rating, review_count]) except AttributeError: # 跳过查找失败的酒店,避免程序崩溃 continue
关键修改说明
- 添加请求头:通过
User-Agent模拟真实浏览器请求,绕过基础反爬机制 - 修正选择器:使用当前页面有效的
data-testid属性定位元素,避免因类名更新失效 - 异常处理:用
try-except捕获元素查找失败的情况,确保程序能继续处理后续酒店 - 匹配需求的表头:调整CSV表头为你需要的四个字段
- 安全文件操作:用
with语句自动关闭文件,避免手动关闭遗漏导致的问题
注意:Booking.com的页面结构可能随时更新,若后续再次失效,需重新检查页面元素的选择器。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

