Selenium爬取comicshoplocator输入邮编后无法获取门店名问题
问题根因
提交邮编搜索后,门店列表是前端通过AJAX异步请求接口后动态渲染的,原代码在按下回车触发搜索的瞬间就直接读取页面源码,此时搜索结果还未加载完成,DOM结构中还不存在<div class="LocationName">标签,因此无法匹配到任何内容。
修复方法
使用Selenium的显式等待逻辑,在触发搜索后先等待目标门店元素加载完成,再读取页面源码做解析,不要在提交搜索后立刻抓取页面内容。
修正后完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup browser = webdriver.Firefox(executable_path=r'C:\Geckodriver\Geckodriver.exe') browser.get('https://www.comicshoplocator.com/StoreLocator') # 输入邮编触发搜索 browser.find_element(By.NAME, 'query').send_keys('73533' + Keys.RETURN) # 显式等待:最长等待10秒,直到页面加载出至少一个门店名称节点,再继续后续逻辑 WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "LocationName")) ) html = browser.page_source soup = BeautifulSoup(html, features="html.parser") for tag in soup.find_all('div', class_="LocationName"): print(tag.text) # 用完记得关闭浏览器 browser.quit()
注意事项
- 不推荐使用
time.sleep(固定秒数)的硬等待方式:硬等待无法适配不同网络速度的场景,等待时间短了会因为内容没加载完抓不到结果,等待时间长了会拖慢程序运行效率,显式等待会在检测到目标元素出现后立刻执行后续代码,稳定性和执行效率都更优。 - 如果需要兼容无搜索结果的场景,可以给显式等待加
try-except超时捕获,避免页面一直加载不出目标元素时程序直接抛出异常。
内容的提问来源于stack exchange,提问作者Ave
相关产品推荐
相关产品推荐

