Scrapy 与 Beautiful Soup

Scrapy 与 Beautiful Soup 比较。了解这两种流行的网页抓取工具。
2 min read
Scrapy 与 Beautiful Soup

在网络爬虫方面,Python 提供了各种各样的工具可供选择。Selenium、MechanicalSoup、Scrapy、Requests、Beautiful Soup 和 lxml 通常用于这种情况。然而,这些工具并不完全相同,因为它们各自都有适合的用例。有些工具甚至是互补的,本文将对此进行说明。

在本文中,您将仔细看看 Scrapy 和 Beautiful Soup,这两种常用于网络爬虫的工具。

Beautiful Soup 是一个解析库。它允许使用 XPathCSS 选择器 来导航文档。这使得将标记语言(如 HTML 和 XML)中的数据转化为结构化数据成为可能。相比之下,Scrapy 是一个完整的网络爬虫框架,它可以加载文档并(可选地)存储它。

了解更多关于 使用 Beautiful Soup 进行网络爬虫 的信息。

在这个比较中,您将考虑以下几个方面:爬虫的可用性、爬取的可用性、速度、多步执行、代理轮换CAPTCHA 解决

Scrapy 与 Beautiful Soup:快速比较

如果您赶时间,这里有一个关于 Scrapy 和 Beautiful Soup 的快速比较。

Scrapy 是一个综合性的网络爬虫框架,适合大规模数据提取项目,并提供内置的爬取支持,而 Beautiful Soup 是一个解析库,最适合较小、较简单的爬虫任务,没有内置的爬取功能。

Scrapy 在大型爬虫操作中的速度和效率方面表现出色,而 Beautiful Soup 在简单性和易用性方面表现优异,适合快速任务。复杂项目请选择 Scrapy,简单、直接的解析需求请选择 Beautiful Soup。

Scrapy

Scrapy 是一个集爬虫、文档下载、处理和存储为一体的套件。可以通过 pipconda 轻松安装 Scrapy:

pip install scrapy
conda install -c conda-forge scrapy

使用 Scrapy 进行网络爬虫

Scrapy 帮助您爬取页面和网站集,以收集 URL 进行爬取或发现页面是否包含您需要的特定信息。Scrapy 使用蜘蛛(spiders),这些是 Python 类,您可以在其中定义如何导航网站、在网站结构中应深入多远、应提取哪些数据以及如何存储这些数据。为了汇总 URL 列表,Scrapy 可以导航 HTML、XML 和 CSV 文档,甚至可以加载站点地图。

此外,Scrapy 提供了 Scrapy shell,一个交互式 shell,用于在特定页面上测试和调试 XPath 和 CSS 表达式。使用 shell 可以节省爬取和抓取时间,因为它消除了每次更改都需要重新启动蜘蛛的需要。

使用 Scrapy 进行网络爬取

在抓取方面,您通常需要很大的灵活性。Scrapy 提供了两种选择文档中项目的方法:通过 XPath 和 CSS 表达式。前者主要用于 XML 文档,而后者专门用于 HTML 文档。

Scrapy 的一个独特功能是定义管道的能力。当一个项目被抓取时,可以将其发送到管道中,在管道中对其执行一系列操作:清理、验证、哈希、去重和增强。

速度

抓取网络文档的另一个重要方面是所需的时间。评估 Scrapy 的速度并不容易,因为它有很多需要处理的开销。为此,开销只加载一次,而爬取和提取则发生十次。

在以下示例中,提取了一个简单(即非动态)网页的 h2。所有代码都在 Jupyter Notebook 中运行。

首先,加载所需的 Scrapy 库:

import scrapy
from scrapy.crawler import CrawlerProcess

其次,建立描述抓取任务的 MySpider 类:

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = [
        'https://edition.cnn.com' # Or repeat this 10 times to calculate marginal time
    ]
    def parse(self, response):
        yield {'output': response.css('h2.container_lead-package__title_url-text::text').extract()}
process = CrawlerProcess(
    settings={
        "FEEDS": {
            "scrapy_output.json": {"format": "json", "overwrite": True}
        }
    }
)
process.crawl(MySpider)

第三,运行脚本并计时:

%%timeit -n 1 -r 1
process.start()

抓取、解析和存储单个网页文档的整个过程大约需要 400 毫秒。然而,重复同样的过程十次大约需要 1,200 毫秒。这意味着单个过程大约需要 80 毫秒,这很令人印象深刻。鉴于此开销,对于密集型任务,Scrapy 应该是您的首选。

使用 Scrapy 进行多步抓取

许多网站,尤其是最流行的网站,如 X/Twitter、Substack 和 LinkedIn,都是动态的。这意味着大量信息隐藏在登录界面、搜索查询、弹出窗口、滚动或鼠标悬停之后。因此,让您的蜘蛛简单地访问页面通常不足以从中提取数据。

