使用BeautifulSoup爬取React页面提示需启用JavaScript如何解决
问题原因
React 属于客户端渲染(CSR)框架,服务端返回的初始 HTML 仅包含You need to enable Javascript to run this app的占位提示,完整页面DOM需要等浏览器端JS执行、接口请求完成后才会渲染生成。你当前的代码在调用browser.get()后立刻获取页面源码,此时页面JS还未执行完成,自然只能拿到未渲染的初始内容。
可行解决方案
- 方案1:给Selenium添加等待逻辑,等页面渲染完成再提取源码
你的原有代码存在两个问题:一是没有等待JS执行完成,二是chrome_options参数在新版Selenium中已弃用,修改后的参考代码如下:from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup options = webdriver.ChromeOptions() # 去除自动化特征,避免被网站反爬识别 options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) # 可选:模拟正常浏览器UA options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") browser = webdriver.Chrome(options=options) browser.get('替换为你的目标页面地址') # 显式等待,直到页面核心元素加载完成,最多等10秒 # 这里的选择器替换为你目标页面实际存在的核心元素选择器,比如React根节点一般为id=root wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID, 'root'))) soup = BeautifulSoup(browser.page_source, "html.parser") print(soup.prettify()) # 用完记得关闭浏览器 browser.quit() - 方案2:使用requests_html的JS渲染功能
你之前用requests_html没有拿到渲染后内容,大概率是没有调用render()方法触发JS执行,参考代码如下:from requests_html import HTMLSession session = HTMLSession() r = session.get('替换为你的目标页面地址') # 触发JS渲染,默认会等待加载完成,可通过sleep参数设置额外等待时间 # 第一次运行时会自动下载适配的chromium内核,等待完成即可 r.html.render(sleep=2) print(r.html.html) - 额外说明:
requests.get本身不支持JS执行,只能拿到服务端返回的原始静态HTML,所以用来爬React这类客户端渲染的页面天生就会拿到JS未启用的提示,不适合这类场景。
内容的提问来源于stack exchange,提问作者plasmy
相关产品推荐
相关产品推荐

