写在前面
写这篇文章纯属是因为有一个老哥一直在爬我的 随机二次元壁纸 API,从昨天早上十点多爬到了现在。可是我这里面也就 334 张图啊,应该早就爬完了。但是这位老哥似乎没有停的意思,难道不想漏掉任何一张图?这大概就是二次元吧。
不过我的水笔之魂觉醒了,我发现了一个值得研究的问题。爬取随机接口的数据时一个大的问题是我们事先可能不知道接口的数据总量,但我们又想抓取到大部分甚至全部的数据。这就导致我们难以确定爬取数量的目标值。爬取过程中发现了大量重复后到底是我们的运气太差还是真的快爬完了呢?
如何解决这类问题呢?那就要用到我早就还给老师的《概率论与数理统计》了。
实验和计算
我以 随机二次元壁纸 API 为实验对象,刷新 16 次得到了 16 个图片编号(其实就是服务器上从 0 开始的顺序排列的文件名)。
324, 223, 250, 18, 152, 75, 182, 192, 166, 46, 177, 1, 49, 92, 57, 183
求一下样本均值、样本方差和样本标准差:
$$
\begin{align}
\overline{X}&=136.6875 \\
S^2&=18683.47265625 \\
S&=136.6875
\end{align}
$$
然后我陷入了沉思,这三个统计量该怎么用呢?貌似有一个玩意叫做「区间估计」,我去翻了翻书,虽然没看懂几个字但是找到了例题,现在可以照葫芦画瓢了。
根据中心极限定理,对于一个未知的分布只要样本空间足够大就可以近似成正态分布。那么问题就变成了一个随机变量$X \sim N(\mu, \sigma^2) $,在未知$\sigma^2$的情况下去估计$\mu$,置信度就设为 $95\%$ 吧。
$$
\begin{align}
& 查表得 t_{0.025}(n-1)=t_{0.025}(15)=1.753 \\
& 所以 \mu 的置信度为 95\% 的置信区间为 \\
& \left ( \overline{X} \pm \frac{S}{\sqrt{16}} \right ) 即 \left ( 76.784203125, 196.590796875 \right )
\end{align}
$$
我在设计接口的时候随机数是均匀地取得的,也就是$X \sim U(a, b)$。
$$
\begin{align}
& 因为\frac{a+b}{2} 在置信度为 95\% 下的置信的区间为 \left ( 76.784203125, 196.590796875 \right )。\\
& 所以可以估计 153.56840625 < a+b < 393.18159374 \\
& 由于服务器在给图片命名时是从 0 开始的,所以 a = 0。
\end{align}
$$
最终我们可以猜测 随机二次元壁纸 API 中最多有 395 张图,最少有 155 张图,这种猜测的可信度为 $95\%$。实际上 随机二次元壁纸 API 中有 334 张图。
用法
说了这么一大堆有什么用呢?实际上就是可以告诉我们当爬取 随机二次元壁纸 API 时设置一个通常可信的停止条件或者发现自己的运气可能很差。
比如在不重复的数据的数量达到 395 的时候立即停止爬取或者 350 时停止爬取,因为此时你已经大概率得到了大部分的数据。
或是如果你发现你的重复率长期稳定但是非重复的数据的数据量却十分接近 155 的时候去洗把脸重启一下爬虫以确认是不是脸黑[手动狗头]。
写在最后
本文其实并没有什么卵用。因为《只是好看的纸片人即使是开一年爬虫我也喜欢》。