使用Selenium爬取Tripadvisor时无法点击下一页按钮如何解决
问题核心原因
- 你使用的绝对路径XPath稳定性极差,Tripadvisor页面DOM结构只要有轻微调整(比如插入运营位、调整模块顺序),路径就会完全失效
- 没有配置元素等待逻辑,headless模式下页面加载速度波动大,经常出现元素还没渲染完成就执行定位操作的情况,直接返回找不到元素的报错
find_elements_by_class_name方法仅支持传入纯类名参数,你写的div._2Q7zqOgW带了标签前缀,会直接匹配失败- 你用到的
_2Q7zqOgW这类带下划线前缀的类名是Tripadvisor前端打包自动生成的动态哈希类名,平台会定期更新后缀,完全不适合作为定位依据
修复后的可用代码
!pip install selenium !apt-get update !apt install chromium-chromedriver !cp /usr/lib/chromium-browser/chromedriver /usr/bin import sys sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver') from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from tqdm import tqdm_notebook as tqdm import pandas import json import pprint chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') # 加UA伪装,避免被反爬识别为headless浏览器 chrome_options.add_argument('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') wd = webdriver.Chrome('chromedriver',options=chrome_options) wd.get("https://www.tripadvisor.com/Restaurants-g187849-Milan_Lombardy.html") wait = WebDriverWait(wd, 15) # 用更稳定的aria-label属性定位下一页按钮,不受结构调整影响 next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[contains(@aria-label, "Next page")]'))) next_btn.click() # 用测试专属属性定位餐厅列表,不会随前端打包变更 list_restaurants = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div[data-test-target="restaurants-list-item"]'))) print(len(list_restaurants))
全量爬取补充说明
如果需要爬取所有分页的餐厅,只需要加循环判断即可:每次翻页后判断下一页按钮是否还存在/可点击,直到按钮处于禁用状态时终止循环即可。
内容的提问来源于stack exchange,提问作者Gloria Dalla Costa
相关产品推荐
相关产品推荐

