deviantART的 成为数字艺术家和艺术爱好者最大的社交平台。它拥有超过 60 万会员,每天分享数以万计的艺术作品,是探索和下载各种创作的最佳场所,从数字绘画到壁纸、像素艺术、动漫和电影快照。

然而,从网站手动收集数千个数据点可能非常耗时。我们不是手动复制信息,而是使用 Python 等编程语言自动化该过程。

DeviantArt 数字艺术多样性

抓取 DeviantArt 让我们有机会了解不同的艺术风格,了解流行趋势,并建立我们最喜欢的图片集。这不仅仅是享受艺术;我们还可以了解更多相关信息。

在本指南中,我们将使用 Python,一种友好的编程语言。为了帮助我们进行抓取,我们有 爬虫库 Crawling API – 一个方便的工具,使从网络获取数据变得更加简单。 Python 和 Crawlbase API 一起使探索和收集数字艺术变得轻而易举。

目录

  1. 了解 DeviantArt 网站
  • DeviantArt 搜索页面结构
  • 为什么要从 DeviantArt 中抓取图像?
  1. 设置您的环境
  • 安装 Python 和库
  • 获取Crawlbase API密钥
  • 选择开发 IDE
  1. 探索 Crawlbase Crawling API
  • Crawlbase 的技术优势 Crawling API
  • 发送请求 Crawling API
  • API响应时间和格式
  • Crawling API 参数
  • 免费试用、收费策略和费率限制
  • Crawlbase Python 库
  1. 爬行 DeviantArt 搜索页面
  • 导入必要的库
  • 构建 DeviantArt 搜索的 URL
  • 使用 Crawlbase 发出 API 请求 Crawling API 检索 HTML
  • 运行你的脚本
  1. 处理分页
  • 了解 DeviantArt 中的分页
  • 修改多个页面的API请求
  • 确保高效的分页处理
  1. 解析和提取图像 URL
  • 检查 DeviantArt 搜索页面的 CSS 选择器
  • 利用 CSS 选择器提取图像 URL
  • 将提取的数据存储在 CSV 和 SQLite 数据库中
  1. 从抓取的图像 URL 下载图像
  • 使用Python下载图片
  • 组织下载的图像
  1. 总结
  2. 常见问题

了解 DeviantArt 网站

DeviantArt 是一个充满活力且广阔的在线社区,是经验丰富的艺术家和新兴艺术家的天堂。 DeviantArt 于 2000 年推出,现已发展成为最大的在线艺术社区之一,拥有数百万用户和广泛的多样化艺术品收藏。

DeviantArt 的核心是一个数字画廊,艺术家可以在这里展示各种创作,包括数字绘画、插图、摄影、文学等。该平台鼓励通过评论、批评和创建协作项目进行互动,为创造性思维营造一个充满活力和支持的环境。

DeviantArt 搜索页面结构

搜索页面是通往众多艺术品的门户,提供过滤器和参数来优化对特定主题、风格或艺术家的搜索。

DeviantArt 数字艺术多样性

DeviantArt 搜索页面结构的关键组成部分包括:

  • 搜索栏:用户输入关键词、标签或艺术家姓名的入口点。
  • 筛选:根据类别、类型和受欢迎程度缩小搜索范围的选项。
  • 结果网格:显示代表符合搜索条件的艺术品的缩略图网格。
  • 分页:导航以在多个搜索结果页面之间移动。

为什么要从 DeviantArt 中抓取图像?

人们,包括研究人员,出于各种原因抓取图像。首先,它让爱好者在DeviantArt上发现不同的艺术风格和才华,使其成为一次激动人心的艺术探索之旅。对于研究人员和分析师来说,抓取提供了宝贵的数据来研究数字艺术随时间的趋势和演变。艺术家和艺术爱好者还使用刮取的图像作为灵感来源并创建精选收藏,展示 DeviantArt 社区内的巨大创造力。此外,抓取有助于了解社区的动态,包括流行主题、协作趋势以及不同艺术风格的影响。从本质上讲,从 DeviantArt 进行抓取是一种欣赏、学习和为平台上丰富的艺术表达做出贡献的方式。

设置您的环境

对于从 Deviantart 抓取图像,让我们确保您的环境已准备就绪。本节将指导您完成基本工具(包括 Python)的安装以及必要库(Crawlbase、BeautifulSoup 和 Pandas)的设置。

安装 Python 和库

Python安装:

首先安装 Python,这种编程语言将推动我们的抓取冒险。访问Python官方网站并下载适合您操作系统的最新版本。按照安装说明在您的计算机上设置 Python。

创建虚拟环境:

要维护干净且有组织的开发环境,请考虑为您的项目创建虚拟环境。在终端中使用以下命令:

1
2
3
4
5
6
# 创建虚拟环境
python -m venv myenv

# 激活虚拟环境
资源 myenv/bin/激活 # 在 macOS/Linux 上
.\myenv\Scripts\activate # 在 Windows 上

库安装:

安装 Python 后,打开终端或命令提示符并使用以下命令安装所需的库:

1
2
3
4
点安装爬虫库
点安装beautifulsoup4
pip 安装熊猫
点安装请求

爬虫库crawlbase 库是 Crawlbase API 的 Python 包装器,它使我们能够高效地发出 Web 请求。

美丽的汤:Beautiful Soup 是一个用于解析 HTML 和 XML 文档的库。 它对于从网页中提取数据特别有用。

熊猫:Pandas 是一个强大的数据操作库,可以帮助您有效地组织和分析抓取的数据。

要求requests 库是一个 Python 模块,用于轻松发送 HTTP 请求和管理响应。它简化了常见的 HTTP 操作,使其成为广泛用于 Web 相关任务(例如 Web 抓取和 API 交互)的工具。

获取Crawlbase API密钥

注册 Crawlbase:

导航至 Crawlbase 网站并 注册申请 SearchGPT 等候名单 如果您还没有帐户的话。注册后,登录您的帐户。

检索您的 API 密钥:

登录后,转到您的 账户文件 在 Crawlbase 上。找到你的 API 密钥,这对于与 Crawlbase 交互至关重要 Crawling API。请妥善保管此密钥,因为它将是您访问所需网络数据的网关。

选择开发 IDE

集成开发环境(IDE)就像一个用于编写代码的特殊空间。它通过突出显示代码、在您键入时建议单词以及提供修复错误的工具来提供帮助。尽管您可以在基本文本编辑器中编写 Python 代码,但使用 IDE 可以使该过程变得更加轻松,并且更有利于您的开发工作。

