使用Selenium读取CSV中TripAdvisor链接批量抓取酒店信息报错如何修复
代码问题修复方案
现有代码的核心问题
start_request函数无有效返回值:browser.get()本身没有返回值,你拿到的text永远是None,属于冗余设计。- 元素取值错误:定位到名称元素后没有取
.text属性,存入字典的是WebElement对象而非酒店名称文本。 - 数据追加逻辑错误:
result_list.append(mydict)只写在了异常分支里,正常抓取到数据时不会把结果存入列表,导致最终输出为空。 - 相对xpath写法错误:在父容器下查找子元素时,xpath开头要加
.代表当前节点下查找,否则会全局搜索,可能拿到第一个页面的旧数据。 - 缺少页面等待逻辑:页面还没加载完成就执行元素查找,大概率会抛出元素不存在的异常。
- 缺少价格、酒店等级的定位逻辑,Windows下ChromeDriver路径未做转义处理,可能导致驱动启动失败。
修复后的完整代码
!pip install selenium import pandas as pd import csv from time import sleep from random import randint from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 路径加r前缀避免转义,替换成你自己的chromedriver路径 browser = webdriver.Chrome(executable_path=r'C:\ProgramData\Anaconda3\Lib\site-packages\jupyterlab\chromedriver.exe') # 全局隐式等待10秒,没找到元素最多等10秒再抛异常 browser.implicitly_wait(10) result_list=[] def start_request(q): browser.get(q) print("正在抓取:"+q) # 等待页面核心标题加载完成再执行后续逻辑 WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "HEADING"))) def parse(): mydict = {} # 抓取酒店名称 try: mydict['name'] = browser.find_element(By.ID, "HEADING").text.strip() except Exception as e: print(e) mydict['name'] = 'null' # 抓取酒店等级,星级元素的aria-label属性自带星级信息 try: star_ele = browser.find_element(By.XPATH, '//*[@data-test-target="hotel-rating"]/svg') mydict['star_level'] = star_ele.get_attribute('aria-label').strip() except Exception as e: print(e) mydict['star_level'] = 'null' # 抓取价格区间,英文页面请把"价格区间"替换为"Price range" try: price_ele = browser.find_element(By.XPATH, '//div[contains(text(),"价格区间")]/following-sibling::div') mydict['price_range'] = price_ele.text.strip() except Exception as e: print(e) mydict['price_range'] = 'null' # 无论是否抓取异常都将当前数据存入结果列表 result_list.append(mydict) if __name__ == '__main__': with open('Best3HotelsLink.csv', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: req = row['Link'] start_request(req) parse() sleep(randint(2,5)) # 加长随机等待时间避免触发反爬机制 # 导出结果到CSV df = pd.DataFrame(result_list) df.to_csv('Detailed Hotelinfo.csv', encoding='utf-8-sig', index=False) print(df) # 抓取完成关闭浏览器 browser.quit()
额外注意事项
- 请确保你的
Best3HotelsLink.csv文件的链接列名确实为Link,和代码中读取的字段保持一致 - 建议升级Selenium到4.x版本,旧版本的
find_element_by_xpath等方法已经废弃,修复后的代码使用的是Selenium4官方推荐的写法
内容的提问来源于stack exchange,提问作者Wong_0606
相关产品推荐
相关产品推荐

