如何使用Selenium爬取网页数据 解决dastelefonbuch.de抓取报错问题
报错原因
- 元素查找方法使用错误:
driver.find_element_by_xpath("//div[@class='vcard']")返回的是单个WebElement对象,不支持for循环遍历,执行到循环语句会直接抛出类型错误。 - 子元素Xpath语法错误:在item下查找子元素时以
//开头的Xpath会从整个页面根节点匹配元素,只会反复返回页面第一个符合条件的内容,无法获取当前vcard对应的子元素数据。 - 元素属性获取逻辑错误:
i[@class='icon icon_url']是图标标签,本身没有text文本内容,直接取text只会返回空值,实际网址存储在该标签父级a标签的href属性中。 - 缺少页面加载等待逻辑:页面资源加载存在延迟,未等待元素渲染完成就执行查找操作,大概率会抛出NoSuchElementException报错。
- 语法适配问题:Selenium 4.0+版本已经废弃
find_element_by_xpath这类旧写法,继续使用会触发警告甚至报错。
解决方法
修正后的完整代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By PATH = r"C:\Program Files (x86)\chromedriver.exe" url = 'https://www.dastelefonbuch.de/Suche/Zahnarzt' driver = webdriver.Chrome(PATH) # 设置全局隐式等待10秒,等待元素渲染完成再执行查找 driver.implicitly_wait(10) driver.get(url) # 改用复数查找方法获取所有vcard元素列表,适配Selenium4+的标准写法 v_cards = driver.find_elements(By.XPATH, "//div[@class='vcard']") for item in v_cards: # 子元素xpath加.前缀,限定从当前item节点开始查找 title = item.find_element(By.XPATH, ".//div[@class='name']").text phone = item.find_element(By.XPATH, ".//span[@class='nr']").text # 取图标父级a标签的href属性获取网站地址 website = item.find_element(By.XPATH, ".//i[@class='icon icon_url']/parent::a").get_attribute('href') print(title, phone, website) # 爬取完成后关闭驱动释放资源 driver.quit()
如果遇到反爬验证拦截,可以在初始化ChromeDriver时添加UA伪装、无头模式等配置绕过基础检测。
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

