type
status
date
slug
summary
tags
category
icon
password
上次编辑时间
May 15, 2024 04:50 AM
创建时间
Apr 7, 2024 02:23 PM
参考链接
1.欣赏网站2.查找网站是否有规律图片规律获取分页数据规律解决发现的问题技术选型代码解析1. 类的定义与初始化2. 初始化方法3. 获取网页 HTML 内容4. 构造请求头部信息5. 解析 HTML 获取图片信息6. 处理图片地址7. 将图片信息写入文件8. 自定义延迟函数下载图片
首先给出目标网站: https://wallhaven.cc/
1.欣赏网站



2.查找网站是否有规律
图片规律

这里我们发现图片直链与图片的预览网址有些许关联,下面展示链接并且多找几张图片查看
接下来查找是否有规律
以第一条为例:
对于
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

任意点击一个并查看预览,发现响应的是HTML标签(emm不是很好处理🤔)

回到页面审查,任意审查一张图片

解决发现的问题
尝试解决部分图片直链是
png
格式的问题继续查看页面

发现部分图片右下角会有一个
PNG
标签点进去查看图片链接,发现确实是
PNG
格式的图片审查这个
PNG
标签
好了,这一个问题解决了,知道怎么判断图片是否是
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 Requests
在HTTP
协议中,响应状态码429 Too Many Requests
表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”,所以需要使用 try/cache
递归调用getPageHTML
方法,防止脚本中途报错停止。4. 构造请求头部信息
headers()
方法用于构造 HTTP
请求的头部信息,其中包括了 Referer
、User-Agent
、Cookie
等常用的头部信息,以模拟浏览器行为发起请求。5. 解析 HTML 获取图片信息
parseHTML()
方法使用 cheerio
模块对 HTML
进行解析,并提取出图片的相关信息,包括图片地址、尺寸、页码等,并将这些信息保存在一个数组中返回。还会对图片是否为PNG
格式的进行判断和处理6. 处理图片地址
handleImgUrl()
方法用于处理图片地址,将预览链接转化为原图链接,并根据图片格式添加相应的后缀。7. 将图片信息写入文件
writeImgInfo()
方法将图片信息按照aria2c
特定文本格式写入文件,格式包括图片地址、输出文件名、保存目录等,并在写入完成后判断是否是最后一页,如果不是则继续进行下一页的操作。8. 自定义延迟函数
sleep()
方法用于实现自定义的异步延迟函数,可用于控制请求的频率,避免请求过于频繁。