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

如何解决BeautifulSoup抓取Memrise页面时的登录重定向问题

解决BeautifulSoup抓取登录后页面的问题

嘿,你遇到的核心问题其实很明确:你用requests.get()发起的请求和WebDriver的浏览器会话完全是分开的,它们不共享登录状态(也就是Cookie)。所以不管你在WebDriver里怎么登录,requests发起的请求都是未登录状态,服务器自然返回登录页。

下面给你两种有效的解决方案,你可以根据自己的需求选择:

方案一:把WebDriver的Cookie同步到requests里

这种方法适合想继续用requests来请求页面的场景,步骤是先通过WebDriver登录,把登录后的Cookie拿出来给requests复用:

from selenium import webdriver
import requests
from bs4 import BeautifulSoup
import time

# 启动浏览器,打开目标页面
driver = webdriver.Chrome()
target_url = "https://www.memrise.com/course/2021573/french-1-145/garden/speed_review/?source_element=ms_mode&source_screen=eos_ms"
driver.get(target_url)

# 这里留10秒时间让你手动完成登录(如果想自动化可以添加账号密码输入的代码)
time.sleep(10)

# 提取浏览器里的登录Cookie
cookies = driver.get_cookies()

# 把Cookie导入到requests的会话中
session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

# 现在用这个会话请求页面,就能拿到登录后的内容了
response = session.get(target_url)
soup = BeautifulSoup(response.text, 'html.parser')

# 你的原有逻辑(如果页面动态更新,需要定期重新请求)
while True:
    front_half = soup.find_all(class_='qquestion qtext')
    print(front_half)
    # 重新请求获取最新页面内容
    response = session.get(target_url)
    soup = BeautifulSoup(response.text, 'html.parser')
    time.sleep(1)

# 用完记得关闭浏览器
driver.quit()

方案二:直接用WebDriver获取页面源码(更简单可靠)

如果页面有很多动态内容(比如JS渲染的题目),直接用WebDriver获取渲染后的页面源码会更省心,因为它本身就处于登录后的会话中:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

# 启动浏览器并打开目标页面
driver = webdriver.Chrome()
target_url = "https://www.memrise.com/course/2021573/french-1-145/garden/speed_review/?source_element=ms_mode&source_screen=eos_ms"
driver.get(target_url)

# 留时间手动登录
time.sleep(10)

# 循环获取最新的页面内容
while True:
    # 每次都拿当前浏览器里的最新页面源码
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')
    front_half = soup.find_all(class_='qquestion qtext')
    print(front_half)
    time.sleep(1)

# 关闭浏览器
driver.quit()

为什么原来的代码无效?

你之前加time.sleep()只是给WebDriver留了登录时间,但requests.get()是完全独立的请求,它不会读取WebDriver里的登录Cookie。服务器判断请求未登录,就返回了登录页,所以BeautifulSoup解析的一直是登录页面的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:29:08