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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05