以下是一些值得考虑的流行 Python IDE:

  1. PyCharm:PyCharm 是一个强大的 IDE,具有免费的社区版。 它提供代码分析、可视化调试器和 Web 开发支持等功能。

  2. Visual Studio 代码(VS 代码):VS Code 是 Microsoft 开发的免费开源代码编辑器。 其庞大的扩展库使其能够适用于各种编程任务,包括网络抓取。

  3. Jupyter笔记本:Jupyter Notebook 非常适合交互式编码和数据探索。 它通常用于数据科学项目。

  4. Spyder的:Spyder 是一款专为科学和数据相关任务而设计的 IDE。 它提供了变量浏览器和交互式控制台等功能。

通过这些步骤,您的环境现在已经配备了我们 DeviantArt 抓取工作所需的工具。在接下来的部分中,我们将利用这些工具来制作 DeviantArt Scraper 并揭开数字艺术的世界。

探索 Crawlbase Crawling API

在开始使用 DeviantArt 进行网页抓取之前,了解 Crawlbase 至关重要 Crawling API。本部分将分解 Crawlbase 的 API 的技术细节,让您了解如何在 Python 作业抓取项目中顺利使用它。

Crawlbase 的技术优势 Crawling API

爬行基地 Crawling API 提供了几个重要优势,帮助开发人员轻松收集网络数据并管理爬取过程的不同部分。以下是一些显著的优势:

Crawlbase 的技术优势 Crawling API
  1. 适应性设置: 爬行基地 Crawling API 提供了很多设置,让开发人员可以微调他们的 API 请求。这包括“format”、“user_agent”、“page_wait”等参数,允许根据特定需求进行自定义。
  2. 数据格式的选择:开发人员可以根据自己的喜好和数据处理需求在 JSON 和 HTML 响应格式之间进行选择。这种灵活性使数据提取和处理变得更加容易。
  3. 处理 Cookie 和标头:通过使用“获取cookies“ 和 ”获取标题”,开发人员可以从原始网站获取 cookie 和标头等重要信息,这对于某些网络抓取任务至关重要。
  4. 处理动态内容:该API擅长处理动态内容,对于使用JavaScript抓取页面很有用。参数如“页面等待“ 和 ”ajax_等待“帮助开发人员确保 API 捕获所有内容,即使加载需要时间。
  5. 更改IP地址:这个API可以让你 切换IP地址,让您保持匿名并减少被网站阻止的机会。此功能使网络爬行更加成功。
  6. 选择位置:开发者可以使用“指定请求的国家/地区”国家“ 参数,这对于需要特定位置数据的情况非常方便。
  7. 支持 Tor 网络:打开“tor_网络“ 参数允许通过 Tor 网络爬行洋葱网站,使其更加私密并允许访问暗网上的内容。
  8. 使用数据抓取器:这个API可以让你使用 预定义的数据抓取器 使用 ”刮刀“参数,可以更轻松地从网页获取特定信息,而无需太多麻烦。
  9. 异步爬取:当需要异步抓取时,API支持“异步“ 范围。开发人员获取请求标识符 (RID),以便轻松检索从中爬取的数据 云存储.
  10. 自动解析:“自动解析“ 参数通过以 JSON 格式提供解析后的信息,使数据提取变得更加简单,减少了获取 HTML 内容后需要进行的大量额外工作。

总结一下,Crawlbase 的 Crawling API 是一款强大的网页抓取和数据提取工具。它提供各种设置和功能以满足不同的需求,使网页抓取高效且有效,无论您是处理动态内容、管理 Cookie 和标头, 更改IP地址,或获取特定数据。

发送请求 Crawling API

Crawlbase的 Crawling API 旨在简化和轻松集成到您的 Web 抓取项目中。所有 API URL 均以基本部分开头: https://api.crawlbase.com。 进行第一个 API 调用就像在终端中执行命令一样简单:

1
卷曲 'https://api.crawlbase.com/?token=YOUR_CRAWLBASE_TOKEN&url=https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories'

在这里,您会注意到 token 参数,它用作访问 Crawlbase 的网络抓取功能的身份验证密钥。 Crawlbase 提供两种令牌类型:普通 (TCP) 令牌和 JavaScript (JS) 令牌。对于变化不大的网站(例如静态网站),选择普通令牌。但是,如果您想从仅当人们使用带有 JavaScript 的 Web 浏览器时才有效的网站获取信息,或者 JavaScript 在用户端生成您想要的重要内容,那么您应该使用 JavaScript 令牌。与 DeviantArt 一样,普通令牌是一个不错的选择。

API响应时间和格式

与 Crawlbase 交战时 Crawling API,掌握响应时间的动态以及如何解释成功或失败至关重要。让我们仔细看看这些组件:

响应时间:通常,API 的响应时间在 4 到 10 秒的范围内。为了确保顺利的通话并适应潜在的延迟,建议将呼叫超时设置为至少 90 秒。这可以保护您的应用程序,使其能够在不中断的情况下管理响应时间的波动。

响应格式:向 Crawlbase 发出请求时,您可以根据自己的喜好和解析需求灵活选择 HTML 或 JSON 响应格式。通过在“格式”查询参数中附加值“HTML”或“JSON”,您可以指定所需的格式。

在您选择 HTML 响应格式(默认设置)的情况下,API 将提供网页的 HTML 内容作为响应。响应参数将方便地合并到响应标头中,以便于访问。这是一个说明性响应示例:

1
2
3
4
5
6
7
:
网址: HTTPS://github.com/crawlbase?tab=repositories
原始状态: 200
电脑状态: 200

Body:
页面的 HTML

如果您选择 JSON 响应格式,您将收到一个可以在应用程序中轻松解析的结构化 JSON 对象。 该对象包含您需要的所有信息,包括响应参数。 这是一个响应示例:

1
2
3
4
5
6
{
“原始状态”: “200”,
“电脑状态”: 200,
“网址”: "https%3A%2F%2Fgithub.com%2Fcrawlbase%3Ftab%3Drepositories",
“身体”: “页面的 HTML”
}

响应标题:HTML 和 JSON 响应都包含基本标头,这些标头提供有关请求及其结果的有价值的信息:

  • url:在请求中发送的原始 URL 或 Crawlbase 遵循的任何重定向的 URL。
  • original_status:Crawlbase 在抓取请求中发送的 URL 时收到的状态响应。 它可以是任何有效的 HTTP 状态代码。
  • pc_status:Crawlbase (pc) 状态代码,可以是任何状态代码,并且是最终有效的代码。例如,如果网站通过验证码返回原始状态为 200,则 pc_status 可能为 503。
  • body:此参数以 JSON 格式提供,包含 Crawlbase 通过代理抓取请求中发送的 URL 发现的网页内容。

