使用 Selenium WebDriver 处理分页

如何使用 Selenium WebDriver 处理分页

在本指南中,我将指导您使用 Selenium WebDriver 和 Python 解决分页问题。我们将介绍不同的方法,从使用简单的导航栏来刮擦网站,到处理更复杂的设置(如无限滚动和 "加载更多 "按钮)。无论您是刮擦产品列表还是任何其他类型的数据,了解如何处理分页将有助于您高效地刮擦整个网站。让我们深入了解一下!

利用 Bright Data 的 Web Scraper API 更轻松地分页

使用 Selenium 处理分页可能会很慢,而且容易造成阻塞。 Bright Data 的 Web Scraper API 可自动处理分页、代理和验证码。

✅ 自动分页 - 无需点击 "下一步 "或修改 URL
✅ 旁路块 - 内置代理旋转 & 解决验证码问题
✅ 更快、可扩展 - 提取结构化数据,无需加载完整页面

我是 not 隶属于本文提及的任何供应商!

使用导航栏处理分页

最常见的分页形式是导航栏,用户可以点击 "下一页 "或使用页码跳转到特定页面。您可以通过自动点击 "下一页 "按钮或修改 URL 的页码,使用 Selenium 从这些页面中抓取数据。

使用 "下一页 "按钮搜索数据

比方说,您要从 ScrapingCourse.com 这样的网站上抓取产品数据,该网站只有一个简单的导航栏。您可以自动点击 "下一步 "按钮,以搜索多个页面。

分步实施

打开网站并检查页面结构

首先,使用 Selenium 加载网页,并检查 HTML 结构,以确定包含要抓取的数据的元素。通常,产品包含在特定的 HTML 标记或类中。

从第一页提取数据

使用 Selenium 从第一页提取数据。例如,您可以提取产品名称和价格:

from selenium import webdriver
from selenium.webdriver.常见. import By
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(" - headless")
driver = webdriver.Chrome(options=chrome_options)
驱动程序get("https://www.scrapingcourse.com/ecommerce/")
product_containers = driver.查找元素(By.类别名称, "woocommerce-LoopProduct-link)
for product in 产品容器:
name = product.find_element(By.类别名称, "woocommerce-loop-产品__标题")
价格 = 产品。find_element(By.类别名称, "price")
print(名字。text)
print价格text)
司机quit()

实施分页逻辑

接下来,添加点击 "下一步 "按钮的逻辑,并从后续页面刮取数据。使用 while 循环继续搜索,直到没有更多页面可用:

