type
status
date
slug
summary
tags
category
icon
password
上次编辑时间
May 15, 2024 04:50 AM
创建时间
Apr 7, 2024 02:23 PM
参考链接
首先给出目标网站: https://wallhaven.cc/

1.欣赏网站

notion image

notion image

notion image

2.查找网站是否有规律

图片规律

https://wallhaven.cc/w/ex136k 为例,查找src图片链接,或直接图片右键在新标签页中打开图片,查看图片链接
notion image
这里我们发现图片直链与图片的预览网址有些许关联,下面展示链接并且多找几张图片查看
接下来查找是否有规律
以第一条为例:
对于 https://wallhaven.cc/w/ex136k
  • ex136k 可能是图片的唯一ID
  • 且每一个链接都是最后面的ID会变
对于 https://w.wallhaven.cc/full/ex/wallhaven-ex136k.jpg
  • https://w.wallhaven.cc 似乎不会改变
  • /full 应该代表图片是原图
  • /ex/wallhaven-ex136k.jpg
    • 这一部分/ex 与图片ID:ex136k 前两个字符匹配;
    • /wallhaven- 这一部分也是不会改变的
  • .jpg 代表图片的格式,但是对于示例的第四条发现,直链后缀会是 png 格式的链接,所以后面需要格外处理

获取分页数据规律

打开 控制台→网络→清空已有的网络请求→滚动页面让其获取分页数据
可以发现有一个 /toplist?page=6/toplist?page=7
notion image

任意点击一个并查看预览,发现响应的是HTML标签(emm不是很好处理🤔)
notion image
回到页面审查,任意审查一张图片
notion image

解决发现的问题

尝试解决部分图片直链是 png 格式的问题
继续查看页面
notion image
发现部分图片右下角会有一个 PNG 标签
点进去查看图片链接,发现确实是PNG格式的图片
审查这个 PNG 标签
notion image
好了,这一个问题解决了,知道怎么判断图片是否是JPG还是PNG 后面可以判断这一个标签内容是否是PNG
 

技术选型

发现的问题:
  • 分页获取的数据不是JSON格式
使用的技术方案为:
  • NodeJS :作为后端
  • axios :作为网络请求的库
  • cheerio : 解析 HTML 元素
  • aria2c : 可以将视频链接以 aria2c 可读文本格式保存为文本

代码解析

1. 类的定义与初始化

这段代码定义了一个 Utils 类,用于处理网页解析和图片下载的相关操作。在类的构造函数中,接受一个包含各种配置选项的对象 options,包括起始页、目标页、爬取类型、父目录等。然后调用 init() 方法进行初始化。

2. 初始化方法

init() 方法是类的初始化方法,它首先调用 getPageHTML() 方法获取网页的 HTML 内容,然后调用 parseHTML() 方法解析 HTML,最后调用 writeImgInfo() 方法将图片信息写入文件。

3. 获取网页 HTML 内容

getPageHTML() 方法使用 axios 发起 HTTP 请求获取网页 HTML 内容。它接受一个页码参数 page,然后通过 Promise 进行异步处理。在请求中,使用了 headers() 方法返回的 headers 对象,该方法用于构造请求的头部信息。
需要注意的是请求的内容可能会返回 429 Too Many RequestsHTTP 协议中,响应状态码429 Too Many Requests 表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”,所以需要使用 try/cache 递归调用getPageHTML 方法,防止脚本中途报错停止。

4. 构造请求头部信息

headers() 方法用于构造 HTTP 请求的头部信息,其中包括了 RefererUser-AgentCookie 等常用的头部信息,以模拟浏览器行为发起请求。

5. 解析 HTML 获取图片信息

parseHTML() 方法使用 cheerio 模块对 HTML 进行解析,并提取出图片的相关信息,包括图片地址、尺寸、页码等,并将这些信息保存在一个数组中返回。还会对图片是否为PNG格式的进行判断和处理

6. 处理图片地址

handleImgUrl() 方法用于处理图片地址,将预览链接转化为原图链接,并根据图片格式添加相应的后缀。

7. 将图片信息写入文件

writeImgInfo() 方法将图片信息按照aria2c特定文本格式写入文件,格式包括图片地址、输出文件名、保存目录等,并在写入完成后判断是否是最后一页,如果不是则继续进行下一页的操作。

8. 自定义延迟函数

sleep() 方法用于实现自定义的异步延迟函数,可用于控制请求的频率,避免请求过于频繁。

下载图片