Scrapy 提供了各种方法来处理这些任务作为独立工具。可以生成必要的 HTTP 请求或执行相关的 JavaScript 代码片段。然而,使用无头浏览器提供了最大的灵活性。例如,Scrapy 的 Playwright 和 Selenium 集成可以用于与动态元素进行接口。

使用 Scrapy 进行代理轮换和 CAPTCHA 预防

大语言模型的出现激励了许多公司对模型进行微调,但这需要特定(通常是抓取的)数据。此外,许多组织不希望机器人占用他们网站的服务器资源,也没有分享他们数据的商业利益。这就是为什么许多网站不仅设置为动态的,还引入了反爬虫技术,如自动 IP 封锁和 CAPTCHA。

为了防止被锁定,Scrapy 并不提供开箱即用的代理轮换(和 IP 地址)工具。然而,可以通过 Scrapy 的中间件框架(一组用于修改 Scrapy 请求和响应过程的钩子)扩展 Scrapy。要轮换代理,可以附加一个专门为此设计的 Python 模块,例如 scrapy-rotating-proxies。通过相同的机制,可以附加 DeCAPTCHA 模块。

Beautiful Soup

与 Scrapy 不同,Beautiful Soup 并不提供一个用于从网页文档中提取和处理数据的全套解决方案;它仅提供爬取部分。您只需提供一个下载的文档,Beautiful Soup 就可以通过 CSS 和 XPath 选择器将其转换为结构化数据。

可以通过 pip 和 conda 安装 Beautiful Soup:

pip install BeautifulSoup4
conda install -c anaconda beautifulsoup4

使用 Beautiful Soup 进行网络爬虫

虽然 Scrapy 部署蜘蛛来导航网站,但 Beautiful Soup 并不提供这种功能。然而,通过一些 Python 创意,结合 Beautiful Soup 和 Requests 库,可以编写脚本来导航网站达到一定深度。不过,这肯定没有 Scrapy 那么容易。

使用 Beautiful Soup 进行网络爬取

网络爬取是 Beautiful Soup 4 的关键。不仅提供了 CSS 和 XPath 选择器,还附带了多种方法来遍历文档。当文档结构复杂时,方法如 .parent.next_sibling 可以提取难以到达的元素。此外,通过 find_all() 和类似方法,您可以指定文本过滤器、正则表达式,甚至自定义函数来查找所需元素。

最后,Beautiful Soup 具有多种输出格式化程序,可以美化输出、编码、移除微软的智能引号,甚至解析和验证 HTML。

速度

与 Scrapy 不同,Requests 和 Beautiful Soup 没有开销,可以简单地运行十次来评估其速度。

首先,加载所需库:

import requests, json
from bs4 import BeautifulSoup

其次,通过将代码包装在 timeit 魔术命令 中来计时:

%%timeit -n 10 -r 1
page = requests.get('https://edition.cnn.com')
page_html = BeautifulSoup(page.text, 'html.parser')
page_html = page_html.select_one('h2.container_lead-package__title_url-text').text
json_object = json.dumps({'output': page_html})
with open("bs4_output.json", "w") as output_file:
    output_file.write(json_object)

运行一次大约需要 300 毫秒。运行十次大约需要 3,000 毫秒,这明显比 Scrapy 慢。然而,它需要的配置少得多,并且对特定框架的了解相对较少。

使用 Beautiful Soup 进行多步抓取

由于 Beautiful Soup 没有爬虫功能,它肯定不能处理动态网页。然而,像 Scrapy 一样,它与自动化工具(如 Playwright、Puppeteer 和 Selenium)配合使用效果极佳。将自动化工具与 Beautiful Soup 配合使用总是以相同的方式进行:无头浏览器处理动态元素,而 Beautiful Soup 提取那些浏览器中呈现的数据。

使用 Beautiful Soup 进行代理轮换和 CAPTCHA 预防

由于 Beautiful Soup 是一个爬取工具而不是爬虫工具,它不提供任何防止被网站服务器封锁的工具。如果您需要这些功能,它们应该是您选择的爬虫工具的一部分。

结论

本文概述了 Beautiful Soup 和 Scrapy 在网络爬虫和网络爬取中的可用性、速度、处理动态网页文档和规避反爬虫措施方面的不同。

作为一个端到端的工具,Scrapy 在日常爬取任务中无疑是一个明显的选择。然而,它确实需要一些中间件来爬取动态网站并确保不会被封锁。

虽然 Beautiful Soup(结合 request 包)相对较慢,但它为临时爬取任务提供了一种非常熟悉且简单的方法。与 Scrapy 一样,它需要额外的工具来爬取动态网站和防止封锁。

如果您在寻找一个一站式的网站爬取解决方案,请考虑 Bright Data。Bright Data 提供了许多产品,如 代理服务Web Unlocker,以帮助您满足所有的网络爬取需求,无论您决定使用哪种选项。

有兴趣了解如何集成 Bright Data 代理?请阅读我们的 Scrapy 代理 集成指南和 BeautifulSoup 代理 指南。