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]')]
- Booking前端类名会不定期迭代,你使用的
- 如果输出长度正常且有合法链接,进入第二步排查
第二步:修复详情页请求的反爬拦截
你的代码存在明显疏漏:请求搜索页时携带了合法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
相关产品推荐
相关产品推荐

