一个简单的爬虫

0x01 初衷

最近准备开始写一些通用的自动化工具,以前也写过一些自动化的东西,不过都是用胶水把一些现成的工具粘连起来而已。自己开始写工具并不只是造轮子,我希望把尽自己最大的努力,每一个模块都做到最细致,规则做到最好,所以这个project会持续很长的时间,而且有可能会重构很多次。

0x02 设计

这个爬虫的作用是从一个网页作为开始,爬取相关联的网页。需要注意的有几个点,一是从html中获取链接,使用有很多种方法都可以形成链接的效果,获取链接同样有很多解决方案。二是多线程问题,可以使用简单的线程池,重点在于多线程下的同步和互斥的问题。我在生产者消费者问题的Python实现中说到过,其实链接队列就是这个模型,解析模块不停生产链接,插入queue,request模块不停从queue中获取链接,然后将html交给解析模块。解决方法可以看这篇文章。三是链接去重问题,最差的时间复杂度是O(n),如果链接不多,内存足够,时间复杂度可以到O(1),但是怎么在大数量级的情况下快速判断一个链接是否重复,是一个难题,但是也有现成的解决方案。另一个问题是具体的规则,同一个页面,不同的锚点可以被优化为只爬取一次。

以上的三个问题,每个问题都可以作为单独一个project深入研究下去,但是那就是software engineer的范畴了。

0x03 简单的设计

我不喜欢啥都不说,虽然talk is cheap,show me the code。但是把要点说出来,更容易让初学者把握。我写了一个简单的实现,见我的github