如何在Python Selenium中禁用指定脚本以提升爬虫速度?
解决Selenium爬取速度慢:精准控制脚本与资源加载的方法
直接用NoScript扩展容易一刀切禁用所有脚本,导致目标元素依赖的必要代码无法运行。以下是更可控的优化方案,既能拦截不必要资源提速,又能保留核心脚本:
方案一:用Chrome DevTools协议(CDP)精准拦截请求
CDP可以让我们自定义拦截特定类型的资源或域名,比如广告、统计脚本、图片等,同时保留目标网站的必要脚本。
from selenium import webdriver from bs4 import BeautifulSoup import os def block_unnecessary_requests(driver): # 启用网络拦截功能 driver.execute_cdp_cmd('Network.enable', {}) # 定义要拦截的非必要资源类型 blocked_resource_types = [ 'image', 'media', 'font', 'beacon', 'csp_report', 'imageset' ] # 定义要拦截的广告、统计类域名 blocked_domains = ['google-analytics.com', 'adservice.google.com', 'facebook.net', 'doubleclick.net'] def should_block(request): # 拦截指定类型的资源 if request['resourceType'] in blocked_resource_types: return True # 拦截指定域名的请求 for domain in blocked_domains: if domain in request['url']: return True return False # 设置请求拦截规则 driver.execute_cdp_cmd( 'Network.setRequestInterception', {'patterns': [{'urlPattern': '*', 'interceptionStage': 'HeadersReceived'}]} ) # 处理拦截请求 def handle_interception(data): interception_id = data['interceptionId'] if should_block(data['request']): driver.execute_cdp_cmd('Network.continueInterceptedRequest', {'interceptionId': interception_id, 'cancel': True}) else: driver.execute_cdp_cmd('Network.continueInterceptedRequest', {'interceptionId': interception_id}) driver.add_event_listener('Network.requestIntercepted', handle_interception) # 配置Chrome选项 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--ignore-certificate-errors') chrome_options.add_argument('--ignore-ssl-errors') chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) # 启用无头模式减少UI渲染开销(可选) chrome_options.add_argument('--headless=new') # 设置页面加载策略为'eager':DOM加载完成即停止,无需等待所有资源 chrome_options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=chrome_options) # 启用请求拦截 block_unnecessary_requests(driver) driver.get("https://www.example.link.com") soup = BeautifulSoup(driver.page_source, "html.parser") the_element_i_need = soup.find("div", id="something") # 记得关闭驱动 driver.quit()
方案二:通过Chrome偏好设置禁用非核心功能
如果不需要太精准的域名拦截,直接通过浏览器偏好设置禁用图片、插件等非必要功能,操作更简单:
from selenium import webdriver from bs4 import BeautifulSoup import os chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--ignore-certificate-errors') chrome_options.add_argument('--ignore-ssl-errors') chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) chrome_options.add_argument('--headless=new') chrome_options.page_load_strategy = 'eager' # 设置偏好,禁用非必要功能 chrome_options.add_experimental_option("prefs", { "profile.default_content_setting_values.images": 2, # 禁用图片 "profile.default_content_setting_values.plugins": 2, # 禁用插件 "profile.default_content_setting_values.popups": 2, # 禁用弹窗 "profile.default_content_setting_values.geolocation": 2, # 禁用定位 "profile.default_content_setting_values.notifications": 2, # 禁用通知 }) driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.example.link.com") soup = BeautifulSoup(driver.page_source, "html.parser") the_element_i_need = soup.find("div", id="something") driver.quit()
额外优化建议
- 禁用扩展:添加
chrome_options.add_argument('--disable-extensions'),避免扩展占用资源 - 禁用GPU加速:添加
chrome_options.add_argument('--disable-gpu'),减少渲染开销 - 复用浏览器实例:如果爬取多个页面,尽量复用同一个
driver实例,避免重复启动浏览器的开销
内容的提问来源于stack exchange,提问作者Farlitz
相关产品推荐
相关产品推荐

