Python如何使用Selenium抓取动态网站

对于用静态 HTML 和 CSS 构建的网站,像 Python 的请求库和 Beautiful Soup 这样的简单工具通常能在网页抓取时完成工作。然而,在处理基于动态 JavaScript 框架(如 React、Angular 和 Vue)的高级网站时,抓取动态内容变得棘手。这些框架通过提供预构建的组件和架构简化了网页开发,但也使动态网站难以被抓取。

在这篇博客文章中,我们将概述动态网站和静态网站的区别,并提供动态网页爬取的逐步指南,特别是那些具有无限滚动功能的网站。

什么是动态网站?它与静态网站有何不同?

动态网站是指 HTML 页面不是固定的,而是基于用户操作、数据库查询或其他因素实时生成的网站。与静态网站向每位访客提供相同的预建 HTML 文件不同,动态网站可以实时加载内容,这意味着不同用户根据行为、偏好或搜索输入可以看到同一页面的不同版本。

这种区别主要取决于每种类型的请求处理方式。静态页面只需快速、直接且对所有人都一样的固定文件。在动态网页中,服务器首先进行中间处理,查询数据库,应用逻辑并个性化内容,然后将最终结果发送到浏览器。这使得动态网站更复杂,但互动性和个性化功能也更丰富。

电子商务产品页面、社交媒体动态和账户仪表盘都是常见例子——底层 URL 可能相同,但内容会根据谁和何时访问而变化。

网页抓取动态内容的挑战

抓取动态内容带来了独特的挑战,而像 Python 的请求库和 Beautiful Soup 这样的简单工具无法应对。其中一些可能包括:

  • JavaScript 渲染 :基本的 HTTP 请求无法实时捕获由 React、Angular 和 Vue 等框架生成的 HTML

  • 弹窗和叠加层:中间元素可能阻碍内容访问并中断抓取流程

  • 下拉菜单和实时搜索建议 :需要用户输入才能揭示内容的互动元素

  • 实时更新 :内容如果不经过页面重载,持续变化,更难准确捕捉

  • 可排序表 :根据用户交互动态重排序的数据需要额外处理

  • 无限滚动 :只有在用户向下滚动时才加载的内容需要自定义抓取器逻辑才能完全捕获

  • 反机器人保护 :动态网站常部署验证码和 IP 封锁,以中断自动抓取

如何抓取动态网页?

使用动态抓取技术,比如使用 Selenium、 使用无头浏览器以及发起 AJAX 请求。此外,可以参考高级的 Python 网页抓取指南,学习更多技巧,比如模拟 AJAX 调用和处理无限滚动。

然而,需要注意的是,每个目标都面临独特的挑战,比如弹窗、下拉菜单、实时搜索建议、实时更新、可排序表格等。

最常见的挑战之一是连续滚动或无限滚动——这是一种允许用户在网页滚动时动态加载内容的技术。要从具有无限滚动的网站上抓取目标网址,就需要自定义你的抓取工具。

如何使用 Selenium 抓取动态网页

本节将介绍使用 Selenium 在 Python 中抓取动态站点的步骤。对于这次演示的抓取目标,我们采用带有一些关键词的谷歌搜索页面。

第一步:环境搭建

首先,确保你的系统安装了最新版本的 Python。你还需要使用以下命令安装 Selenium 库:

pip install selenium

然后,下载 Chrome 驱动 ,确保版本与你的 Google Chrome 版本一致。

第二步:代码的实际应用

首先创建一个新的 Python 文件,导入所需的库:

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from bs4 import BeautifulSoup

然后通过复制路径到驱动可执行文件,粘贴以下代码,使用 Selenium 设置 Chrome Webdriver:

# Set up the Chrome WebDriver
driver = webdriver.Chrome()

随后,进入谷歌搜索页面,输入你的搜索关键词:

# Navigate to Google Search
search_keyword = "adidas"
driver.get("https://www.google.com/search?q=" + search_keyword)

现在你可以在硒上模拟连续滚动。使用下面的脚本,你将多次滚动以获得更多结果,然后抓取结果:

Define the number of times to scroll
scroll_count = 5


# Simulate continuous scrolling using JavaScript
for _ in range(scroll_count):
   driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
   time.sleep(2)  # Wait for the new results to load 

最后,使用 BeautifulSoap 解析并提取结果:

page_source = driver.page_source


# Parse the page source with BeautifulSoup
soup = BeautifulSoup(page_source, 'html.parser')


search_results = soup.find_all('div', class_='tF2Cxc')
for result in search_results:
   title = result.h3.text
   link = result.a['href']
   print(f"Title: {title}")
   print(f"Link: {link}")
   print("\n")

