如何自动在httpProtocol与selenium protocol间切换以适配多URL?
自动切换HTTP请求与Selenium的URL处理方案
核心逻辑
优先采用直接HTTP请求(速度更快)尝试获取页面内容,通过自定义校验规则判断是否拿到有效渲染结果;若校验失败,则自动切换为Selenium浏览器渲染方式加载页面。
具体实现步骤
1. 定义HTTP请求的校验规则
直接HTTP请求可能仅返回JS骨架页面(如仅含<div id="app"></div>)或错误响应,需设定判断标准:
- 响应状态码为
200 - 响应内容长度达到阈值(如>500字节,排除空页面)
- 内容不含“loading”“请启用JavaScript”等未渲染提示文本
2. 编写HTTP请求尝试函数
用requests库实现快速请求:
import requests def try_http_request(url, timeout=10): try: headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers, timeout=timeout) response.raise_for_status() # 抛出HTTP错误状态码异常 # 自定义校验逻辑,可根据目标网站调整 if len(response.text) > 500 and "loading" not in response.text.lower(): return True, response.text return False, "页面内容为空或未完成JS渲染" except Exception as e: return False, str(e)
3. 编写Selenium降级加载函数
当HTTP请求失败时,启动无头浏览器渲染页面:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By def try_selenium(url, timeout=20): chrome_options = Options() chrome_options.add_argument("--headless=new") # 无头模式节省资源 chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") driver = None try: driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 显式等待页面加载完成(替代固定sleep,更高效) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "body")) ) page_source = driver.page_source if len(page_source) > 1000: return True, page_source return False, "Selenium加载页面内容异常" except Exception as e: return False, str(e) finally: if driver: driver.quit()
4. 整合自动切换逻辑
遍历URL列表,自动选择最优加载方式:
def process_urls(url_list): results = [] for url in url_list: print(f"处理URL: {url}") success, content = try_http_request(url) if success: results.append({"url": url, "method": "HTTP", "content": content}) print("HTTP请求成功") else: print(f"HTTP请求失败: {content},切换至Selenium") success_sel, content_sel = try_selenium(url) if success_sel: results.append({"url": url, "method": "Selenium", "content": content_sel}) print("Selenium加载成功") else: results.append({"url": url, "method": "Failed", "error": content_sel}) print(f"所有方式均失败: {content_sel}") return results # 示例调用 url_list = ["https://example.com", "https://some-js-rendered-site.com"] process_urls(url_list)
注意事项
- 校验规则需适配目标网站:不同站点的未渲染特征不同,可添加正则匹配目标内容、检查特定DOM元素等逻辑优化判断
- Selenium性能优化:优先使用显式等待替代固定sleep,可添加
--disable-images等参数进一步提速 - 异常处理扩展:可针对网络超时、浏览器驱动版本不匹配等场景添加针对性处理逻辑
内容的提问来源于stack exchange,提问作者jaspreet chahal
相关产品推荐
相关产品推荐

