type
status
date
slug
summary
tags
category
icon
password
上次编辑时间
May 15, 2024 04:48 AM
创建时间
Apr 26, 2024 01:23 PM
参考链接
Node.js爬虫技术的应用范围非常广泛,而Wallhaven作为一个壁纸分享平台,提供了大量高质量的壁纸资源,因此将Node.js爬虫与Wallhaven结合起来,可以帮助我们实现自动化地获取、管理和存储壁纸信息的功能。本文将带领读者从零开始,逐步学习如何使用Node.js编写爬虫程序,通过API方式获取Wallhaven的壁纸信息,并将其存储到MySQL数据库中。无论是想要学习爬虫技术,还是希望打造一个个性化的壁纸管理系统,这篇文章都将为您提供宝贵的指导和实践经验。让我们一起踏上这段Node.js爬虫之旅,探索数据的海洋,开启编程与实用的交织之旅!(GPT生成的哈哈哈哈哈哈😜)
准备申请 Wallhaven API KEYV1 版本 (用时24小时左右)拉取 V1 代码安装依赖配置环境变量初始化数据库表执行脚本V2 版本 (用时10小时左右)特性部分代码解释使用提高爬取速度设置web代理使用HTTP代理问题如何自定义筛选条件如果爬取的信息在 mysql 中重复了怎么办我想批量筛选并下载图片
到此为止,我写了两个版本的爬虫代码,第一个版本,平均每次爬取完毕 4w 多页的壁纸信息,需用时 24 小时左右。
而第二个版本,只需要10个小时左右
接下来,我会详细介绍我的代码
注意事项:Wallhaven 网站有可能部分地区不能直接访问,请自行使用代理
Wallhaven API 文档地址如下请自行理解查看,不做过多讲解:
准备
- Wallhaven 账号 (需要登录获取 API KEY)
- NodeJS Version > 16 环境
- Git
- mysql 并能够正常连接
申请 Wallhaven API KEY
获取 API KEY 入口:https://wallhaven.cc/settings/account。
将框选位置的内容复制

V1 版本 (用时24小时左右)
拉取 V1 代码
安装依赖
配置环境变量
初始化数据库表
在 Navicat 查询中执行
init.sql
内容执行脚本
控制台不会输出什么信息,日志会保存在
fetch_log.txt
中接下来就可以去 数据库表中刷新查看内容了
V2 版本 (用时10小时左右)
该版本使用到了创建多线程的方式,每一个线程分配一个页数区间,如图:

特性
- 使用 worker_threads NodeJS 第三方库创建多线程。
- 可在程序运行时更改 Wallhaven 代理地址,不用停止程序。
- 可选使用 HTTP 代理IP请求,减少出现
429
,503
,403
等网络请求错误的概率。
- 随机生成 UserAgent 用于请求,防止出现请求错误的问题。
部分代码解释
拆分页数区间

创建多线程
单个线程
fetchDataAndSaveToDB 方法
通过 try/catch 将所有网络请求错误捕获,并重新发请求。
使用
clone 仓库
配置环境变量
将
.env.simple
重命名为 .env
MYSQL_HOST
: 必填,MySQL 主机地址
MYSQL_USER
: 必填,MySQL 用户名
MYSQL_PASSWORD
: 必填,MySQL 密码
MYSQL_DATABASE
: 必填,MySQL 数据库名
MYSQL_PORT
: 必填,MySQL 端口号
START
: 必填,开始时间
END
: 可选,结束页数,设置需要爬取到的最后一页
IS_SPIDER
: 可选,是否进行爬取
HTTP_PROXY
: 可选,HTTP 代理
API_KEY
: 必填,Wallhaven API 密钥
运行
创建数据库
运行脚本
提高爬取速度
设置web代理
当前版本使用多线程方式进行爬取,但受网络限制,过多的同时请求可能导致出现
Too Many Requests (429)
错误。为了解决这个问题,需要自行配置反向代理。请修改
utils/domains.json
文件。该文件每隔1分钟自动读取一次,如果持续请求错误,请适当修改该数组。由于会随机选择数组中的域名进行请求,所以可以将同一个域名设置多次,以增加其请求权重。使用HTTP代理
如果是在本地环境进行爬取,可以设置
HTTP_PROXY
环境变量。在这里,我使用的是 clash verge rev
。然而,我查看日志时发现
clash verge rev
自动选择的节点并不会经常变化,可能一直都是一个节点,负载均衡也同样会一直使用一个节点,容易导致出现 Too Many Requests (429)
响应。为了解决这个问题,我的建议是使用 clash verge rev
的外部控制接口 ip:port
,通过接口的方式切换节点。请修改
change-proxy.js
文件,设置 clash_api
为你自己的接口地址,以及 proxie
为你希望使用的节点组名称。如有特殊符号,可直接打开订阅文件复制。完成以上修改后,在命令行中执行以下命令以自动切换节点:
可以设置切换节点的频率时间,单位为毫秒。可随着线程数的增加而加快频率。
我尝试开启 16 线程数,设置 1000 毫秒为佳
通过设置
HTTP_PROXY
代理,并自动切换节点,可以极大减少出现 429
, 503
, 403
等错误的概率。问题
如何自定义筛选条件
在 app.js 查找 以下内容
在字符串末拼接上查询参数,更多参数可参考官方文档
如果爬取的信息在 mysql 中重复了怎么办
在
script
路径下有一个脚本: delete_multer_data.js
执行该脚本即可,可能会有些慢,该脚本未优化。
我想批量筛选并下载图片
在
script
路径下有一个脚本: write-to-path.js
自行修改
sql
语句,不会的可以去学该脚本会将查询到的原图写入一个 txt 文本文件中,保存至项目根目录 output 开头的 txt 文本,每行一个链接。

然后使用 aria2 工具下载
例如: