如何解决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
相关产品推荐
相关产品推荐

