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

Booking.com爬虫修改链接筛选规则后全返回NaN问题排查

故障排查与解决方法

第一步:先确认链接提取是否正常

你修改筛选规则后全返回NaN,首先要验证链接列表是否正常生成,在提取links1的代码后增加一行输出:

print(len(links1), links1[:3])

根据输出结果对应处理:

  • 如果输出长度为0,说明你的class筛选规则和页面实际DOM不匹配:
    • Booking前端类名会不定期迭代,你使用的js-sr-hotel-link hotel_name_link url多类匹配规则可能已经失效,部分类名被移除或修改
    • 建议改用更稳定的CSS选择器写法,不受类名顺序影响:
      links1 = [a['href'] for a in soup.select('div.hotellist.sr_double_search a.js-sr-hotel-link.hotel_name_link.url[href]')]
      
  • 如果输出长度正常且有合法链接,进入第二步排查

第二步:修复详情页请求的反爬拦截

你的代码存在明显疏漏:请求搜索页时携带了合法headers,但是循环请求酒店详情页时没有携带headers:

# 原错误写法
results = requests.get(url)
# 修改为携带headers,避免被Booking反爬拦截返回验证页/403页
results = requests.get(url, headers=headers)

反爬拦截后你解析的根本不是酒店详情页,自然所有字段都匹配不到,全部返回NaN。

第三步:更稳妥的去重方案

不需要修改原有筛选逻辑也能解决链接重复问题,拿到原始链接后直接用set去重即可,避免匹配规则修改出错:

# 原有逻辑提取所有链接后去重
raw_links = [a['href'] for a in soup.find("div", {"class": "hotellist sr_double_search"}).find_all('a', href=True)]
links1 = list(set(raw_links))

额外优化建议

  • 每次请求后增加状态码校验,避免解析错误页面:if results.status_code != 200: continue
  • 循环中增加随机延迟,避免请求频率过高被封IP:time.sleep(random.uniform(1, 3))
  • 定期确认详情页的字段类名,Booking会不定期更新前端类名导致匹配失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 03:06:04