You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:21:27