从零开始写一只爬虫 · 提速外挂

据我观察,在那个招聘网站上注册的公司大概有十万家。如果要是让前面那只虫子一个公司一个公司进行爬取的话,咱就按照 2 秒钟一个公司吧,20W 秒……55 小时。

咱们开多线程玩吧!

Python 的多线程也是蛮神奇的:和 Java 的多线程不同,Python 的多线程不需要继承什么东西、实现什么东西,不需要写特定的方法和类。真的是 “一句话实现多线程”。

简单暴力是吧?

线程安全

然而我们不得不考虑一个问题:线程安全,也就是同步啊什么的。

你看啊,根据我们以前的代码,如果队列不空,就取出队头,进行操作。那好,队列中现在只有一个元素,两个线程跑并发,同时发现了队列不空,先后取队头——瞬间感觉有什么不对了吧?

所以呢,我们只能对队列进行加锁,保证每一次只有一个线程来操作队列。

于是我们的代码长度再次加长了:

我不知道这样写会不会发生 “读-写” 或者 “写-写” 死锁或者异常。但是就我的测试来看,好象是没有问题的。

(因为到现在还没有 “动态地向队列里面添加 url”)

实测结果

加入多线程后,这个可怜的招聘网站能在两个小时之内被我们爬取完毕。

爬虫的CPU、内存和网络消耗

但是!!Python 的多线程很诡异!不是你开几个线程,它就给你跑几个线程的。不像 Java 那样能把四个 CPU 使用率都跑到 100%。也就是说,Python 在这一点上输得很厉害。这个可怜的招聘网站可以用 Java 拿 200 个线程来刷,大约半个小时就能全部跑下来了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注