爬虫开发一直以来都需要编写大量的代码,尤其是在抓取动态网站时,往往需要处理 JavaScript 渲染和分页等复杂的问题。然而,Crawlee(之前叫 Apify SDK)作为一个现代化的爬虫框架,提供了更加高效和简便的方式,甚至可以通过无代码配置来快速抓取动态网站数据。
在本篇文章中,我们将深入探讨如何使用 Crawlee 实现动态网站的爬虫,并展示如何通过简单的配置来完成爬虫任务,节省开发时间和精力。
Crawlee 是基于 Node.js 的爬虫框架,旨在提供高效、简便的爬虫开发体验。与传统爬虫框架不同,Crawlee 通过提供强大的 API 和自动化工具,能够减少开发者在爬虫开发过程中的重复劳动,支持网页抓取、数据抽取、API 交互等任务。
Crawlee 的特点包括:
首先,我们需要在 Node.js 环境下安装 Crawlee。
在你的项目中初始化一个 Node.js
项目并安装 Crawlee
:
npm init -y
npm install @crawlee/core
确保你已经安装了 Node.js 和 npm,如果尚未安装,可以从 Node.js 官网 下载并安装。
Crawlee 提供了强大的无代码配置选项,可以直接配置爬虫,而不需要手动编写 JavaScript 代码。你只需要通过 JSON 配置文件来定义你的爬虫任务,Crawlee 会自动为你管理爬虫的生命周期、调度、错误处理和数据存储等。
在使用无代码配置时,我们主要依赖于 Apify Configuration 文件。该配置文件主要包括以下几个部分:
假设我们需要抓取一个动态加载的商品列表页面,该页面通过 JavaScript 渲染数据。我们可以通过以下配置来抓取这些数据。
首先创建一个 apify_config.json
配置文件:
{
"startUrls": [
"https://www.example.com/products"
],
"scrapingRules": [
{
"pageType": "list",
"selector": ".product-item", // 每个商品项的 DOM 选择器
"fields": {
"productName": ".product-name", // 商品名称
"productPrice": ".product-price", // 商品价格
"productUrl": ".product-link::attr(href)" // 商品链接
},
"pagination": {
"nextPageSelector": ".pagination-next a", // 翻页按钮的选择器
"pageIncrement": 1
}
}
],
"storage": {
"type": "json",
"output": "products_data.json"
}
}
startUrls:指定爬虫的初始 URL,可以是任意支持 JavaScript 渲染的网站。
scrapingRules:
pageType
:定义页面类型,此处是一个商品列表页。selector
:每个商品项的 DOM 选择器,这里我们使用 .product-item
来选择每一个商品项。storage:定义数据存储方式,此处我们选择将数据保存为 JSON 文件,存储到本地。
通过配置文件完成爬虫设置后,Crawlee 会自动管理爬虫的执行,包括请求发起、页面渲染、数据抽取、翻页等操作。你只需要运行以下命令来启动爬虫:
node crawl.js
此时,Crawlee 会根据配置文件开始抓取数据,并将结果保存在 products_data.json
文件中。
有时,爬虫的目标页面是通过 JavaScript 异步加载内容的。这时候我们需要确保爬虫能够等待页面渲染完成后再提取数据。
Crawlee 内置了对动态内容的支持,您可以配置 waitForSelector 来等待某个元素加载完成后再进行数据抽取。
在配置文件中,您可以增加如下内容:
"waitForSelector": ".product-item"
这将确保爬虫在找到 .product-item
元素后才开始抓取数据。
Crawlee 支持通过无头浏览器(如 Puppeteer 或 Playwright)来渲染动态内容。您只需要在配置文件中启用 render 选项:
{
"render": {
"enabled": true,
"waitForSelector": ".product-item",
"viewport": {
"width": 1280,
"height": 800
}
}
}
此配置会使用无头浏览器渲染页面,等待 .product-item
元素加载完成,并设置浏览器窗口的尺寸。
Crawlee 支持多种数据存储方式,包括:
如果您希望将抓取的数据存储到 MongoDB 中,只需要在配置文件中添加相应的配置项:
{
"storage": {
"type": "mongodb",
"connectionString": "mongodb://localhost:27017",
"database": "scraper_data",
"collection": "products"
}
}
通过 Crawlee,您可以将任务调度到 Apify平台 上运行,以实现分布式抓取。这样可以利用 Apify 提供的云计算资源来加速抓取任务。
在配置文件中启用调度功能:
{
"scheduler": {
"enabled": true,
"scheduleTime": "2023-08-01T00:00:00Z"
}
}
通过 Crawlee 的无代码配置,我们可以轻松地实现对动态网站的爬取任务。通过配置简单的 JSON 文件,就能定义爬虫的行为、数据抽取规则、翻页逻辑等。此外,Crawlee 提供了对无头浏览器渲染、动态内容加载、分布式存储和调度等功能的支持,使得爬虫开发变得更加简单高效。
Crawlee 是一个强大而灵活的工具,适合于数据抓取、网页解析以及大规模数据采集任务。在未来的爬虫开发中,您可以将其作为重要的工具之一,极大地提升开发效率。