——在学完多线程爬虫之后,我们多多少少了解了一些关于提升爬虫速度的方法。接下来我们学习的另外一种方法多进程爬虫。之前我学习的多线程方法来说是基于GIL虽然说速度有了明显的提升,但是对CPU的资源利用没有充分;然而,多进程是利用CPU核数进行的进行的操作,这需要用python中的muiltprocessing这个库。

1、使用mulitProcessing的多进程爬虫
++++一般情况下,我们写这种多进程的爬虫时,需要先获取相应的电脑的CPU核心数,以防止使用核心过多导致电脑死机。

代码如下:

from multiprocessing import Process,Queue
import requests
import timelink_list = []
with open('url.txt','r') as file:file_list = file.readlines()for each in file_list:link = each.split('\t')[1]link = link.replace('\n','')link_list.append(link)start = time.time()
class MyProcess(Process):def __init__(self,q):Process.__init__(self)self.q = qdef run(self):print('Starting ',self.pid)while not self.q.empty():crawler(self.q)print('Exiting ',self.pid)
def crawler(q):url = q.get(timeout=2)try:r = requests.get(url,timeout=20)print(q.qsize(),r.status_code,url)except Exception as e:print(q.qsize(),url,'Error: ',e)if __name__ == '__main__':ProcessName = ["Process-1","Process-2","Process-3"]workQueue = Queue(300)for url  in link_list:workQueue.put(url)for i in range(4):p = MyProcess(workQueue)p.daemon = Truep.start()p.join()end = time.time()print("Process+Queue多线程爬虫总的时间:",end-start)print("Exiting Main Thread!")

*注意:

p.daemon = True

这句代码的意思就是当所有的父进程关闭时,字进程就会被关闭。
2、使用pool+Queue的多进程爬虫
++++当被操作的对象数目不大时,可以利用Process+Queue类的方法来实现这一操作,但是操作对象如果过多,上百个、上千个等等时,手动的限制进程数就太过繁琐,此时可以使用Pool发挥进程池的功效。
++++Pool可以提供指定数量的进程供用户来使用。当有了新的请求提交到pool中,如果池还没有满,就会创建一个新的进程用来执行该请求;但是如果池中的进程已经达到规定的最大值,请求就会继续等待,知道池中的有进程结束才能够创建新的进程。
++++现在我们使用非阻塞的方法和Queue获取网页数据,代码如下:

from multiprocessing import Pool,Manager
import requests
import timelink_list = []
with open('url.txt','r') as file:file_list = file.readlines()for each in file_list:link = each.split('\t')[1]link = link.replace('\n','')link_list.append(link)start = time.time()
def crawler(q,index):Process_id = 'Process-' + str(index)while not q.empty():url = q.get(timeout=2)try:r = requests.get(url,timeout=20)print(Process_id,q.qsize(),r.status_code,url)except Exception as e:print(Process_id,q.qsize(),url,'Error: ',e)if __name__ == '__main__':managers = Manager()workQueue = managers.Queue(300)for url  in link_list:workQueue.put(url)pool = Pool(processes=3)for i in range(4):pool.apply_async(crawler,args=(workQueue,i))pool.close()pool.join()end = time.time()print("Pool+Queue多线程爬虫总的时间:",end-start)print("Exiting Main Thread!")

代码下载地址:点击这里

python之多进程和多协成爬虫相关推荐

  1. Python进程、线程、协成

    什么是线程? 程序执行的最小单位 线程是进程中的一个实体,是被系统独立调度和分派的基本单位 线程的创建 threading.Thread(target = 变量名) 线程的资源竞争问题 线程是可以资源 ...

  2. python中多进程+协程的使用以及为什么要用它

    前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...

  3. python协成_Python协程技术的演进

    引言 1.1. 存储器山 存储器山是 Randal Bryant 在<深入理解计算机系统>一书中提出的概念. 基于成本.效率的考量,计算机存储器被设计成多级金字塔结构,塔顶是速度最快.成本 ...

  4. python 异步协程爬虫-半次元图片

    python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...

  5. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  6. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

    [2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...

  7. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  8. Python使用多进程提高网络爬虫的爬取速度

    多线程技术并不能充分利用硬件资源和大幅度提高系统吞吐量,类似需求应使用多进程编程技术满足. 以爬取中国工程院院士简介和照片为例,参考代码如下,请自行分析目标网页结构并与参考代码进行比对.另外需要注意, ...

  9. python 协程爬虫_Python爬虫进阶教程(二):线程、协程

    简介 线程 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID.程序计数器.寄存器集合和堆栈共同组成.线程的引入减小了程序并发执行时的开销,提高了操作系统的并发 ...

  10. python协程池爬虫_Python之协程爬虫 小说网协程爬虫案例

    在Gevent协程的使用中我们已经学会简单的使用协程,这篇文章我们通过协程爬虫来测试一下具体的效果.Gevent遇到IO阻塞时会自动切换任务: from gevent import monkey mo ...

最新文章

  1. Python之迭代器,生成器与装饰器
  2. 偏依赖图(Partial Dependence Plots)是什么?排列重要性(Permutaion Importance)是什么?如何解读?有什么意义?
  3. iOS -- iOS11新特性,如何适配iOS11
  4. 在域环境下搭建samba服务器
  5. centos配置ftp
  6. 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用
  7. 【前端】Github Pages 与域名关联简明教程
  8. linux接收数据并保存到环形缓冲区,自定义print函数缓存打印数据到环形缓冲区...
  9. 微软拿 480 亿买 GitHub 就为了拥抱开源?
  10. 机器人仿真技术学习笔记(一)
  11. 51nod1394 差和问题 值域线段树
  12. 淘宝新开店铺没有营业执照怎么办
  13. 用html计算长方形的面积公式,长方形面积公式是什么
  14. 分享11个网页游戏和9个黑客源码,总有一款适合你
  15. 关于 IE 浏览器打开时速度过慢的问题
  16. 基于OAS设计可扩展OpenAPI
  17. *p++、*(p++)、(*p)++、*++p、++*p的区别
  18. HeadFirstC笔记_6  数据结构与动态存储:牵线搭桥
  19. bzoj2115 线性基 异或
  20. Qt 开发ARM64程序

热门文章

  1. 找不到引道分区_惠普笔记本单固态分区教程
  2. nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
  3. 物理专业计算机二级学科,学科门类二级类0702物理学类.doc
  4. 回收测试JInternalFrame
  5. 【数字电路抢救】2 逻辑函数的代数化简 3逻辑表达式的化简
  6. 感觉丧的时候,读一读曾国藩
  7. 2022常见软件测试面试题
  8. 结构化数据和非结构化数据、半结构化数据的区别
  9. 找零钱问题(C语言实现)——贪心算法应用(1)
  10. 4g内存php一般开多少个进程,Linux_4G内存服务器epoll并发量最大能达到多少?,按照题主的意思 是根据内存去 - phpStudy...