区块链API推荐,快速开发去中心化应用
2024年8大最佳Python网络爬虫库
Python 开发人员可以访问一些可用的最佳 Web 抓取库和框架。让我们一起来了解它们的作用以及何时使用它们。
Web 抓取是自动化提取网页数据的关键方法,Python 拥有多个库和框架帮助您完成这一过程。以下是围绕Python 中最受欢迎的 Web 抓取库和框架:它们的功能、优缺点、替代方案和代码示例。
帮助您确切地知道使用什么工具来处理过程中可能遇到的任何 Web 抓取项目。
1. Crawlee
Crawlee是一个功能全面的Web抓取和浏览器自动化工具,旨在助力用户迅速构建可靠的爬虫系统。该工具最初于2022年夏天为Node.js和TypeScript用户推出,而Crawlee for Python版本则在2024年7月面世,并迅速在GitHub上收获了超过3,500颗星的关注。
✨ 特征
- 适用于 HTTP 和无头浏览器的统一界面。
- 类型提示覆盖率和代码可维护性。
- 自动并行爬行。
- 用于 URL 爬网的持久队列。
- 集成代理轮换和会话管理。
- 可配置的请求路由。
- 自动错误处理。
- 表格数据和文件的可插拔存储。
👍 优点
- 与此列表中的其他成熟的网络爬虫和抓取库 (Scrapy) 不同,Crawlee的设计极大地降低了上手难度,用户能够迅速进行设置并展开学习。它提供了现成的模板,用户只需在一个文件中添加代码,即可实现网络抓取功能,简化了项目管理。
- 融合了多种网络抓取的核心功能和技术,提升了实用性。
- 有助于编写干净、可维护的代码。
👎 缺点
- 尽管Crawlee-Python属于新兴内容,教程资源有限,但本文提供了一份详尽的入门指南。
🤔 选择
Scrapy, Playwright, Beautiful Soup
🔰 安装 Crawlee
要开始使用 Crawlee for Python,请运行以下命令:
pipx run crawlee create my-crawler
📜 代码示例
import asyncio
from crawlee.playwright_crawler import PlaywrightCrawler, PlaywrightCrawlingContext
async def main() -> None:
# Create a crawler instance
crawler = PlaywrightCrawler(
# headless=False,
# browser_type='firefox',
)
@crawler.router.default_handler
async def request_handler(context: PlaywrightCrawlingContext) -> None:
data = {
"request_url": context.request.url,
"page_url": context.page.url,
"page_title": await context.page.title(),
"page_content": (await context.page.content())[:10000],
}
await context.push_data(data)
await crawler.run(["https://crawlee.dev"])
if __name__ == "__main__":
asyncio.run(main())
使用Crawlee的PlaywrightCrawler抓取网站标题及内容示例
2.Requests
每个网络抓取任务的首要步骤都是向目标网站发送请求并获取其内容,这些内容通常为HTML格式。Python中的Requests库正是为此而生,它凭借“HTTP for humans”的核心理念,极大地简化了这一过程,因此成为了下载次数最多的Python包。
✨ 特征
- 用于发出 HTTP 请求的简单直观的 API。
- 处理 GET、POST、PUT、DELETE、HEAD 和 OPTIONS 请求。
- 根据响应标头自动解码内容。
- 允许跨请求建立持久连接。
- 内置对 SSL/TLS 验证的支持,并可选择绕过它。
- 轻松将标头、参数和 Cookie 添加到请求中。
- 为请求设置超时和重试策略。
- 通过以块的形式流式传输响应来支持大型文件下载。
- 支持代理配置。
👍 优点
- 使用简洁易读的语法简化复杂的 HTTP 任务。
- 庞大的用户群和社区支持。
- 有据可查,包含大量示例和指南。
👎 缺点
- 相较于某些低级别库(如
http.client
、urllib3
),更适用于那些性能敏感的应用程序。 - 缺乏内置的异步功能,需要额外集成如
asyncio
、aiohttp
等库来实现非阻塞请求,增加了开发复杂度。 - 在最小环境或资源受限的应用场景下,某些库可能显得较为笨重,增加了不必要的内存与计算开销。
🤔 选择
httpx, urlib3, http.client, aiohttp
🔰 安装请求
要安装 Requests 库,请使用 Python 包管理器 pip:
pip install requests
📜 代码示例
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json() # Parse JSON response
print(data)
else:
print(f"Request failed with status code: {response.status_code}")
3. HTTPX
HTTPX 作为新一代 HTTP 库,相较于 Requests,提供了异步和 HTTP/2 等高级功能。如异步和 HTTP/2 支持。HTTPX 在核心功能与 Requests 保持高度一致,易于上手。鉴于其高性能与良好的扩展性,HTTPX 不仅适用于大型项目,也推荐用于小型项目,为未来可能的需求扩展预留空间。
✨ 特征
- 利用
asyncio
内置功能,实现非阻塞 HTTP 请求,提升效率。 - 原生兼容 HTTP/2 协议,相较于 HTTP/1.1,显著提升性能。
- 提供同步和异步接口,以根据您的需求提供灵活性。
- 通过自动连接池高效管理连接。
- 自动跟随重定向,同时提供比 Requests 更细致的控制选项。
- 支持自定义 HTTP 传输层,包括连接池与代理设置。
- 支持流式响应、Cookie 管理和分段上传。
👍 优点
- 允许非阻塞请求,这使其成为 I/O 密集型任务或需要高并发性的应用程序的理想选择。
- 构建时考虑了现代 Web 标准和实践,包括 HTTP/2 支持。
👎 缺点
- 对于不熟悉异步编程的开发人员,与 Requests 相比,学习难度可能更高。
- 尽管迅速普及,但由于 Requests 更新,可能面临社区规模较小、可用资源较少的现状。
🤔 选择
Requests, aiohttp, urlib3, http.client
🔰 安装 HTTPX
要安装 HTTPX 库,请使用 Python 包管理器 pip:
pip install httpx
📜 代码示例
import httpx
import asyncio
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json() # Parse JSON response
print(data)
else:
print(f"Request failed with status code: {response.status_code}")
# Run the asynchronous function
asyncio.run(fetch_data())
4. Beautiful Soup
一旦你拥有 HTML 内容,你需要一种方法去解析它并提取你感兴趣的数据。为此,Beautiful Soup这一流行的Python HTML解析器应运而生。它允许你在HTML树结构中轻松导航和搜索,从而获取你感兴趣的数据。其简单的语法和简单的设置也使 Beautiful Soup 成为中小型 Web 抓取项目和 Web 抓取初学者的绝佳选择。
✨ 特征
- 灵活遍历HTML/XML结构。
- 解析树的导航
- 处理不同的编码并自动将文档转换为 Unicode,确保兼容性。
- 可与 lxml、html.parser 和 html5lib 等多个解析器配合使用,从而灵活地处理不同的解析需求。
- 轻松访问和修改文档中的标签、属性和文本。
👍 优点
- 设计简单易用,学习曲线平缓,初学者友好。
- 适用于各种解析库,并适应不同的抓取任务。
- 提供全面的文档和大量教程,使其易于上手。
- 有效地从 HTML 中解析和提取数据。
- 在网络抓取社区中很受欢迎,确保有充足的资源和社区驱动的解决方案。
👎 缺点
- 有限的可扩展性
- 无法抓取 JavaScript 密集型网站
🤔 选择
lxml、html5lib
🔰 安装 Beautiful Soup
为了安装Beautiful Soup,请使用pip来安装相应的软件包。此外,为了获得更佳的解析功能,我们还建议安装lxml或html5lib。这些库与beautifulsoup4配合使用,能够显著提升HTML内容的解析效果。
pip install beautifulsoup4 lxml
📜 代码示例
from bs4 import BeautifulSoup
import httpx
# Send an HTTP GET request to the specified URL using the httpx library
response = httpx.get("https://news.ycombinator.com/news")
# Save the content of the response
yc_web_page = response.content
# Use the BeautifulSoup library to parse the HTML content of the webpage
soup = BeautifulSoup(yc_web_page)
# Find all elements with the class "athing" (which represent articles on Hacker News) using the parsed HTML
articles = soup.find_all(class_="athing")
# Loop through each article and extract relevant data, such as the URL, title, and rank
for article in articles:
data = {
"URL": article.find(class_="titleline").find("a").get('href'), # Find the URL of the article by finding the first "a" tag within the element with class "titleline"
"title": article.find(class_="titleline").getText(), # Find the title of the article by getting the text content of the element with class "titleline"
"rank": article.find(class_="rank").getText().replace(".", "") # Find the rank of the article by getting the text content of the element with class "rank" and removing the period character
}
# Print the extracted data for the current article
print(data)
5. Mechanical Soup
Mechanical Soup 是一个 Python 库,它提供了Requests和BeautifulSoup库的更高级别抽象。它通过将 Requests 的易用性与 Beautiful Soup 的 HTML 解析功能相结合,简化了 Web 抓取过程。
✨ 特征
- 简化向网站发出 HTTP 请求的过程,并使其易于获取网页并与之交互
- 与 Beautiful Soup 强大的 HTML 解析功能集成,允许从网站轻松提取数据
- 具有在网页上提交 HTML 表单的便捷方法,从而简化了与需要提交表单的网站的自动交互
- 支持会话管理,并帮助跨多个请求保持与网站的有状态交互
- 与 Requests 一样,Mechanical Soup 支持代理配置,并允许匿名抓取数据或绕过 IP 限制
👍 优点
- 为 Web 抓取任务提供简化的界面
- 与 Beautiful Soup 无缝集成以进行 HTML 解析
- 支持表单提交和会话处理
- 为匿名和绕过限制提供代理支持
👎 缺点
- 与 Crawlee、Scrapy 或 Playwright 相比,高级功能有限。
- 可能不适合复杂或大规模的抓取项目。
🤔 选择
Selenium, Playwright, Beautiful Soup
🔰 安装 Mechanical Soup
要安装 MechanicalSoup,请在终端或命令提示符中运行以下命令:
pip install MechanicalSoup
📜 代码示例
import mechanicalsoup
# Create a MechanicalSoup browser instance
browser = mechanicalsoup.StatefulBrowser()
# Perform a GET request to a webpage
browser.open("https://example.com")
# Extract data using BeautifulSoup methods
page_title = browser.get_current_page().title.text
print("Page Title:", page_title)
6. Selenium
Selenium 是一种广泛使用的 Web 自动化工具,它允许开发人员以编程方式与 Web 浏览器交互。通常用于测试 Web 应用程序,但它也可以作为 Web 抓取的强大工具,尤其是在处理需要动态内容加载的 JavaScript 渲染的网站时。
✨ 特征
- 提供以编程方式控制 Web 浏览器的功能,模拟用户交互,如单击、键入和在页面之间导航。
- 支持多种浏览器(Chrome、Firefox、Safari、Edge 等)和平台,允许跨浏览器测试和抓取。
- 处理 JavaScript 生成的动态内容,使其成为抓取现代 Web 应用程序的理想选择。
- 为捕获屏幕截图、管理 Cookie 和执行自定义 JavaScript 代码提供全面支持。
- 支持无头模式,允许在没有 GUI 的情况下进行自动浏览,从而使抓取更快、资源消耗更少。
👍 优点
- 非常适合在动态的、JavaScript 密集型的网站上抓取和自动化交互。
- 支持多种编程语言(Python、Java、C# 等)。
- 能够模拟复杂的用户交互并处理复杂的 Web 应用程序。
- 具备跨浏览器和跨平台的兼容性,适用范围广泛。
👎 缺点
- 由于完全的浏览器自动化,与 Scrapy、Crawlee 或 Playwright 等无头抓取库相比,速度较慢。
- 需要针对不同的浏览器进行额外设置(例如,安装 WebDriver)。
- 在处理大规模抓取任务时,资源密集度更高,可能导致更高的运行成本。
🤔 选择
Playwright, Mechanical Soup, Crawlee, Scrapy
🔰 安装 Selenium
要安装 Selenium,请在终端或命令提示符中运行以下命令:
pip install selenium
📜 代码示例
from selenium import webdriver
# Setup the WebDriver (using Chrome in this example)
driver = webdriver.Chrome()
# Navigate to a web page
driver.get("https://example.com")
# Interact with the page (e.g., click a button)
button = driver.find_element_by_id("submit")
button.click()
# Extract data
content = driver.page_source
# Close the browser
driver.quit()
7. Playwright
Playwright 是由 Microsoft 开发的现代 Web 自动化框架。它凭借单个API支持多个浏览器(包括Chromium、Firefox和WebKit),提供了与网页交互的强大功能。Playwright因其出色的速度、可靠性和处理复杂Web应用程序的能力,在测试和自动化领域备受青睐。与Selenium相似,在处理需要动态内容加载的网站时,Playwright也是一个强大的网络抓取工具。
✨ 特征
- 支持无头和有头模式下的多个浏览器引擎(Chromium、Firefox、WebKit)。
- 提供用于处理现代 Web 功能(如文件上传/下载、网络拦截和浏览器上下文)的内置功能。
- 擅长自动测试和抓取严重依赖JavaScript渲染的网站。
- 提供强大的工具,用于处理自动等待元素、截取屏幕截图和捕获会话视频等场景。
- 支持并行执行,从而提高大规模抓取或测试任务的性能。
👍 优点
- 与 Selenium 相比,在处理 JavaScript 密集型网站方面具有卓越的性能。
- 通过一个API接口,实现对所有主流浏览器引擎的全面支持。
- 为浏览器自动化提供更高级的功能,包括网络拦截和并行性。
- 相比其他工具,更加稳定可靠,是测试和自动化的理想选择。
👎 缺点
- 由于其广泛的功能,学习有些难度。
- 与 Selenium 相比,社区支持较少。
🤔 选择
Selenium, Crawlee, Scrapy
🔰 安装 Playwright
要安装 Playwright,请在终端或命令提示符中运行以下命令:
pip install playwright
然后,您需要安装必要的浏览器二进制文件:
playwright install
📜 代码示例
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
# Interact with the page
page.click('button#submit')
# Extract data
content = page.content()
browser.close()
8. Scrapy
Scrapy是一个功能强大且高度灵活的Python框架,专门用于网络抓取。与常用于Web自动化的Selenium和Playwright不同,Scrapy的设计目标是以结构化和可扩展的方式从网站抓取大量数据。
✨ 特征
- 提供内置的爬虫框架,允许您轻松定义和自定义 Web 爬虫以提取所需的数据
- 旨在快速高效,使您能够以最少的资源使用快速从大型网站中提取数据。
- 支持将数据以多种格式导出,如HTML、XML和JSON。
- 能够通过中间件、管道和扩展添加自定义功能
- 支持分布式抓取,允许您在多台计算机上扩展 Web 抓取操作
- 高效处理 Web 抓取过程中可能发生的常见错误和异常
- 支持处理身份验证和 cookie 以抓取需要登录凭据的网站
- Scrapy易于与其他Python工具集成,如数据处理和存储库,成为构建端到端数据处理管道的强大工具。
👍 优点
- 由于其异步请求处理,因此对于大规模抓取非常有效。
- 具有广泛自定义选项的综合框架。
- 轻松处理复杂的抓取场景,如链接跟踪、分页和数据清理。
- 内置支持以各种格式(如 JSON、CSV 和 XML)导出数据。
👎 缺点
- 对于初学者学习稍有难度。
- 与 Crawlee、Selenium 或 Playwright 相比,不太适合抓取动态 JavaScript 内容。
- 与 Beautiful Soup 和 Crawlee 等更简单的库相比,在较小的项目中需要更多的设置和配置。
🤔 选择
Crawlee, Beautiful Soup, Selenium, Playwright
🔰 安装 Scrapy
要安装 Scrapy,请在您的终端或命令提示符中运行以下命令:
pip install scrapy
📜 代码示例
import scrapy
class HackernewsSpiderSpider(scrapy.Spider):
name = 'hackernews_spider'
allowed_domains = ['news.ycombinator.com']
start_urls = ['http://news.ycombinator.com/']
def parse(self, response):
articles = response.css('tr.athing')
for article in articles:
yield {
"URL": article.css(".titleline a::attr(href)").get(),
"title": article.css(".titleline a::text").get(),
"rank": article.css(".rank::text").get().replace(".", "")
}
哪个 Python 抓取库适合您?
那么,在选择网络抓取项目的库时,您应该考虑哪些选项呢?以下表格总结了本文介绍的所有库的功能特性、主要用途、显著优点及潜在缺点:
图书馆 | 用例 | 易用性 | 特征 | 优点 | 缺点 | 选择 |
---|---|---|---|---|---|---|
Crawlee | 大规模抓取和浏览器自动化 | 简单 | 自动并行爬取、代理轮换、持久队列 | 易于设置、干净的代码、集成功能 | 新的有限教程 | Scrapy, Playwright, Beautiful Soup |
Requests | 发出 HTTP 请求 | 非常简单 | 简单的 API、SSL/TLS 支持、流媒体 | 大型社区,有据可查 | 没有异步,对于性能敏感型任务来说速度较慢 | httpx, urllib3, aiohttp |
HTTPX | 支持异步的 HTTP 请求 | 简单 | 异步支持、HTTP/2、可自定义传输 | 非阻塞请求,现代标准 | 学习强度更大,社区规模更小 | Requests, aiohttp, urllib3 |
Beautiful Soup | HTML/XML 解析 | 非常简单 | 树遍历、编码处理、多解析器支持 | 语法简单,非常适合初学者 | 可扩展性有限,不支持 JavaScript | lxml, html5lib |
Mechanical Soup | 表单处理、简单的网页抓取 | 简单 | 请求 + Beautiful Soup 集成,表单提交 | 简化的界面、会话处理 | 有限的高级功能 | Selenium, Playwright |
Selenium | 浏览器自动化、JavaScript 密集型网站 | 中等 | 跨浏览器的动态内容处理 | 模拟复杂的交互,多语言支持 | 速度较慢,资源密集 | Playwright, Crawlee, Scrapy |
Playwright | 高级浏览器自动化 | 中等 | 多浏览器支持、自动等待、并行执行 | 处理 JS 密集型网站、高级功能 | 学习强度更大,社区更小 | Selenium, Crawlee, Scrapy |
Scrapy | 大规模 Web 抓取 | 难 | 异步、分布式抓取、可扩展性 | 高效,处理复杂场景 | 学习强度更大,设置繁重 | Crawlee, Playwright, Selenium |
此处介绍的每种工具在专家抓取工具的工具包中都有其独特的用途。根据任务需求掌握它们的使用,将赋予您灵活选择最佳工具的能力,因此,在做出决定前,不妨大胆尝试每一种工具!
原文链接:https://blog.apify.com/what-are-the-best-python-web-scraping-libraries/