分享

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

 蓝天cipvfv9gyo 2017-10-08

首先我们来了解下python中的进程,线程以及协程!

从计算机硬件角度:

计算机的核心是CPU,承担了所有的计算任务。

一个CPU,在一个时间切片里只能运行一个程序。

从操作系统的角度:

进程和线程,都是一种CPU的执行单元。

进程:表示一个程序的上下文执行活动(打开、执行、保存...)

线程:进程执行程序时候的最小调度单位(执行a,执行b...)

一个程序至少有一个进程,一个进程至少有一个线程。

并行 和 并发:

并行:多个CPU核心,不同的程序就分配给不同的CPU来运行。可以让多个程序同时执行。

cpu1 -------------

cpu2 -------------

cpu3 -------------

cpu4 -------------

并发:单个CPU核心,在一个时间切片里一次只能运行一个程序,如果需要运行多个程序,则串行执行。

cpu1 ---- ----

cpu1 ---- ----

多进程/多线程:

表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。

进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。

进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。

线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。

共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入'互斥锁'。

一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。

互斥锁:一种安全有序的让多个线程访问内存空间的机制。

Python的多线程:

GIL 全局解释器锁:线程的执行权限,在Python的进程里只有一个GIL。

一个线程需要执行任务,必须获取GIL。

好处:直接杜绝了多个线程访问内存空间的安全问题。

坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。

但是,在I/O阻塞的时候,解释器会释放GIL。

所以:

多进程:密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。 multiprocessing

缺陷:多个进程之间通信成本高,切换开销大。

多线程:密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。

threading.Thread、multiprocessing.dummy

缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。

协程:又称微线程,在单线程上执行多个任务,用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。genvent,monkey.patchall

多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的。

缺陷:单线程执行,处理密集CPU和本地磁盘IO的时候,性能较低。处理网络I/O性能还是比较高.

下面以这个网站为例,采用三种方式爬取。爬取前250名的电影。。

https://movie.douban.com/top250?start=0

通过分析网页发现第2页的url start=25,第3页的url start=50,第3页的start=75。因此可以得出这个网站每一页的数局是通过递增start这个参数获取的。

一般不看第一页的数据,第一页的没有参考价值。

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

这次我们主要爬取,电影名字跟评分。只是使用不同方式去对比下不同点,所以数据方面就不过多提取或者保存。只是简单的将其爬取下打印出来看看。

第一:采用多进程 , multiprocessing 模块。 当然这个耗时更网络好坏有关。在全部要请求都正常的情况下耗时15s多。

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

代码还是自己敲吧

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

采用多线程时,耗时10.4s

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

采用协程爬取,耗时15S,

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

月薪25k的爬虫工程师带你从零基础分分钟爬取一个网站!有些难度

用了多进程,多线程,协程,实现的代码都一样,没有测试出明显的那个好!都不分上下,可能跟网络,或者服务器配置有关。

但理论上来说线程,协程在I/O密集的操作性能是要高于进程的。

确实有点难度,不会的小伙伴还需努力,谢谢阅读!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多