这些响应参数使您能够评估请求的结果并确定您的网络抓取操作是否成功。

Crawling API 参数

Crawlbase 提供了一套全面的参数,允许开发人员自定义他们的网络爬行请求。这些参数可以对抓取过程进行微调以满足特定要求。例如,在处理 JavaScript 生成的内容时,您可以使用“format”参数指定 JSON 或 HTML 等响应格式,或使用“page_wait”控制页面等待时间。

此外,您还可以提取 cookie 和标头、设置自定义用户代理、捕获屏幕截图,甚至使用“get_cookies”、“user_agent”、“屏幕截图”和“国家/地区”等参数选择地理位置首选项。这些选项提供了对网络爬行过程的灵活性和控制。例如,要检索原始网站设置的 cookie,您只需在 API 请求中包含 get_cookies=true 查询参数,Crawlbase 就会在响应标头中返回 cookie。

您可以阅读有关 Crawlbase 的更多信息 Crawling API 参数 点击这里.

免费试用、收费策略和费率限制

Crawlbase 延长了包含前 1,000 个请求的试用期,提供了在做出承诺之前深入了解其功能的机会。然而,优化这个试验窗口对于从中获取最大价值至关重要。

Crawlbase 采用“按需付费”模式,专门针对成功的请求收费,确保为您的网络抓取工作提供经济高效的解决方案。成功请求的确定取决于对请求的详细审查 original_statuspc_status 在响应参数内。

API 施加了速率限制,每个令牌每秒最多 20 个请求。如果您需要更高的速率限制,可以联系支持人员进行定制讨论,以满足您的特定要求。

Crawlbase Python 库

Crawlbase Python 库提供了一种与 Crawlbase 交互的简单方法 Crawling API。您可以使用这个轻量级且无依赖关系的 Python 类作为 Crawlbase API 的包装器。首先,初始化 Crawling API 类与您的 Crawlbase 令牌。然后,您可以通过提供要抓取的 URL 和任何所需选项(例如自定义用户代理或响应格式)来发出 GET 请求。例如,您可以像这样抓取网页并访问其内容:

1
2
3
4
5
6
7
8
9
 爬行基地 进口 抓取API

# 初始化CrawlingAPI类
api = 爬行API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })

# 发出 GET 请求来抓取网页
响应 = api.get('https://www.example.com')
if 回复['状态代码'] == 200:
打印(回复['身体'])

该库简化了获取网络数据的过程,对于需要动态内容、IP 轮换和 Crawlbase API 的其他高级功能的场景特别有用。

爬行 DeviantArt 搜索页面

现在我们已经了解了 DeviantArt 并配置了环境,让我们深入了解抓取 DeviantArt 搜索页面的激动人心的过程。本节将引导您导入必要的库、构建搜索 URL 以及使用 Crawlbase 发出 API 请求 Crawling API 检索 HTML 内容。

导入必要的库

打开您最喜欢的 Python 编辑器或创建一个新的 Python 脚本文件。为了开始我们的爬行冒险,我们需要配备合适的工具。将所需的库导入到您的 Python 脚本中:

1
 爬行基地 进口 抓取API

在这里,我们引入 CrawlingAPI 来自 Crawlbase 的类,确保我们能够与 Crawling API.

现在,让我们构建 DeviantArt 搜索的 URL。假设我们想用关键词“幻想”来探索数字艺术。 URL 构造可能如下所示:

1
2
3
4
5
6
7
8
# 将“YOUR_CRAWLBASE_TOKEN”替换为您的实际 Crawlbase API 令牌
api_令牌= 'YOUR_CRAWLBASE_TOKEN'
crawlbase_api = 爬行API({ '令牌': api_token })

基本网址 = “https://www.deviantart.com”
关键字= “幻想”

搜索网址 = f"{base_url}/搜索?q={关键词}"

使用 Crawlbase 发出 API 请求 Crawling API 检索 HTML

准备好 URL 后,让我们利用 Crawlbase 的强大功能 Crawling API 检索 DeviantArt 搜索页面的 HTML 内容:

1
2
3
4
5
6
7
8
9
10
# 发出API请求
响应=crawlbase_api.get(search_url)

# 检查请求是否成功
if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')
打印(html_内容)
其他:
打印(f"请求失败,状态码 {回复['状态代码']}: {回复['身体']}")

在此代码片段中,我们使用 CrawlingAPI 类的 get 方法向构造的搜索 URL 发出请求。然后检查响应是否成功,如果成功,则提取 HTML 内容以供进一步探索。

运行你的脚本

现在您的脚本已准备就绪,请使用 .py 扩展名保存它,例如 deviantart_scraper.py。打开终端或命令提示符,导航到脚本的目录,然后运行:

1
蟒蛇 deviantart_scraper.py

将 deviantart_scraper.py 替换为脚本的实际名称。按 Enter 键,您的脚本将执行,启动抓取 DeviantArt 搜索页面的过程。

示例输出:

代码 HTML 输出

通过这些步骤,我们启动了 DeviantArt 搜索页面的抓取过程。在接下来的部分中,我们将更深入地研究解析和提取图像 URL,使我们更接近完成 DeviantArt Scraper。

处理分页

在抓取内容丰富的网站时,浏览多个页面是一个常见的挑战,DeviantArt 也不例外。在本节中,我们将深入研究处理分页的复杂性,确保我们的 DeviantArt 抓取工具有效捕获广泛的搜索结果。

了解 DeviantArt 中的分页

DeviantArt 跨多个页面构建搜索结果,以系统地管理和呈现内容。每个页面通常包含结果的子集,用户可以浏览这些页面以探索其他内容。了解这个分页系统对于我们的抓取工具收集全面的数据集至关重要。

修改多个页面的API请求

为了使我们的抓取工具适应分页,我们需要在浏览不同页面时动态修改 API 请求。考虑以下示例:

1
2
3
4
5
# 假设'page_number'是代表页码的变量
页码 = 10 # 将其更改为所需的页码

# 修改搜索URL以包含页码
搜索网址 = f"{base_url}/搜索?q={关键词}&页面={页码}"

在此片段中,我们附加了 &page={page_number} 到搜索 URL 以指定所需的页面。当我们的抓取工具浏览页面时,我们可以更新 page_number 相应地可变。

确保高效的分页处理