from selenium.webdriver.常见. import By
from selenium.webdriver.chrome.options import Options
from selenium.常见.例外情况 import NoSuchElementException
chrome_options = Options()
chrome_options.add_argument(" - headless")
driver = webdriver.Chrome(options=chrome_options)
驱动程序get("https://www.scrapingcourse.com/ecommerce/")
定义 刮刀():
product_containers = driver.查找元素(By.类别名称, "woocommerce-LoopProduct-link)
for product in 产品容器:
name = product.find_element(By.类别名称, "woocommerce-loop-产品__标题")
价格 = 产品。find_element(By.类别名称, "price")
print(名字。text)
print价格text)
while True:
刮刀()
try:
next_page = 驱动程序。find_element(By.类别名称, "next.page-numbers"(下一页编号)
next_page.click()
除 NoSuchElementException:
print("无可用页面"。)
break
driver.quit()

这种方法会自动点击 "下一步 "按钮来搜索所有页面,直到搜索结束。

通过更改 URL 页码进行搜索

有些网站会将页码直接编码到 URL 中。与其点击 "下一步 "按钮,还不如更改 URL 中的页码,然后重新加载页面以抓取下一个数据集。

例如,如果 URL 为 https://www.scrapingcourse.com/ecommerce/page/1, 可以递增页码并加载新页面:

页数 = 1
max_page_count = 13
for page in range(1, max_page_count   1):
驱动程序。get(f"https://www.scrapingcourse.com/ecommerce/page/{page}")
刮刀()

这种方法简单明了,但需要了解网站 URL 的结构。

处理 JavaScript 分页

许多网站使用基于 JavaScript 的分页,动态加载更多内容。这种分页方式通常包括无限滚动或 "加载更多 "按钮等功能。

无限滚动分页

具有无限滚动功能的网站会在用户滚动到页面底部时自动加载更多内容。要从此类页面中抓取数据,需要在 Selenium 脚本中模拟滚动。

分步实施

设置 WebDriver

在无头模式下设置 WebDriver,以便在不打开浏览器窗口的情况下进行刮擦:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import 时间
chrome_options = Options()
chrome_options.add_argument(" - headless")
driver = webdriver.Chrome(options=chrome_options)
驱动程序get("https://scrapingclub.com/exercise/list_infinite_scroll/")

向下滚动并抓取数据

使用 JavaScript 向下滚动到页面底部。每次滚动后,等待新内容加载,然后刮取页面:

last_height = 驱动程序。执行脚本("返回 document.body.scrollHeight")
while True:
驱动程序。执行脚本("window.scrollTo(0,document.body.scrollHeight);")
时间sleep(2)
new_height = 驱动程序。执行脚本("返回 document.body.scrollHeight")
if 新高度 == 最后高度:
break
last_height = new_height
# 现在, 搜索内容
产品 = 驱动程序。查找元素(By.类别名称, "职位")
for product in products:
name = product.find_element(By.CSS_SELECTOR, "h4 a").text
价格 = 产品。find_element(By.CSS_SELECTOR, "h5").text
print(f"姓名:{name}")
print(f"价格:{价格}")

该方法模拟滚动并等待新产品加载。

加载更多按钮分页

有些网站使用 "加载更多 "按钮,点击后会显示更多内容。这是 JavaScript 分页的另一种形式。

分步实施

设置 WebDriver

使用 Selenium 打开网站,定义 scraper 函数以提取产品名称和 ID:

from selenium import webdriver
from selenium.webdriver.常见. import By
import 时间
driver = webdriver.Chrome()
驱动程序get("https://www.3m.com.au/3M/en_AU/p/c/medical/")
司机隐式等待(10)

点击 "加载更多 "按钮

使用循环点击 "加载更多 "按钮,并在每次点击后刮取内容:

def 刮刀():
product_containers = driver.查找元素(By.类别名称, "sps2-content")
for product in 产品容器:
name = product.find_element(By.类别名称, "sps2-content_name")
item_id = product.find_element(By.类别名称, "sps2-content_data - 编号")
print(f"姓名:{name.text}")
print(f"产品 ID:{item_id.text}")
scroll_count = 5
for _ in range(scroll_count):
驱动程序。执行脚本("window.scrollTo(0,document.body.scrollHeight);")
时间sleep(5)
load_more = driver.find_element(By.类别名称, "mds-button_tertiary - medium)
load_more.click()
刮刀()

这种方法可以模拟多次点击 "加载更多内容 "按钮,让你在页面加载更多内容时抓取数据。

避免扫描时被检测到

网络搜刮会触发反机器人措施,可能会屏蔽你的 IP 地址或阻止你搜刮内容。为了避免被屏蔽,以下是一些策略:

1.使用代理

轮流使用代理服务器可以掩盖 IP 地址,从而避免被发现。Bright Data 等服务提供代理轮换以及其他工具,如绕过验证码。

2.模仿真实用户行为

利用旋转用户代理、在操作之间添加随机延迟以及使用无头浏览器等技术,你可以让你的刮擦行为看起来更像真实用户的行为。

3.使用网络抓取 API

如果搜索被阻止,可以考虑使用网络搜索 API。它们能自动处理代理、验证码和其他反僵尸措施,使你能更轻松地搜刮内容,而不会受到阻止。查看我的 最佳搜索 API.

结论

分页是网络搜刮的关键部分,使用 Selenium,您可以轻松管理不同类型的分页,如导航条、页码、无限滚动和 "加载更多 "按钮。这些方法可以帮助你顺利地从有多个页面的网站上抓取数据。

采取反僵尸措施也很重要。为了避免被拦截,可以轮换用户代理、使用代理服务器,并在操作之间增加延迟,以模仿人类的浏览行为。有了这些技术,你就能顺利高效地搜刮数据了。祝您搜刮愉快

类似文章