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年5月21日
    0
  • MongoDB是什么?优缺点、特点及应用场景一网打尽!

    在数字化时代,数据库扮演着至关重要的角色,无论是个人用户还是企业,都需要具备数据存储、缓存、搜索索引、异步处理以及批量处理等功能。目前存在多种不同的数据库和数据管理系统,其中Mon…

    2026年4月2日
    0
  • SQL DDL 是什么? 五个指令一次学会:CREATE、ALTER、TRUNCATE、DROP、RENAME

    SQL 有四大分类: DDL(数据定义语言)负责处理表格的「结构」。 DML(数据操作语言)负责处理表格的「资料」。 DCL(数据控制语言)负责处理「权限」。 TCL(事务控制语言…

    2026年5月13日
    0
  • 数据库读写分离是什么?小白一看就懂

    网站运营步入正轨,用户规模从最初寥寥数十人,如今已然突破万人。可随之而来的问题也逐渐凸显,网页加载速度越来越慢,不少用户纷纷吐槽卡顿,网站运行压力肉眼可见攀升。 其实这是网站流量上…

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

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

    2026年4月23日
    0
  • 服务器集群究竟是什么?

    如今“集群”这个概念正被越来越多人熟知,这项技术也早已渗透到各类实际业务场景中落地应用。不少人会好奇,服务器集群究竟是什么?它又具备哪些优势与短板? 一、什么服务器集群 服务器作为…

    2026年6月29日
    0
  • Cloudflare 错误 520:原因及解决方法

    网站打不开,访客只能看到空白页面,上面写着“错误 520”,而 Cloudflare 只是提示“源服务器返回未知错误”,这种是什么情况呢?我们应该如何解决? 什么是 Cloudfl…

    2026年3月27日
    0
  • http和https的区别及优缺点

    你有没有注意到,有些网站的网址开头是http://,有些则是https://? 虽然看起来只差了一个「s」,但它们的安全性和运作方式却完全不同。 什么是 HTTP? http 的定…

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

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

    2026年4月14日
    0
  • 网站出现http403禁止访问是什么原因?

    在网站运营的过程中,常见的一种错误就是http403禁止访问错误了,直接表现就是网站打不开。而且网站出现http403禁止访问错误的原因较多,今天我们就来看一下。 http403禁…

    2026年5月26日
    0