在处理分页时,效率至关重要,以防止对资源造成不必要的压力。考虑实现一个循环来系统地迭代多个页面。让我们更新上一节中的脚本以合并分页:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 爬行基地 进口 抓取API

DEF 刮页(api、base_url、关键字、页码):
# 构造当前页面的URL
当前页面网址 = f"{base_url}/搜索?q={关键词}&页面={页码}"

# 发出API请求并提取HTML内容
响应 = api.get(current_page_url)

if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')

# 在这里实现解析和数据提取逻辑
# 例如解析html_content并提取相关数据

# 目前,返回占位符列表
回报 [f"页面数据 {页码}"]
其他:
打印(f"请求 {当前页面网址} 失败并显示状态代码 {回复['状态代码']}: {回复['身体']}")
回报 没有

DEF ():
# 将“YOUR_CRAWLBASE_TOKEN”替换为您的实际 Crawlbase API 令牌
api_令牌= 'YOUR_CRAWLBASE_TOKEN'
crawlbase_api = 爬行API({ '令牌': api_token })

基本网址 = “https://www.deviantart.com”
关键字= “幻想”
总页数= 10

# 遍历页面并抓取数据
页码 in 范围(1, 总页数 + 1):
# 抓取当前页面
data_from_page = scrape_page(crawlbase_api, base_url, 关键字, page_number)

if 来自页面的数据:
打印(来自页面的数据) # 根据你的数据结构按需修改

if __名字__ == “__主要的__”:
主()

这款 scrape_page 函数封装了构造 URL、发出 API 请求以及处理 HTML 内容提取的逻辑。它检查响应状态代码,如果成功(状态代码 200),则处理 HTML 内容以进行数据提取。这 main 函数初始化 Crawlbase API,设置基本 URL、关键字和要抓取的页面总数。然后它迭代指定数量的页面,调用 scrape_page 每个页面的功能。打印提取的数据(此处表示为占位符列表)用于演示目的。

在接下来的部分中,我们将深入研究解析 HTML 内容以提取图像 URL 的详细过程,以及实现系统下载这些图像的机制。

解析和提取图像 URL

现在我们已经成功地浏览了多个页面,是时候专注于从 HTML 内容中解析和提取有价值的信息了。在本节中,我们将探讨如何检查 DeviantArt 搜索页面的 CSS 选择器、利用这些选择器进行图像提取、清理提取的 URL,最后以 CSV 和 SQLite 格式存储数据。

检查 DeviantArt 搜索页面的 CSS 选择器

在提取图像 URL 之前,我们需要识别包含相关信息的 HTML 元素。右键单击网页,选择“检查”(或“检查元素”),然后浏览 HTML 结构以查找包含图像 URL 的元素。

例如,DeviantArt 在 HTML 标签中构造其图像 URL,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<a
数据挂钩=“偏差_链接”
HREF=“https://www.deviantart.com/siobhan-o-wisp/art/Owl-6-925596734”
咏叹调标签=“Siobhan-o-wisp 的猫头鹰 #6,视觉艺术”
>
<DIV
=“_3_LJY”
咏叹调隐藏=“真正”
数据测试ID=“拇指”
类型=“图像对象”
词汇=“https://schema.org/”
样式=“宽度:233 像素;高度:279 像素”
>
<IMG
ALT=《猫头鹰#6》
SRC=“src_url_这里”
srcset=“srcset_url_here”
财产=“内容网址”
样式=“宽度:233px;高度:279px;对象适合:覆盖;对象位置:50% 100%”
/>
</DIV>
</a>

在这种情况下,图像 URL 的 CSS 选择器可以是 a[data-hook="deviation_link"] img[property="contentUrl"].

利用 CSS 选择器提取图像 URL

让我们将解析逻辑集成到现有脚本中。通过使用BeautifulSoup库,我们可以解析HTML内容并根据识别出的图像URL来提取 CSS选择器。更新 scrape_page 函数以包含使用 CSS 选择器的解析逻辑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

DEF 刮页(api、base_url、关键字、页码):
# 构造当前页面的URL
当前页面网址 = f"{base_url}/搜索?q={关键词}&页面={页码}"

# 发出API请求并提取HTML内容
响应 = api.get(current_page_url)

if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')

# 在这里实现解析和数据提取逻辑
解析数据 = []
汤 = BeautifulSoup(html_content, 'html.parser')

# 图像 URL 的 CSS 选择器示例
图像选择器= 'a[data-hook="deviation_link"] img[property="contentUrl"]'

# 使用 CSS 选择器提取和清理图像 URL
image_elements = soup.select(image_selector)
图像元素 in 图像元素:
# 提取原始图像 URL
图像_url = 图像_元素['源代码']。条()

parsed_data.append({'图片网址': image_url})

回报 解析数据
其他:
打印(f"请求 {当前页面网址} 失败并显示状态代码 {回复['状态代码']}: {回复['身体']}")
回报 没有

DEF ():
# 将“YOUR_CRAWLBASE_TOKEN”替换为您的实际 Crawlbase API 令牌
api_令牌= 'YOUR_CRAWLBASE_TOKEN'
crawlbase_api = 爬行API({ '令牌': api_token })

基本网址 = “https://www.deviantart.com”
关键字= “幻想”
总页数= 2

# 遍历页面并抓取数据
所有数据 = []
页码 in 范围(1, 总页数 + 1):
# 抓取当前页面
data_from_page = scrape_page(crawlbase_api, base_url, 关键字, page_number)

if 来自页面的数据:
all_data.extend(data_from_page)

# 打印或保存所有产品详细信息
打印(json.dumps(all_data, 缩进=2))

if __名字__ == “__主要的__”:
主()

scrape_page(api, base_url, keyword, page_number):该函数采用 Crawlbase API 实例的参数 api, 基本 URL base_url, 搜索关键字 keyword和页码 page_number。它构造当前页面的 URL,向 Crawlbase API 发出请求以检索 HTML 内容,然后使用 BeautifulSoup 从 HTML 中提取图像 URL。用于图像 URL 的 CSS 选择器是‘a[data-hook="deviation_link"] img[property="contentUrl"]'。提取的图像 URL 存储在字典列表中 parsed_data.
main():该函数是脚本的主要入口点。它使用提供的令牌初始化 Crawlbase API,将基本 URL 设置为“https://www.deviantart.com,”将搜索关键字指定为“fantasy”,并定义要抓取的页面总数(在本例中为 2)。它迭代指定数量的页面,调用 scrape_page 每个页面的函数并将提取的数据附加到 all_data 列表。最后,它使用格式化的 JSON 表示形式打印提取的数据 json.dumps.

