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生成的哈哈哈哈哈哈😜)
 
到此为止,我写了两个版本的爬虫代码,第一个版本,平均每次爬取完毕 4w 多页的壁纸信息,需用时 24 小时左右。
而第二个版本,只需要10个小时左右
接下来,我会详细介绍我的代码
💡
注意事项:Wallhaven 网站有可能部分地区不能直接访问,请自行使用代理
Wallhaven API 文档地址如下请自行理解查看,不做过多讲解:

准备

  • Wallhaven 账号 (需要登录获取 API KEY)
  • NodeJS Version > 16 环境
  • Git
  • mysql 并能够正常连接

申请 Wallhaven API KEY

获取 API KEY 入口:https://wallhaven.cc/settings/account
将框选位置的内容复制
notion image
 

V1 版本 (用时24小时左右)

拉取 V1 代码

安装依赖

配置环境变量

初始化数据库表

Navicat 查询中执行 init.sql 内容

执行脚本

控制台不会输出什么信息,日志会保存在 fetch_log.txt
接下来就可以去 数据库表中刷新查看内容了
 

V2 版本 (用时10小时左右)

该版本使用到了创建多线程的方式,每一个线程分配一个页数区间,如图:
notion image

特性

  • 使用 worker_threads NodeJS 第三方库创建多线程。
  • 可在程序运行时更改 Wallhaven 代理地址,不用停止程序。
  • 可选使用 HTTP 代理IP请求,减少出现 429503403 等网络请求错误的概率。
  • 随机生成 UserAgent 用于请求,防止出现请求错误的问题。

部分代码解释

拆分页数区间
notion image
 
创建多线程
单个线程
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 代理,并自动切换节点,可以极大减少出现 429503403 等错误的概率。
 
 

问题

如何自定义筛选条件

在 app.js 查找 以下内容
在字符串末拼接上查询参数,更多参数可参考官方文档

如果爬取的信息在 mysql 中重复了怎么办

script 路径下有一个脚本: delete_multer_data.js
执行该脚本即可,可能会有些慢,该脚本未优化。

我想批量筛选并下载图片

script 路径下有一个脚本: write-to-path.js
自行修改sql语句,不会的可以去学
该脚本会将查询到的原图写入一个 txt 文本文件中,保存至项目根目录 output 开头的 txt 文本,每行一个链接。
notion image
然后使用 aria2 工具下载
例如: