SeleniumBase 与 Python 网页抓取

在本文中,我将带你了解 SeleniumBase 的核心功能,展示如何用它进行抓取,并分享一些应对当今网络挑战的实用技巧。无论你是刚接触抓取,还是希望进一步提升技能,SeleniumBase 都提供了一种简单直接的入门方式。

什么是 SeleniumBase?

SeleniumBase 是一个基于 Selenium 构建的开源 Python 框架,旨在简化网页自动化任务,包括测试和抓取。与通常需要大量样板代码的标准 Selenium 不同,SeleniumBase 通过内置的数据提取、交互自动化和反机器人规避工具,减少重复编码。

替代方案——自动化网页抓取工具

如果你需要大规模抓取,或抓取使用了高级反抓取技术的复杂网站,我建议可以尝试以下我所在机构正在使用的网页抓取工具:

  • Bright Data — 高级抓取的综合最佳选择;具备广泛的代理管理功能和可靠的 API。
  • Octoparse — 易于使用的无代码工具,可从网站自动提取数据。
  • ScrapingBee — 面向开发者的 API,可高效处理代理、浏览器和 CAPTCHA。
  • Scrapy — 开源 Python 框架,非常适合数据爬取和抓取任务。
  • ScraperAPI — 通过高级反机器人技术处理棘手的抓取任务;非常适合开发者。
  • Apify — 多功能平台,提供现成爬虫工具和强大的抓取能力。

如果想进一步了解每项服务,我推荐阅读我关于网页抓取工具的完整文章。

现在,我们从安装 SeleniumBase 开始。

设置 SeleniumBase

在开始网页抓取之前,你需要在系统上设置 SeleniumBase。步骤如下:

  1. 安装 Python:确保你已经安装了 Python。如果还没有,请从官方 Python 网站下载。
  2. 安装 SeleniumBase:使用以下命令通过 pip 安装 SeleniumBase:
pip3 install seleniumbase
  1. 安装 WebDriver:SeleniumBase 会管理 WebDriver 的安装,但如果你愿意,也可以手动下载并将其放入 PATH 中。
  2. 验证安装:为确保 SeleniumBase 已正确设置,运行以下命令查看可用选项:
seleniumbase - help

现在你已经安装了 SeleniumBase,我们来创建一个基础爬虫工具。

使用 SeleniumBase 构建基础爬虫工具

使用 SeleniumBase 创建一个简单的网页爬虫,需要设置一个 Python 脚本来与网页交互。在这个示例中,我们将从一个电商演示站点抓取产品详情。

以下是构建基础爬虫的分步指南:

在你的项目目录中创建一个名为 爬虫工具.py 的新文件。

编写以下代码以提取目标页面的完整 HTML 内容:

from seleniumbase import BaseCase

class 抓取工具(BaseCase):
    def test_get_html(self):
        self.open("https://www.scrapingcourse.com/ecommerce/")
        page_html = self.get_page_source()
        print(page_html)

运行爬虫工具,使用 pytest 命令:

pytest 爬虫.py -s

上述代码会打开电商页面并提取 HTML,然后将其打印到终端。这是更复杂抓取任务的基础。

提取特定数据

为了让爬虫工具更有用,你通常需要定位特定元素,例如产品名称、图片和 URL。SeleniumBase 支持 CSS 选择器、XPath 和 ID 来定位元素。下面展示如何提取不同类型的信息:

抓取产品名称

识别产品名称的 HTML 结构,在本示例中,它位于带有 product-name 类的 h2 标签内。下面的代码演示如何抓取产品名称:

from seleniumbase import BaseCase

class 抓取工具(BaseCase):
    def test_get_product_names(self):
        self.open("https://www.scrapingcourse.com/ecommerce/")
        product_names = self.find_elements("h2.product-name")
        names = [product.text for product in product_names]
        print(names)

抓取产品图片

要抓取图片 URL,请定位带有 product-image 类的 img 标签。以下代码会提取图片 URL:

from seleniumbase import BaseCase

class 爬虫工具(BaseCase):
    def test_get_image_urls(self):
        self.open("https://www.scrapingcourse.com/ecommerce/")
        image_elements = self.find_elements("img.product-image")
        image_urls = [image.get_attribute("src") for image in image_elements]
        print(image_urls)

抓取产品链接

类似地,从带有 woocommerce-LoopProduct-link 类的 a 标签中提取产品 URL:

from seleniumbase import BaseCase

class 抓取工具(BaseCase):
    def test_get_product_links(self):
        self.open("https://www.scrapingcourse.com/ecommerce/")
        link_elements = self.find_elements("a.woocommerce-LoopProduct-link")
        links = [link.get_attribute("href") for link in link_elements]
        print(links)

自动化浏览器交互

在某些情况下,抓取静态内容并不够,尤其是对于动态加载内容或需要用户交互的网站。SeleniumBase 支持一系列浏览器操作,包括点击、滚动和表单提交。

示例:自动化表单提交

假设某个站点需要登录凭据。下面是一个用于登录并抓取内容的脚本:

from seleniumbase import BaseCase

class 爬虫(BaseCase):
    def test_login_and_scrape(self):
        self.open("https://www.scrapingcourse.com/login")
        self.type("#email", "admin@example.com")
        self.type("#password", "password")
        self.click("button[type='submit']")
        self.save_screenshot("after_login.png")

该脚本会填写登录信息、提交表单,并在登录后截取屏幕截图。save_screenshot 函数有助于确认爬虫工具是否正确浏览站点。

规避反机器人措施

网站经常使用各种反机器人措施,例如 CAPTCHA、IP 封禁或 JavaScript 挑战。SeleniumBase 包含一些有助于绕过此类措施的功能,但也存在限制。

使用 UC 模式

SeleniumBase 的 UC(Undetected ChromeDriver)模式允许爬虫通过修改浏览器指纹来模拟真实用户行为。启用方法如下:

from seleniumbase import Driver

class 抓取工具(BaseCase):
    def test_bypass_bot_protection(self):
        driver = Driver(uc=True)
        driver.open("https://www.scrapingcourse.com/antibot-challenge")
        driver.uc_gui_click_captcha()
        page_html = driver.get_page_source()
        print(page_html)
        driver.quit()

该脚本使用 UC 模式绕过机器人检测并处理 CAPTCHA 挑战。请注意,虽然 UC 模式有助于规避检测,但它并非万无一失,尤其是在面对高度复杂的反机器人系统时。

代理配置

使用代理可以通过轮换 IP 地址来防止 IP 被封禁。SeleniumBase 允许你配置代理以增强匿名性:

pytest 爬虫工具.py - proxy=IP:PORT - proxy-type=http

此命令会设置一个代理服务器,SeleniumBase 会在抓取会话中的所有请求中使用它。

高级技巧和最佳实践

为了让你的网页爬虫更稳健且更不容易被封锁,请遵循以下最佳实践:

  • 使用随机延迟:在操作之间加入随机休眠间隔,以模拟人类浏览模式。
  • 轮换 User Agent:更改 user-agent 字符串,以模拟不同设备和浏览器。
  • 处理 JavaScript 渲染:使用 self.wait_for_element 确保所有动态内容在抓取前加载完成。
  • 尊重 Robots.txt 文件:始终检查网站的 robots.txt 文件,了解哪些部分允许抓取。

SeleniumBase 的局限性

尽管 SeleniumBase 功能强大,但它也有一些缺点:

  • 无头模式下的检测:有些网站可以检测到无头浏览器。
  • 规模限制:由于速度限制,它不适合跨大量页面抓取大规模数据。
  • 反机器人适应:作为开源工具,反机器人开发者可以更新算法来检测 SeleniumBase。

结论

使用 SeleniumBase 进行网页抓取是一种灵活而强大的数据收集、任务自动化以及与网站交互的方式。我觉得它特别有吸引力,因为它易于使用,并提供了强大的自动化功能,非常适合初学者和经验丰富的开发者。尽管存在一些挑战,例如反机器人检测和扩展方面的限制,但使用 UC 模式和代理设置等智能策略,可以大幅提高成功率。

如果你认真想做网页抓取,学习 SeleniumBase 是必不可少的。随着自动化工具持续发展,能够适应并使用这些框架,是在不断变化的网页抓取世界中保持领先的关键。

感谢阅读,如有任何问题请告诉我!

对其他网页抓取指南感兴趣?

  • 使用 Scrapy 进行网页抓取
  • 使用 Selenium 进行网页抓取
  • 用于网页抓取的 JavaScript 与 Python 对比
  • 使用 Python lxml 进行网页抓取
  • 使用 Excel 进行网页抓取
  • 使用 Python 进行网页抓取
  • 使用 C# 进行网页抓取

想阅读其他精彩文章,请访问我的个人主页 — Data Journal ❤️

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