如何优化基于Selenium webdriver的表格数据爬虫?
爬取效率优化可行方案
最优方案:替换Selenium模拟浏览器方案
这是能带来量级速度提升的核心优化,优先尝试
- Selenium模拟浏览器的页面渲染、资源加载、元素等待开销是当前速度慢的核心原因,你可以通过抓包获取站点的搜索接口直接请求数据:
- 打开浏览器F12开发者工具切换到「网络」标签,点击一次搜索按钮,找到提交搜索参数的HTTP请求
- 复制该请求的请求头、表单参数(就是你输入的姓名通配符、part值等参数)
- 后续循环直接用
requests库构造对应请求,返回的内容要么是结构化JSON,要么是HTML片段,用lxml或者BeautifulSoup解析即可,速度比Selenium快10倍以上
必须保留Selenium时的优化方案
如果站点有强反爬必须用浏览器环境,可做如下优化:
启动配置优化
- 开启无头模式,关闭可视化窗口,同时禁用图片、CSS、字体等非必要资源加载,减少渲染开销:
from selenium.webdriver.chrome.options import Options chrome_options = Options() # 无头模式 chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") # 禁用图片、样式、字体加载 prefs = { "profile.managed_default_content_settings.images": 2, "profile.managed_default_content_settings.stylesheets": 2, "profile.managed_default_content_settings.fonts": 2 } chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome('./chromedriver.exe', options=chrome_options)
- 删掉无意义的
driver.maximize_window()操作,无头模式下窗口大小不影响元素定位,徒增开销。
流程逻辑优化
- 去掉重复的元素等待:输入框是页面常驻元素,不需要每次循环都重复等待可点击,只需要每次点击搜索后等待表格加载完成即可。
- 优化表格提取逻辑:原代码分6次查询所有列元素,再循环1000次逐个取属性,会重复遍历DOM树多次,优化为一次性取所有行,逐行提取对应列:
# 点击搜索后仅等待表格行加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "table tbody tr"))) rows = driver.find_elements(By.CSS_SELECTOR, "table tbody tr") for row in rows: tds = row.find_elements(By.TAG_NAME, "td") # 一次提取6个字段追加到列表 li.extend([tds[1].text, tds[2].text, tds[3].text, tds[4].text, tds[5].text, tds[6].text])
数据存储优化
不要等全部324页采集完再写入CSV,每采集完一页就追加写入一次,避免程序崩溃丢失全部数据,同时减少内存占用。
内容的提问来源于stack exchange,提问作者pickle rick
相关产品推荐
相关产品推荐

