python之多进程和多协成爬虫
——在学完多线程爬虫之后,我们多多少少了解了一些关于提升爬虫速度的方法。接下来我们学习的另外一种方法多进程爬虫。之前我学习的多线程方法来说是基于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之多进程和多协成爬虫相关推荐
- Python进程、线程、协成
什么是线程? 程序执行的最小单位 线程是进程中的一个实体,是被系统独立调度和分派的基本单位 线程的创建 threading.Thread(target = 变量名) 线程的资源竞争问题 线程是可以资源 ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- python协成_Python协程技术的演进
引言 1.1. 存储器山 存储器山是 Randal Bryant 在<深入理解计算机系统>一书中提出的概念. 基于成本.效率的考量,计算机存储器被设计成多级金字塔结构,塔顶是速度最快.成本 ...
- python 异步协程爬虫-半次元图片
python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...
- python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程
进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...
- 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行
[2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...
- python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫
异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...
- Python使用多进程提高网络爬虫的爬取速度
多线程技术并不能充分利用硬件资源和大幅度提高系统吞吐量,类似需求应使用多进程编程技术满足. 以爬取中国工程院院士简介和照片为例,参考代码如下,请自行分析目标网页结构并与参考代码进行比对.另外需要注意, ...
- python 协程爬虫_Python爬虫进阶教程(二):线程、协程
简介 线程 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID.程序计数器.寄存器集合和堆栈共同组成.线程的引入减小了程序并发执行时的开销,提高了操作系统的并发 ...
- python协程池爬虫_Python之协程爬虫 小说网协程爬虫案例
在Gevent协程的使用中我们已经学会简单的使用协程,这篇文章我们通过协程爬虫来测试一下具体的效果.Gevent遇到IO阻塞时会自动切换任务: from gevent import monkey mo ...
最新文章
- Python之迭代器,生成器与装饰器
- 偏依赖图(Partial Dependence Plots)是什么?排列重要性(Permutaion Importance)是什么?如何解读?有什么意义?
- iOS -- iOS11新特性,如何适配iOS11
- 在域环境下搭建samba服务器
- centos配置ftp
- 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用
- 【前端】Github Pages 与域名关联简明教程
- linux接收数据并保存到环形缓冲区,自定义print函数缓存打印数据到环形缓冲区...
- 微软拿 480 亿买 GitHub 就为了拥抱开源?
- 机器人仿真技术学习笔记(一)
- 51nod1394 差和问题 值域线段树
- 淘宝新开店铺没有营业执照怎么办
- 用html计算长方形的面积公式,长方形面积公式是什么
- 分享11个网页游戏和9个黑客源码,总有一款适合你
- 关于 IE 浏览器打开时速度过慢的问题
- 基于OAS设计可扩展OpenAPI
- *p++、*(p++)、(*p)++、*++p、++*p的区别
- HeadFirstC笔记_6 数据结构与动态存储:牵线搭桥
- bzoj2115 线性基 异或
- Qt 开发ARM64程序
热门文章
- 找不到引道分区_惠普笔记本单固态分区教程
- nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- 物理专业计算机二级学科,学科门类二级类0702物理学类.doc
- 回收测试JInternalFrame
- 【数字电路抢救】2 逻辑函数的代数化简 3逻辑表达式的化简
- 感觉丧的时候,读一读曾国藩
- 2022常见软件测试面试题
- 结构化数据和非结构化数据、半结构化数据的区别
- 找零钱问题(C语言实现)——贪心算法应用(1)
- 4g内存php一般开多少个进程,Linux_4G内存服务器epoll并发量最大能达到多少?,按照题主的意思 是根据内存去 - phpStudy...