Python 3 爬虫-min.png

从这一篇开始,将介绍如何用 Python 3 实现网络爬虫,多任务快速抓取你想要的数据。每一次 HTTP 请求/响应都要经过 TCP 连接、客户端发送请求数据、服务端分多次返回响应数据,这个过程中,客户端的 CPU 在等待网络 I/O 时会阻塞。Python 依序下载是一个主线程依次等待每个网络 I/O 完成,而多线程是多个线程并发(不是并行)等待多个网络 I/O,当一个线程因为等待网络 I/O 而阻塞时,会自动切换到另一个线程继续执行,而不是 CPU 浪费时间阻塞在唯一的线程上。所以 I/O 密集型适合用多线程,像加解密、源代码编译等 CPU 密集型适合用多进程(并行)

Python 3 爬虫-min.png

本文是整个爬虫系列的理论基础,试想一下,如果你的爬虫只能一次下载一张图片,那要爬完整个图片网站的时间会让人抓狂,所以我们需要让程序能够并发,同时请求多张图片资源,因为网络传输时间对于 CPU 来说太漫长了,并发的好处是可以合理的解决 CPU 和网络 I/O 之间的速度鸿沟

作者头像
Madman

算法是设计良好的可计算的过程,它把某个值或某些值作为输入并产生某个值或某些值作为输出。通常设计一个解决问题的算法是很容易的,但如果这个算法很慢,就要重新设计了。因为算法运行的速度取决于它运行的环境以及实现的细节,计算机科学家们倾向于把运行时间以输入的大小来表示,比如O(n)

作者头像
Madman

如果只想查找最小或最大的元素的话(N=1),请使用 min() 或 max() 函数;如果 N 的大小和容器大小接近的时候,通常先排序这个容器然后再使用切片操作会更快点( sorted(items)[:N] 或者是 sorted(items)[-N:] );当要查找的元素个数相对比较小的时候(N大于1,且N小于容器元素数量),使用 heapq 模块中的 nsmallest() 和 nlargest() 函数是最合适的。需要在正确场合使用函数 nlargest() 和 nsmallest() 才能发挥它们的优势 (如果 N 快接近容器大小了,那么使用排序操作会更好些)