能否向Selenium打开的WebDriver发送GET请求以爬取滚动页面?
问题:结合Selenium滚动无限页面后,如何用BeautifulSoup解析内容?
我需要爬取一个无限滚动页面的大量内容,目前用Selenium启动WebDriver打开页面,通过循环滚动让足够内容可见。但我想用BeautifulSoup解析页面信息,常规requests.get()只能获取初始页面内容,拿不到滚动后的内容。请问是否可以向已打开的WebDriver发送GET请求?
用户提供的代码:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager import requests from bs4 import BeautifulSoup import time # 原代码遗漏此导入,需补充 # 用WebDriver打开网站 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get(url) # 滚动加载循环 scroll_start = 0 for i in range(100): scroll_end = scroll_start + 1080 driver.execute_script(f'window.scrollTo({scroll_start}, {scroll_end})') time.sleep(2) scroll_start = scroll_end # 尝试用requests获取内容 response = requests.get(url) soup = BeautifulSoup(response.content, 'lxml')
回答
不能直接向已打开的WebDriver发送requests.get()请求。requests发起的是独立的HTTP请求,和WebDriver的浏览器会话完全无关——它只会获取服务器返回的初始页面内容,和WebDriver中已经滚动加载后的页面没有任何关联。
正确的做法是从WebDriver中提取当前已渲染完成的页面源码,再交给BeautifulSoup解析,具体步骤如下:
- 用WebDriver完成滚动操作,确保目标内容全部加载;
- 调用
driver.page_source获取当前页面的完整HTML源码; - 将源码传入BeautifulSoup进行解析。
修正后的代码示例:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get(url) # 滚动加载内容 scroll_start = 0 for i in range(100): scroll_end = scroll_start + 1080 driver.execute_script(f'window.scrollTo({scroll_start}, {scroll_end})') time.sleep(2) scroll_start = scroll_end # 获取WebDriver当前页面的完整源码,交给BeautifulSoup解析 page_source = driver.page_source soup = BeautifulSoup(page_source, 'lxml') # 示例:提取目标内容 # target_items = soup.find_all('div', class_='your-target-class') # 操作完成后关闭浏览器,释放资源 driver.quit()
额外提示:
driver.page_source会返回浏览器当前渲染的所有HTML内容,包括滚动加载的动态内容;- 如果页面是滚动到底部才触发AJAX加载,可以优化滚动逻辑(比如循环滚动至页面底部并等待加载),而非固定次数滚动;
- 务必在操作结束后调用
driver.quit()关闭浏览器,避免残留进程占用资源。
内容的提问来源于stack exchange,提问作者Thornam
相关产品推荐
相关产品推荐

