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

求助:Python的Selenium/Scrapy无法获取JS渲染内网页面源码

解决JS渲染内网网站爬取问题:Selenium page_source异常与Scrapy报错

Selenium相关问题处理

1. 修复等待逻辑,确保JS完全渲染

你当前的document_initialised函数直接返回True,等于没等页面JS加载完成就获取源码,自然拿到的是未渲染的原始HTML。替换成以下两种等待方式之一:

等待页面加载完成(document readyState为complete)

import os
import undetected_chromedriver as uc
from selenium.webdriver.support.wait import WebDriverWait

def document_initialised(driver):
    return driver.execute_script("return document.readyState") == "complete"

os.environ['PATH'] += r"D:/SeleniumDrivers"
driver = uc.Chrome()

driver.get("http://intranet.page:port/path")
WebDriverWait(driver, timeout=10).until(document_initialised)
print(driver.page_source)

等待JS渲染的关键元素出现

如果页面有明确的JS生成元素(比如特定ID/class的DOM节点),直接等待该元素加载更可靠:

import os
import undetected_chromedriver as uc
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

os.environ['PATH'] += r"D:/SeleniumDrivers"
driver = uc.Chrome()

driver.get("http://intranet.page:port/path")
# 替换成你页面中JS渲染的元素选择器
WebDriverWait(driver, timeout=10).until(EC.presence_of_element_located((By.ID, "js-generated-element")))
print(driver.page_source)

2. 适配内网环境特殊配置

内网网站可能依赖用户登录会话、代理或特定浏览器配置,尝试加载本地Chrome用户配置保持登录状态:

import os
import undetected_chromedriver as uc
from selenium.webdriver.support.wait import WebDriverWait

os.environ['PATH'] += r"D:/SeleniumDrivers"
options = uc.ChromeOptions()
# 替换成你的Chrome用户数据目录路径
options.add_argument(r"user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data")
options.add_argument("--profile-directory=Default")

driver = uc.Chrome(options=options)
driver.get("http://intranet.page:port/path")
WebDriverWait(driver, timeout=10).until(lambda d: d.execute_script("return document.readyState") == "complete")
print(driver.page_source)

Scrapy相关问题处理

Scrapy默认不支持JS渲染,直接爬取会拿到原始HTML,后续解析时因找不到JS生成的元素报错。推荐用以下方案解决:

集成Scrapy-Playwright处理JS渲染

安装依赖

pip install scrapy-playwright playwright
playwright install chromium

配置Scrapy项目(settings.py)

DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}
PLAYWRIGHT_LAUNCH_OPTIONS = {
    "headless": False,  # 调试时可以关闭无头模式查看页面
    "args": ["--no-sandbox", "--disable-web-security"],  # 适配内网环境可能的限制
}

编写Spider代码

import scrapy

class IntranetSpider(scrapy.Spider):
    name = "intranet_spider"
    start_urls = ["http://intranet.page:port/path"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(
                url,
                meta={"playwright": True, "playwright_include_page": True},
                callback=self.parse,
            )

    async def parse(self, response):
        page = response.meta["playwright_page"]
        # 等待JS渲染的关键元素加载
        await page.wait_for_selector("#js-generated-element")
        # 获取渲染后的页面源码
        rendered_content = await page.content()
        # 后续解析逻辑写在这里
        self.logger.info(f"获取到渲染后的页面长度: {len(rendered_content)}")
        await page.close()

额外注意事项

  • 内网网站可能需要携带登录Cookie,可从浏览器开发者工具中复制Cookie,添加到Scrapy请求头或Selenium的Cookie中
  • 若Scrapy报错信息不完整,可查看完整Traceback定位具体解析错误,比如是否是XPath/CSS选择器未匹配到JS渲染元素

内容的提问来源于stack exchange,提问作者andrei141592

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:05:25