oynix

于无声处听惊雷,于无色处见繁花

极简爬虫ons.ooo

偶然发现了几个都是很好看的网站,这是其中之一,https://ons.ooo/,临睡起意,写了几个简单的脚本,把上面的图片都抓了下来,一共有16万多张,大概有23个G。

1. 简介

爬虫,一般都是用Python,用Node,或者用Go,为了省事,就直接写了几个shell脚本,也幸亏这个网站的结构是传统的分页设计,要是动态加载的那就没得玩了。

目前一共273页,每页有24个item,每个item点进去就是一个组图,组图里面是完整的,没有分页,组图里图片数量不等,少的十几张,多的几十张到近百张,这便是网站的整体结构设计。

2. 思路

最简单的想法,就是模拟人真实的浏览,遍历每一页,再遍历每一页上的每一个item,进入item之后,再遍历每一张图片,下载到本地,这也是我最开始的想法。

这种方案有一个明显的弊端,会产生很多重复的请求。比如出错重试时、其他人下载时、调试时,等等,都会从头走一遍这个流程。简单说,我们的目的就是为了获取图片的URL,然后下载到本地,而这个URL是不变的,所以对于不变的量,获取一次就可以了,超过一次就是浪费流量。

为了避免重复获取,稍微调整了一下思路,第一步先将所有图片的URL存储到本地,第二步将URL对应的图片下载到本地。第一步很快而且出错概率低,而下载图片出错概率较高,如连接超时、请求中断,等等。

3. 通道并发

如果用单个进程去跑,时间长的有些感人。单拿获取所有图片URL来说,请求一个item大概需要3秒左右,每页有24个item,一共有273页,将近20万秒,大概5个小时,下载的话会更久

1
total = 3 * 24 * 273 = 19656s

为了提速节省时间,使用了多进程并发,通过通道来控制,使用20个进程的情况下,拿到这16万张图的URL,需要17分钟上下,具体还要看网络情况,相比之下,这是量级的飞跃。如果机器允许,还可以进一步增加进程的数量。不要贪多,这个是进程,切换进程上下文的成本很高,如果并发过多,反倒会变慢。

4. 实现

脚本中,除了字符串操作,唯一用到的命令就是curl了,这大概就是极简中的极简。通过curl拿到html,经过一些列字符串操作,定位到其中的href、src,等等。

工程里有两个html文件,一个是page的,一个是article的,page就是273页中的每一页,分析这个文件就可以得到页面中每一个item的href连接。而article则是item点进去的详情页面,分析这个文件便可以知道,组图中每一张图片的src下载链接。

5. 仓库

Github Spider-onsooo

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2022/05/d12c8c8873b9/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道