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日

相关推荐

  • 网站打开速度越来越慢和主机有关系吗?

    网站上线运营一段时间后,页面加载越来越慢几乎是个绕不开的问题。 出现这种情况,很多站长的第一反应是去查代码、压图片、卸插件,或者觉得是最近网络不稳定。这些方向不能说没有道理,但常常…

    2026年4月13日
    0
  • 什么是电子邮件安全?电子邮件安全的原理

    电子邮件安全是一套用于保护电子邮件通信免受未经授权访问、冒充、恶意软件及其他形式的滥用的技术和实践。 它有助于保持信息私密,验证发件人是否合法,并降低钓鱼、伪造和有害附件进入收件箱…

    2026年3月26日
    0
  • 什么是会话固定攻击(Session Fixation)?

    你知道吗?登录网站时,网站是怎么记住你身份的?答案就是会话(Session)。 可以把 Session 想象成住酒店拿到的房卡。拿着这张卡,酒店就知道你是哪个房间的客人,能进出房间…

    2026年5月18日
    0
  • 网络流量清洗是什么意思?基本原理及应用盘点

    “网络流量清洗技术主要用于清除目标对象的恶意网络流量,以保障正常网络服务通信。” 网络信息系统时常遭受DoS、DDoS等各类恶意网络流量攻击,造成网络服务品…

    2026年6月5日
    0
  • IPv4与IPv6:互联网网络层协议的演进与迁移路径

    众所周知,Internet是当前全球规模最大、影响力最广的计算机网络,其网络层作为核心支撑部分,主要涵盖了网际协议(IP)、路由协议以及互联网控制报文协议(ICMP)等关键内容。 …

    2026年4月23日
    0
  • 什么是云端基础设施?

    云端基础设施定义 云基础设施是硬件和软件元素的组合,包括计算能力、网络、存储和虚拟化资源,这些都是支撑云计算的必要条件。 虚拟资源与实体基础设施对应,包括存储器、网络交换器、服务器…

    2026年4月30日
    0
  • 什么是域名解析?

    搭建公司官网,离不开域名的配置。而域名在配置之前,必须先完成域名解析,那么究竟什么是域名解析?域名又该如何解析呢?下面一起跟随余初云小编来了解一下吧! 一、什么是域名解析 域名解析…

    2026年6月15日
    0
  • 如何在 Arch Linux 系统上保障 SSH 服务器的安全性

    OpenSSH 是一种安全的远程登录协议,能够在不安全的网络上建立安全通道。它使系统管理员能够通过安全通道远程管理 Linux 服务器。它采用客户端-服务器架构,并允许用户远程连接…

    2026年4月3日
    0
  • 一文看懂分布式存储架构

    我们先来看看如今技术与应用层面所发生的变化,过去,业务系统主要围绕OA、CRM以及数据库等传统应用展开,所产生的大多是结构化数据,整体数据规模也并不庞大,每年的数据增长量大约仅在几…

    2026年7月15日
    0
  • 什么是 localhost,127.0.0.1 是如何工作的?

    我们平时访问网址,本质是和互联网上某台服务器通信;而 127.0.0.1 是特殊地址 —— 发往它的请求不会离开本机,会直接原路返回,这种机制叫回环(loopback),对应的域名…

    2026年4月7日
    0