Selenium循环访问Wooclap页面时driver.get速度优化咨询
问题描述
我尝试访问网页www.wooclap.com/EPUUJK,该网站用于创建活动与发起提问,页面底部可查看已连接的用户数。我编写了如下代码:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('-no-sandbox') options.add_argument('-disable-dev-shm-usage') x =-1 while x <0: driver = webdriver.Chrome('chromedriver', options=options) driver.get("https://www.wooclap.com/EPUUJK")
这段代码可正常运行,每5秒已连接用户数会增加1,但我希望大幅提升该操作的速度,请问该如何实现?
提速方案
1. 复用浏览器实例,避免重复启动Chrome
你的代码每次循环都新建Chrome驱动实例,浏览器启动本身就是最大的性能瓶颈。把驱动初始化移到循环外,循环内仅执行页面访问/刷新:
from selenium import webdriver import time options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 追加优化参数 options.add_argument('--disable-gpu') options.add_argument('--disable-extensions') # 仅初始化一次浏览器 driver = webdriver.Chrome('chromedriver', options=options) x = -1 try: while x < 0: driver.get("https://www.wooclap.com/EPUUJK") # 可根据情况调整延迟,避免请求过于频繁触发拦截 time.sleep(0.5) finally: driver.quit()
2. 用refresh()替代重复get请求
如果页面刷新即可更新用户数,使用driver.refresh()比重复调用get更高效:
# 先一次性打开页面 driver.get("https://www.wooclap.com/EPUUJK") while x <0: driver.refresh() time.sleep(0.5)
3. 优化Chrome参数,减少资源消耗
在现有参数基础上,添加以下参数进一步压缩加载时间:
--blink-settings=imagesEnabled=false:禁用图片加载(如果用户数统计不依赖图片)--incognito:使用无痕模式,避免缓存和历史记录干扰--disable-features=VizDisplayCompositor:关闭不必要的渲染组件
4. 改用更轻量的浏览器驱动
如果Chrome资源占用过高,可替换为Firefox无头模式或Edge驱动,这类浏览器在无头模式下资源消耗更低。示例Firefox配置:
from selenium import webdriver from selenium.webdriver.firefox.options import Options options = Options() options.add_argument('--headless') driver = webdriver.Firefox(options=options)
5. 谨慎使用并发请求(注意防封)
单实例提速有限时,可通过多线程/多进程启动多个浏览器实例,但需控制并发量,避免触发网站反爬机制。示例多线程代码:
import threading from selenium import webdriver def visit_loop(): options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver', options=options) try: while True: driver.refresh() time.sleep(0.5) finally: driver.quit() # 启动3个线程(根据实际情况调整数量) for _ in range(3): t = threading.Thread(target=visit_loop) t.daemon = True t.start() # 保持主线程运行 while True: pass
⚠️ 注意:并发请求可能导致IP被封禁,建议先测试低并发量,并设置合理延迟。
内容的提问来源于stack exchange,提问作者Malou
相关产品推荐
相关产品推荐