示例输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
[
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/36b9a048-0833-460c-a2f0-3a4d1c029340/de9ysag-ad79d0fb-4de7-4bd9-9223-c7c38feecc5a.png/v1/fill/w_462,h_250,q_70,strp/jungle_tombs_by_rajanandepu_de9ysag-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjkzIiwicGF0aCI6IlwvZlwvMzZiOWEwNDgtMDgzMy00NjBjLWEyZjAtM2E0ZDFjMDI5MzQwXC9kZTl5c2FnLWFkNzlkMGZiLTRkZTctNGJkOS05MjIzLWM3YzM4ZmVlY2M1YS5wbmciLCJ3aWR0aCI6Ijw9MTI4MCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.G3TyS8DU1qgsA9V6gmXA2bhAABHAB-YlqYyusaKu2W8"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/31ca8292-e979-4e41-a025-8b13994f6690/d9iwdru-5a282fd0-bd6f-4904-9ec0-34a471c0e96f.jpg/v1/crop/w_163,h_250,x_0,y_0,scl_0.16717948717949,q_70,strp/fairy_bay_by_darekzabrocki_d9iwdru-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTUwMCIsInBhdGgiOiJcL2ZcLzMxY2E4MjkyLWU5NzktNGU0MS1hMDI1LThiMTM5OTRmNjY5MFwvZDlpd2RydS01YTI4MmZkMC1iZDZmLTQ5MDQtOWVjMC0zNGE0NzFjMGU5NmYuanBnIiwid2lkdGgiOiI8PTk3NSJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.T79tGh8ikSpiB0bgTgRiPj_jErhylF6FzhOh9V_26Hw"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/b0069016-7cd6-4fff-b1ae-242d4172d5b4/de8zc6a-b87e753d-3657-4cf2-af4d-d55043b88486.jpg/v1/fit/w_414,h_245,q_70,strp/fantasy_maps_art_coomiissions_for_steven_by_threeanglework_de8zc6a-414w.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjA1IiwicGF0aCI6IlwvZlwvYjAwNjkwMTYtN2NkNi00ZmZmLWIxYWUtMjQyZDQxNzJkNWI0XC9kZTh6YzZhLWI4N2U3NTNkLTM2NTctNGNmMi1hZjRkLWQ1NTA0M2I4ODQ4Ni5qcGciLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.SWEVlwSLHEY7I0Agl2IVMKxylq0LTX3Xvee57lbnoJQ"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/7665f267-607e-41b3-93d4-d44b75b58e37/dexmkcy-8daa7a57-febe-4b40-bc06-ca2edf4355a4.jpg/v1/fill/w_670,h_350,q_70,strp/city_of_elves_by_panjoool_dexmkcy-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjcwIiwicGF0aCI6IlwvZlwvNzY2NWYyNjctNjA3ZS00MWIzLTkzZDQtZDQ0Yjc1YjU4ZTM3XC9kZXhta2N5LThkYWE3YTU3LWZlYmUtNGI0MC1iYzA2LWNhMmVkZjQzNTVhNC5qcGciLCJ3aWR0aCI6Ijw9MTI4MCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.F6h5UrGiIOe0ct6XH2EP5g6sB06TI0TQDZa7yq08shM"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/38961eb5-6954-4066-a5b4-74c4c17bba02/dessk9p-898c4573-2759-4e13-8c6e-c6af5893cb77.png/v1/fill/w_566,h_350/magic_forest_by_postapodcast_dessk9p-350t.png?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NzkyIiwicGF0aCI6IlwvZlwvMzg5NjFlYjUtNjk1NC00MDY2LWE1YjQtNzRjNGMxN2JiYTAyXC9kZXNzazlwLTg5OGM0NTczLTI3NTktNGUxMy04YzZlLWM2YWY1ODkzY2I3Ny5wbmciLCJ3aWR0aCI6Ijw9MTI4MCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.aZ3GIu_6Jnj1k6w9ci7KRrzCdWTSTD__fJUZaKUBayw"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/8fd505b7-1d62-42fa-ae28-60294fb112fa/da4h819-5434889d-db48-41c0-a548-15ffb704ffc7.jpg/v1/fill/w_700,h_329,q_70,strp/the_grand_gate_by_merl1ncz_da4h819-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NzA1IiwicGF0aCI6IlwvZlwvOGZkNTA1YjctMWQ2Mi00MmZhLWFlMjgtNjAyOTRmYjExMmZhXC9kYTRoODE5LTU0MzQ4ODlkLWRiNDgtNDFjMC1hNTQ4LTE1ZmZiNzA0ZmZjNy5qcGciLCJ3aWR0aCI6Ijw9MTUwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.wBoGmmno1N26VvCPVDR2pdkCNP_rYpxxo_dmQdYvSXc"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/6ff2ccfb-d302-4348-87bc-8b9568748e63/d8ox1uh-3baf219c-0bac-47fa-b227-c89a8134845c.jpg/v1/fill/w_657,h_350,q_70,strp/journey_home_ii_by_jjcanvas_d8ox1uh-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjgyIiwicGF0aCI6IlwvZlwvNmZmMmNjZmItZDMwMi00MzQ4LTg3YmMtOGI5NTY4NzQ4ZTYzXC9kOG94MXVoLTNiYWYyMTljLTBiYWMtNDdmYS1iMjI3LWM4OWE4MTM0ODQ1Yy5qcGciLCJ3aWR0aCI6Ijw9MTI4MCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.r83EO9Verq40yofAO0J5aaxk39zI_3Km8xy9IhcHTJU"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/0f32ddfc-07dd-4afe-bcfd-60218bd1c565/d9woys6-489490fe-e3f3-493d-b5dd-b74b36d72044.jpg/v1/fill/w_622,h_350,q_70,strp/wizard_overlord_by_88grzes_d9woys6-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NTc2IiwicGF0aCI6IlwvZlwvMGYzMmRkZmMtMDdkZC00YWZlLWJjZmQtNjAyMThiZDFjNTY1XC9kOXdveXM2LTQ4OTQ5MGZlLWUzZjMtNDkzZC1iNWRkLWI3NGIzNmQ3MjA0NC5qcGciLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.CWF2dVY5FD_pY6In-SM4iSHUtKZ4LcWz7w4jckLSotM"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/677a3275-419d-415d-a4ee-fe2097a24e46/ddfkq9w-cc46d438-9640-428e-a1e7-986fdede405d.jpg/v1/fill/w_700,h_339,q_70,strp/fantasy_landscape_by_blueavel_ddfkq9w-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NDg0IiwicGF0aCI6IlwvZlwvNjc3YTMyNzUtNDE5ZC00MTVkLWE0ZWUtZmUyMDk3YTI0ZTQ2XC9kZGZrcTl3LWNjNDZkNDM4LTk2NDAtNDI4ZS1hMWU3LTk4NmZkZWRlNDA1ZC5qcGciLCJ3aWR0aCI6Ijw9MTAwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.qRJRzrqAUyn-IxUZovvdfIkqeQ4PyYFwO4PA5fZSVuw"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/cf4e3b17-25ab-486e-9863-1d2651123f7e/d45tdhb-2cceea9d-cf27-4325-92f0-9c8f8c406872.jpg/v1/fill/w_143,h_250,q_70,strp/fantasy_castle_by_peterconcept_d45tdhb-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTAwMCIsInBhdGgiOiJcL2ZcL2NmNGUzYjE3LTI1YWItNDg2ZS05ODYzLTFkMjY1MTEyM2Y3ZVwvZDQ1dGRoYi0yY2NlZWE5ZC1jZjI3LTQzMjUtOTJmMC05YzhmOGM0MDY4NzIuanBnIiwid2lkdGgiOiI8PTU3MSJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.5lnZruTFCmZkMar66M81rvQQloK8sCoZtIa6aqMOpVo"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/a0102abd-a974-49be-9415-5d6329de2615/d85kpn2-969091cf-bf6c-45e3-8431-e37425010343.jpg/v1/fill/w_500,h_250,q_70,strp/fantasy_city_by_britneypringle_d85kpn2-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NTEyIiwicGF0aCI6IlwvZlwvYTAxMDJhYmQtYTk3NC00OWJlLTk0MTUtNWQ2MzI5ZGUyNjE1XC9kODVrcG4yLTk2OTA5MWNmLWJmNmMtNDVlMy04NDMxLWUzNzQyNTAxMDM0My5qcGciLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.WGMQEQnTucVFLQ734ScVyRUCJVuaNvucC8hx10KnSak"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/2f9d63ea-05a6-44f9-a06d-3c3506ace1a6/dc7rp7q-8cde501b-30a5-4c5b-a7c0-e8da6577d000.jpg/v1/fit/w_414,h_240,q_70,strp/mushy_land_by_raphael_lacoste_dc7rp7q-414w.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9OTI4IiwicGF0aCI6IlwvZlwvMmY5ZDYzZWEtMDVhNi00NGY5LWEwNmQtM2MzNTA2YWNlMWE2XC9kYzdycDdxLThjZGU1MDFiLTMwYTUtNGM1Yi1hN2MwLWU4ZGE2NTc3ZDAwMC5qcGciLCJ3aWR0aCI6Ijw9MTYwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.eFslHR3hiGwNnIsEWI82ZRXAfbrdGHZOHn2nBfRa_Qg"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/5676e946-eac5-462d-8385-566c5e7b4794/dek1geb-693d25d3-c206-409f-abb0-0fce7bf52b45.jpg/v1/fill/w_700,h_336,q_70,strp/homecoming_by_flaviobolla_dek1geb-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NzY5IiwicGF0aCI6IlwvZlwvNTY3NmU5NDYtZWFjNS00NjJkLTgzODUtNTY2YzVlN2I0Nzk0XC9kZWsxZ2ViLTY5M2QyNWQzLWMyMDYtNDA5Zi1hYmIwLTBmY2U3YmY1MmI0NS5qcGciLCJ3aWR0aCI6Ijw9MTYwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.VRn481jxhnjKhv47e9WMKclr0piK7T7ljM7IbMn42GU"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/35267649-f012-4cf7-9907-94a5d524e332/dcya6ht-644bdc7e-efbc-40a4-8fd3-727832ddd5ca.jpg/v1/fill/w_635,h_350,q_70,strp/fantasy_castle_012219_by_rich35211_dcya6ht-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTMwMSIsInBhdGgiOiJcL2ZcLzM1MjY3NjQ5LWYwMTItNGNmNy05OTA3LTk0YTVkNTI0ZTMzMlwvZGN5YTZodC02NDRiZGM3ZS1lZmJjLTQwYTQtOGZkMy03Mjc4MzJkZGQ1Y2EuanBnIiwid2lkdGgiOiI8PTIzNjAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.LYDYnkQTWyJWgjerl0PG8N8Qp64J98PAcMDt2_ngjGs"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/0c6e0590-011b-4912-bfe4-9353b6e5dc98/ddxqz6d-71e5fc4a-1d91-4cd4-b074-0cb826b70f84.jpg/v1/fill/w_199,h_250,q_70,strp/ramparts_by_eddie_mendoza_ddxqz6d-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTQ1MCIsInBhdGgiOiJcL2ZcLzBjNmUwNTkwLTAxMWItNDkxMi1iZmU0LTkzNTNiNmU1ZGM5OFwvZGR4cXo2ZC03MWU1ZmM0YS0xZDkxLTRjZDQtYjA3NC0wY2I4MjZiNzBmODQuanBnIiwid2lkdGgiOiI8PTExNTYifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.0NFGpaE22d48MHr2PTfPQlDss07ec8iwKXGKtpRgq3c"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/aea046b5-589a-463d-9119-f40d956640f2/dewfvci-253919a9-25b6-43b0-87ba-4c99ddd766bd.jpg/v1/fill/w_200,h_250,q_70,strp/samurai_guardian___photoshop_art_by_phaserunner_dewfvci-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTMwMCIsInBhdGgiOiJcL2ZcL2FlYTA0NmI1LTU4OWEtNDYzZC05MTE5LWY0MGQ5NTY2NDBmMlwvZGV3ZnZjaS0yNTM5MTlhOS0yNWI2LTQzYjAtODdiYS00Yzk5ZGRkNzY2YmQuanBnIiwid2lkdGgiOiI8PTEwNDAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.pSPdQ7FqWJu_iqi1vJjmUuUBKOIOC_qtwathhKubLAc"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/6ff2ccfb-d302-4348-87bc-8b9568748e63/dagt780-aca17f21-148a-40f3-b27e-fb3795bdb274.jpg/v1/fill/w_444,h_250,q_70,strp/the_secret_entrance_by_jjcanvas_dagt780-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NzIwIiwicGF0aCI6IlwvZlwvNmZmMmNjZmItZDMwMi00MzQ4LTg3YmMtOGI5NTY4NzQ4ZTYzXC9kYWd0NzgwLWFjYTE3ZjIxLTE0OGEtNDBmMy1iMjdlLWZiMzc5NWJkYjI3NC5qcGciLCJ3aWR0aCI6Ijw9MTI4MCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.i44QkrqohRXgceqNI3b0x2ARW0UIJK2NDDDjPoSVZ9I"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/f240a8b1-06c4-4ffa-9ba0-853a80e54e12/des3vvj-a1c9c5bf-5311-45c4-96e9-b3078b0012da.png/v1/fill/w_163,h_250,q_70,strp/forest_journey_by_aszith_des3vvj-250t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTIyNyIsInBhdGgiOiJcL2ZcL2YyNDBhOGIxLTA2YzQtNGZmYS05YmEwLTg1M2E4MGU1NGUxMlwvZGVzM3Z2ai1hMWM5YzViZi01MzExLTQ1YzQtOTZlOS1iMzA3OGIwMDEyZGEucG5nIiwid2lkdGgiOiI8PTgwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.CHWmKX7b7Kswbv4XHh-YQlNzmHzc2DQsP5thVGP_iD0"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/d9752802-856c-4511-837b-6eadbdb551b8/devdavw-d59b805d-64a1-4a2c-be45-154ecc6c5617.jpg/v1/fill/w_622,h_350,q_70,strp/kingdom_by_oliverbeck_devdavw-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9MTA4MCIsInBhdGgiOiJcL2ZcL2Q5NzUyODAyLTg1NmMtNDUxMS04MzdiLTZlYWRiZGI1NTFiOFwvZGV2ZGF2dy1kNTliODA1ZC02NGExLTRhMmMtYmU0NS0xNTRlY2M2YzU2MTcuanBnIiwid2lkdGgiOiI8PTE5MjAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.D8s098xZS2g6ggPrl0Iw7rQzYf5OcWS8QKySdjg0GL4"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/0c6e0590-011b-4912-bfe4-9353b6e5dc98/ddn4c9i-8560bfd6-2236-47a5-8bf5-a73b5dc67328.jpg/v1/fill/w_643,h_350,q_70,strp/canal_town_by_eddie_mendoza_ddn4c9i-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9OTI1IiwicGF0aCI6IlwvZlwvMGM2ZTA1OTAtMDExYi00OTEyLWJmZTQtOTM1M2I2ZTVkYzk4XC9kZG40YzlpLTg1NjBiZmQ2LTIyMzYtNDdhNS04YmY1LWE3M2I1ZGM2NzMyOC5qcGciLCJ3aWR0aCI6Ijw9MTcwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.xgGzUkprTYO2Tg4vvz7Ctq56tFR58q4mNxhpoMl_14Y"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/882eb67f-8d3f-470f-a043-0225b551ee06/da6chgs-f1f4e973-92eb-4b59-b60d-b31fea9a7611.jpg/v1/fill/w_700,h_324,q_70,strp/fantasy_landscape_5_by_daisanvisart_da6chgs-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NDE3IiwicGF0aCI6IlwvZlwvODgyZWI2N2YtOGQzZi00NzBmLWEwNDMtMDIyNWI1NTFlZTA2XC9kYTZjaGdzLWYxZjRlOTczLTkyZWItNGI1OS1iNjBkLWIzMWZlYTlhNzYxMS5qcGciLCJ3aWR0aCI6Ijw9OTAwIn1dXSwiYXVkIjpbInVybjpzZXJ2aWNlOmltYWdlLm9wZXJhdGlvbnMiXX0.5d8EegjXzeJ8ePHg5ZhzmHfJl6kSLf--vFK2ghEuj08"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/7665f267-607e-41b3-93d4-d44b75b58e37/dem904a-235a588a-34b6-42e6-94ec-2496d7e61773.jpg/v1/fill/w_684,h_350,q_70,strp/the_kingdom_by_panjoool_dem904a-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9OTg0IiwicGF0aCI6IlwvZlwvNzY2NWYyNjctNjA3ZS00MWIzLTkzZDQtZDQ0Yjc1YjU4ZTM3XC9kZW05MDRhLTIzNWE1ODhhLTM0YjYtNDJlNi05NGVjLTI0OTZkN2U2MTc3My5qcGciLCJ3aWR0aCI6Ijw9MTkyMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.g6vuGPKnGtajUm_h9iQRaufGZ2K4BkDtURK9AXXjmls"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/6ff2ccfb-d302-4348-87bc-8b9568748e63/dcozqaf-5514dcfe-1363-4eac-9929-a9605ef2b140.jpg/v1/fill/w_595,h_350,q_70,strp/forgotten_kingdoms_iv_by_jjcanvas_dcozqaf-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9ODIzIiwicGF0aCI6IlwvZlwvNmZmMmNjZmItZDMwMi00MzQ4LTg3YmMtOGI5NTY4NzQ4ZTYzXC9kY296cWFmLTU1MTRkY2ZlLTEzNjMtNGVhYy05OTI5LWE5NjA1ZWYyYjE0MC5qcGciLCJ3aWR0aCI6Ijw9MTQwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.fh4lMrrTAj8LKRVn0dzvmV_oRSpvJsppbK6ipuJBciY"
},
{
“图片网址”: "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/4b0bb084-0057-48cf-92b4-7319629b576c/damprvc-31559c47-6da4-461c-b218-0a15bd7ee31e.jpg/v1/fill/w_700,h_298,q_70,strp/a_new_friend_by_grivetart_damprvc-350t.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9ODUxIiwicGF0aCI6IlwvZlwvNGIwYmIwODQtMDA1Ny00OGNmLTkyYjQtNzMxOTYyOWI1NzZjXC9kYW1wcnZjLTMxNTU5YzQ3LTZkYTQtNDYxYy1iMjE4LTBhMTViZDdlZTMxZS5qcGciLCJ3aWR0aCI6Ijw9MjAwMCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.BYESPqEjOAWFf4FVrBDlGfn4sXJbcUSJG_otWz7Qppg"
}
]

