如何加速使用Selenium爬取seetickets.us的效率?
提速解决方案
针对你遇到的隐式等待导致耗时剧增的问题,给你几个实用的优化方法:
1. 替换全局隐式等待为精准显式等待
隐式等待是全局生效的,所有元素查找都会触发等待,这是你耗时的核心原因。建议完全关闭隐式等待,只对必须等待出现的关键元素使用显式等待,并设置极短的超时时间(比如1秒)。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 先关闭全局隐式等待 driver.implicitly_wait(0) # 仅对需要等待的元素使用显式等待,超时设为1秒 try: price_table = WebDriverWait(driver, 1).until( EC.presence_of_element_located((By.CSS_SELECTOR, "your-price-table-selector")) ) # 处理价格表数据 except: # 无价格表时的逻辑 pass
2. 用find_elements替代find_element(非关键元素)
对于那些不存在也不影响流程的元素,直接用find_elements(复数形式)查找。它找不到元素时会返回空列表,不会抛出异常,也不会触发任何等待,能立刻进入判断逻辑。
# 查找价格表,不存在则返回空列表 price_table = driver.find_elements(By.CSS_SELECTOR, "your-price-table-selector") if price_table: # 有价格表时处理数据 data = price_table[0].text else: # 无价格表时的处理 data = "无价格信息"
3. 优化页面加载策略
浏览器默认会加载所有资源(图片、视频等),这会浪费大量时间。可以设置页面加载策略为eager(只加载DOM结构),或者直接禁用图片加载:
from selenium.webdriver.chrome.options import Options chrome_options = Options() # 设置页面加载策略为eager,仅加载DOM chrome_options.page_load_strategy = 'eager' # 禁用图片加载,进一步提速 prefs = {"profile.managed_default_content_settings.images": 2} chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=chrome_options)
4. 新标签页打开活动,避免页面跳转
不要每次爬完都返回列表页,直接在新标签页打开每个活动链接,处理完关闭标签页即可,节省页面跳转的时间:
# 在列表页获取所有活动链接 activity_links = [elem.get_attribute('href') for elem in driver.find_elements(By.CSS_SELECTOR, "activity-link-selector")] for link in activity_links: # 打开新标签页 driver.execute_script("window.open(arguments[0]);", link) # 切换到新标签页 driver.switch_to.window(driver.window_handles[-1]) # 爬取当前活动页面数据 # ...(这里用上面的优化方法处理元素查找) # 关闭当前标签页 driver.close() # 切回列表页标签页 driver.switch_to.window(driver.window_handles[0])
5. 并行处理(可选)
如果单线程效率不够,可以用多线程/多进程同时处理多个活动页面。注意控制并发数(比如3-5个线程),避免触发网站反爬机制。
import threading def crawl_activity(link): # 每个线程单独初始化浏览器实例(或用浏览器池) chrome_options = Options() chrome_options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=chrome_options) driver.get(link) # 爬取数据逻辑 # ... driver.quit() # 启动多线程 activity_links = [elem.get_attribute('href') for elem in driver.find_elements(By.CSS_SELECTOR, "activity-link-selector")] threads = [] for link in activity_links[:5]: # 先测试5个并发 t = threading.Thread(target=crawl_activity, args=(link,)) threads.append(t) t.start() for t in threads: t.join()
内容的提问来源于stack exchange,提问作者glitch_123
相关产品推荐
相关产品推荐