按照以下规定运行最终代码,查看结果:

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from bs4 import BeautifulSoup

# Set up the Chrome WebDriver
driver = webdriver.Chrome()

# Navigate to Google Search
search_keyword = "adidas"
driver.get("https://www.google.com/search?q=" + search_keyword)

# Define the number of times to scroll
scroll_count = 5

# Simulate continuous scrolling using JavaScript
for _ in range(scroll_count):
   driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
   time.sleep(2)  # Wait for the new results to load (adjust as needed)

# Get the page source after scrolling
page_source = driver.page_source


# Parse the page source with BeautifulSoup
soup = BeautifulSoup(page_source, "html.parser")

# Extract and print search results
search_results = soup.find_all("div", class_="tF2Cxc")
for result in search_results:
   title = result.h3.text
   link = result.a["href"]
   print(f"Title: {title}")
   print(f"Link: {link}")
   print("\n")

# Close the WebDriver
driver.quit()

输出应该大致如下:

Python如何使用Selenium抓取动态网站

这种网络抓取方法的一个问题是,谷歌可能会误以为你是恶意机器人,这通常会触发验证码。这意味着你需要将可靠的代理IP集成到脚本中,并不断轮换它们。

所以,如果你在寻找大规模提取数据的解决方案,也可以考虑商业解决方案,专门处理反机器人系统,如需要代理IP相关产品,可以联系余初云。

原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2221.html

Like (0)
Previous 2026年3月30日
Next 2026年3月30日

相关推荐

  • Vim 自动缩进命令

    Vim 是一款模式化文本编辑器,支持多种编辑模式,不同模式下键盘按键的功能会发生变化。它自带一套功能强大、设置灵活的自动缩进机制,核心就是 indentexpr 选项。写代码时缩进…

    2026年4月29日
    0
  • 什么是 PostgreSQL?一款开源数据库系统

    PostgreSQL 是一款开源的对象关系型数据库系统,能安全、稳定地应对各种复杂的数据处理需求。下面就为大家介绍PostgreSQL的基本概念、常见应用场景。 什么是 Postg…

    2026年4月23日
    0
  • 什么是 SSH?理解 SSH 及其加密技术

    远程连接服务器这件事,在没有加密的年代风险极高。用户名、密码、每一条执行的命令,全部明文跑在网络上,同一局域网里的人抓个包就能看清楚。Telnet 和 Rlogin 就是那时候的主…

    2026年4月14日
    0
  • DDoS攻击为何抵御难度大?

    DDoS攻击属于一种普遍的网络攻击手段,它运用分布、协同的大规模攻击模式直接或间接地借助互联网上其他被控制的计算机攻击目标系统或者网络资源,拥有极高的隐匿性和极强的摧毁力。 一、分…

    2026年6月4日
    0
  • 网站打开速度过慢是什么原因?

    对于企业来说,网站打开速度过慢是困扰很多站长的问题,无论网站建设制作过程中花费了多少精力,但往往因为打开速度过慢,很多访客在页面打开的过程中就选择关闭或者离开,导致网站数据惨不忍睹…

    2026年6月12日
    0
  • Windows 重置 MySQL Root 根密码

    知晓服务器的 MySQL Root 密码,可用于登录数据库控制台手动创建数据库、新建用户并关联数据库、为数据库用户分配对应权限等操作。 若遗忘 MySQL Root 用户密码,可按…

    2026年5月26日
    0
  • 如何更新Ubuntu和Debian版本

    过时的操作系统一旦停止接收安全补丁,便会成为攻击者眼中的”软柿子”。那些心怀不轨的人往往专门盯着这类系统下手——利用已知漏洞悄无声息地渗透服务器,进而窃取用…

    2026年5月11日
    0
  • 高防CDN相比普通CDN有什么不一样?

    CDN即内容分发网络,其原理是在网络各个节点部署服务器,在现有互联网架构基础之上构建出一层智能化的虚拟网络体系,借助CDN系统能够让网络内容的传输变得更为快捷、更为稳定。而高防CD…

    2026年7月14日
    0
  • 独立服务器存储扩容方案:在线添加硬盘不中断业务扩展存储容量

            在独立服务器的长期运维过程中,存储容量不足是几乎所有业务都会遇到的典型问题。随着网站访问量增长、用户数据累积、日志文件持续膨胀以及应用迭代更新,原本规划充裕的存储空…

    2026年10月1日
    0
  • 什么是僵尸网络?

    僵尸网络,作为一类极具破坏性的网络攻击手段,是指攻击者借助多台联网设备,在每台设备上植入并运行特定的机器人程序,进而操控这些被感染的设备,对服务器、公司网站、其他设备或个人发起攻击…

    2026年4月28日
    0