将提取的数据存储在 CSV 和 SQLite 数据库中

现在,让我们更新 main 函数来处理提取的数据并将其存储为 CSV 和 SQLite 格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
进口 sqlite3
爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 大熊猫 as pd

DEF 初始化数据库(数据库文件名='deviantart_data.db'):
conn = sqlite3.connect(db_filename)
光标 = conn.cursor()

游标.执行('''
如果不存在则创建表 deviantart_data (
id 整数主键,
图像_url 文本
)
''')

# 提交更改并关闭连接
conn.commit()
conn.close()

DEF 将数据插入数据库(数据,数据库文件名='deviantart_data.db'):
conn = sqlite3.connect(db_filename)
光标 = conn.cursor()

# 向表中插入数据
in 数据:
游标.执行('插入 deviantart_data (image_url) 值 (?)', (排['图片网址'],))

# 提交更改并关闭连接
conn.commit()
conn.close()

DEF 刮页(api、base_url、关键字、页码):
# 构造当前页面的URL
当前页面网址 = f"{base_url}/搜索?q={关键词}&页面={页码}"

# 发出API请求并提取HTML内容
响应 = api.get(current_page_url)

if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')

# 在这里实现解析和数据提取逻辑
解析数据 = []
汤 = BeautifulSoup(html_content, 'html.parser')

# 图像 URL 的 CSS 选择器示例
图像选择器= 'a[data-hook="deviation_link"] img[property="contentUrl"]'

# 使用 CSS 选择器提取和清理图像 URL
image_elements = soup.select(image_selector)
图像元素 in 图像元素:
# 提取原始图像 URL
图像_url = 图像_元素['源代码']。条()

parsed_data.append({'图片网址': image_url})

回报 解析数据
其他:
打印(f"请求 {当前页面网址} 失败并显示状态代码 {回复['状态代码']}: {回复['身体']}")
回报 没有

DEF ():
# 将“YOUR_CRAWLBASE_TOKEN”替换为您的实际 Crawlbase API 令牌
api_令牌= 'YOUR_CRAWLBASE_TOKEN'
crawlbase_api = 爬行API({ '令牌': api_token })

基本网址 = “https://www.deviantart.com”
关键字= “幻想”
总页数= 2

# 遍历页面并抓取数据
所有数据 = []
页码 in 范围(1, 总页数 + 1):
# 抓取当前页面
data_from_page = scrape_page(crawlbase_api, base_url, 关键字, page_number)

if 来自页面的数据:
all_data.extend(data_from_page)

# 使用 Pandas 将所有数据存储到 CSV 中
df = pd.DataFrame(all_data)
csv_文件名 = 'deviantart_data.csv'
df.to_csv(csv_文件名,索引=, 编码='utf-8')

# 调用initialize_database函数
初始化数据库()
# 将所有数据插入数据库
将数据插入数据库(所有数据)

if __名字__ == “__主要的__”:
主()
  • 对于 CSV 存储,该脚本使用 Pandas 库从提取的数据创建 DataFrame df,然后将 DataFrame 写入 CSV 文件 deviantart_data.csv 使用 to_csv 方法。
  • 对于 SQLite 数据库存储,该脚本使用以下命令初始化数据库 initialize_database 函数并将提取的数据插入到 deviantart_data 表使用 insert_data_into_database 功能。数据库文件 deviantart_data.db 每次运行脚本时都会创建和更新,它包括每条记录的 ID 和图像 URL 列。

deviantart_data.csv 预习:

deviantart_data.csv 预览

deviantart_data.db 预习:

deviantart_data.db 预览

从抓取的图像 URL 下载图像

本节将指导您完成使用 Python 从 DeviantArt 抓取的 URL 下载图像、处理潜在的下载错误以及有效组织下载的图像的过程。

使用Python下载图片

Python 提供了各种用于处理 HTTP 请求和下载文件的库。一种常见且用户友好的选择是 requests 图书馆。以下是如何使用它下载图像的基本示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
进口 要求

DEF 下载图片(网址、保存路径):
尝试:
响应 = requests.get(url, 流=)
响应.raise_for_status()

- 打开(保存路径, 'wb') as 文件:
in 响应.iter_content(块大小=8192):
文件.write(块)

打印(f"图片下载成功: {保存路径}")

requests.exceptions.RequestException as e:
打印(f“从以下位置下载图像时出错 {网址}: {e}")

# 用法示例
图片网址 = “https://example.com/image.jpg”
下载路径= “下载的图像/image.jpg”
下载图像(图像网址,下载路径)

这个功能, download_image,采用图像 URL 和保存图像的本地路径。然后它使用 requests 库来下载图像。

组织下载的图像

将下载的图像组织到结构化目录中可以大大简化进一步的处理。考虑根据类别、关键字或任何其他相关标准创建文件夹结构。以下是如何组织下载的图像的简单示例:

1
2
3
4
5
6
7
下载的图像/
|——奇幻/
| |-- 图片1.jpg
| |-- 图片2.jpg
| - 科幻/
| |-- 图片3.jpg
| |-- 图片4.jpg

这种组织可以通过调整来实现 download_path ,在 download_image 基于与每个图像关联的类别或任何相关信息的函数。

通过这些步骤,您不仅可以从 DeviantArt 下载图像,还可以有效地处理错误并组织下载的图像以便于访问和进一步分析。

总结

我希望现在你可以使用 Python 和 Crawlbase 轻松地从 DeviantArt 下载和抓取图像 Crawling API。此外,通过使用 Python 和查看 DeviantArt 搜索页面,您还学会了如何有效地提取和组织图片链接。

无论您是要收藏数字艺术还是试图了解 DeviantArt 上的内容,负责任地抓取网络都非常重要。始终遵守平台规则并遵守道德。

现在您已经掌握了这些有用的技能,您可以开始自己抓取网络了。如果您遇到任何问题,可以询问 Crawlbase支持团队 寻求帮助。

常见问题

虽然网络抓取本身通常是合法的,但必须在 DeviantArt 服务条款规定的范围内进行导航。 DeviantArt Scraper 的运营尊重道德抓取实践。始终审查并遵守 DeviantArt 的指南,以确保负责任且合法的使用。

问:抓取 DeviantArt 时如何处理分页?

在 DeviantArt 中管理分页涉及为搜索结果中的各个页面构建 URL。该指南说明了如何调整多个页面的 API 请求,从而实现 DeviantArt 搜索页面的顺利遍历。这确保了全面的数据检索以进行彻底的探索。

问:我可以自定义从 DeviantArt 抓取的数据吗?

绝对地。该指南提供了有关检查 DeviantArt 搜索页面的 HTML 结构和利用 CSS 选择器的见解。这种自定义使您能够定制数据提取,使您能够专注于图像 URL 等特定信息。调整抓取逻辑以满足您的个人需求和偏好。

问:以 CSV 和 SQLite 格式存储数据有什么好处?

以 CSV 和 SQLite 格式存储数据提供了一种通用的方法。 CSV 有助于轻松地进行数据共享和分析,使其可供各种应用程序使用。另一方面,SQLite 提供了轻量级数据库解决方案,确保 Python 项目中高效的数据检索和管理。这种双格式方法可满足不同的用例和偏好。