Python网络爬虫基础教程 第6章 提升网络爬虫速度

上传人:知** 文档编号:304940552 上传时间:2022-06-06 格式:PPT 页数:67 大小:2.57MB
返回 下载 相关 举报
Python网络爬虫基础教程 第6章 提升网络爬虫速度_第1页
第1页 / 共67页
Python网络爬虫基础教程 第6章 提升网络爬虫速度_第2页
第2页 / 共67页
Python网络爬虫基础教程 第6章 提升网络爬虫速度_第3页
第3页 / 共67页
Python网络爬虫基础教程 第6章 提升网络爬虫速度_第4页
第4页 / 共67页
Python网络爬虫基础教程 第6章 提升网络爬虫速度_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《Python网络爬虫基础教程 第6章 提升网络爬虫速度》由会员分享,可在线阅读,更多相关《Python网络爬虫基础教程 第6章 提升网络爬虫速度(67页珍藏版)》请在金锄头文库上搜索。

1、第6章 提升网络爬虫速度Python网络爬虫基础教程学习目标/Target了解网络爬虫速度的提升方案,能够说出多线程和协程的区别熟悉多线程爬虫的运行流程,能够归纳多线程爬虫的运行流程掌握多线程爬虫的实现技术,能够使用threading和queue模块实现多线程爬虫学习目标/Target熟悉协程爬虫的运行流程,能够归纳协程爬虫的运行流程掌握协程爬虫的实现技术,能够使用asyncio和aiohttp库实现协程爬虫章节概述/ Summary网络环境不稳定导致如下情况出现:当基于单线程的网络爬虫采集网页数据时,如果有一个网页的响应速度慢或者网页一直处于加载状态中,那么网络爬虫需要等待该网页加载完才能继

2、续采集。这显然降低了网络爬虫的运行速度。为解决此问题,提升网络爬虫的运行速度,我们可以在网络爬虫程序中加入多线程、协程等技术,实现同时抓取或解析多个网页的数据。目录/Contents6.16.26.3网络爬虫速度提升方案多线程爬虫协程爬虫6.4实践项目:采集黑马头条的评论列表网网路爬虫速度提升方案路爬虫速度提升方案6.1l了解网络爬虫速度的提升方案,能够说出多线程和协程的区别学学习目目标6.1 网网络爬虫速度提升方案爬虫速度提升方案影响网络爬虫速度的因素主要是网络I/O操作,原因在于网络I/O操作的速度赶不上CPU的处理速度。网络I/O操作可以理解为在网络协议的支持下,一个主机通过网络与其他主

3、机进行数据传输的过程。例如下载图片就是一个网络I/O操作。试想一下,网络爬虫正在执行下载大量图片的任务,它在下载图片的过程中会一直处于阻塞状态。这会导致CPU当前处于空闲状态,直到下载完图片后才能让CPU调度其他任务。这就造成了CPU的浪费。在Python中,提升网络爬虫程序运行速度主要有三种方案,分别是多进程、多线程和协程。6.1 网网络爬虫速度提升方案爬虫速度提升方案多进程多线程协程多线程是以并发(一个时间段内发生若干事情的情况)的方式执行任务的,它不能实现真正地同时执行多个任务,而是通过线程的快速切换提升程序的运行速度。6.1 网网络爬虫速度提升方案爬虫速度提升方案多进程多线程协程多进程

4、可以利用多核CPU,将任务运行到不同的CPU上,实现同时执行多个任务。进程的数量取决于计算机CPU的处理器个数。6.1 网网络爬虫速度提升方案爬虫速度提升方案多进程多线程协程协程是以异步并发的方式执行任务的,由于协程无需系统内核的上下文切换,所以程序在执行过程中可以避免大量的等待时间。6.1 网网络爬虫速度提升方案爬虫速度提升方案6.1 网网络爬虫速度提升方案爬虫速度提升方案网络爬虫如何选择多进程、多线程和协程呢?多进程适用于CPU密集型的代码,如循环处理、大量的密集并行计算等;多线程适用于I/O密集型的代码,如文件处理、网络交互等;协程适用于大量不需要CPU的操作(如网络I/O)。结合多线程

5、、多进程和多协程的特点和用途,一般会选择多线程和协程技术开发网络爬虫程序。6.1 网网络爬虫速度提升方案爬虫速度提升方案多多学一招学一招进程是系统进行资源分配的最小单位,它拥有自己的内存空间,每个进程之间的数据不共享。线程是系统调度执行的最小单位,它不能独立存在,必须依赖进程,每个线程之间的数据可以共享。协程是用户态的轻量级线程,调度由用户控制,拥有自己的寄存器上下文和栈。进程、线程和协程多多线程爬虫程爬虫6.2l熟悉多线程爬虫的运行流程,能够归纳多线程爬虫的运行流程学学习目目标6.2.1 多多线程爬虫流程分析程爬虫流程分析6.2.1 多多线程爬虫流程分析程爬虫流程分析多线程爬虫会将多线程技术

6、运用在抓取网页和解析网页上,它的运行流程图如右所示。6.2.1 多多线程爬虫流程分析程爬虫流程分析(1)构建一个网址队列,用于存放网络爬虫待抓取数据的所有网址。(2)开启多个线程抓取网页。(3)将抓取到的网页源码存储到网页源码队列中。(4)开启多个线程对网页源码队列中的网页数据进行解析。(5)将解析之后的数据存储到网页数据队列中。(6)将网页数据队列中的数据进行存储。多线程爬虫的运行流程如下。l掌握多线程爬虫的实现技术,能够使用threading和queue模块实现多线程爬虫学学习目目标6.2.2 多多线程程爬爬虫虫实现技技术6.2.2 多多线程程爬爬虫虫实现技技术由于线程具有独立运行、状态不

7、可预测、执行顺序随机的特点,当多个线程同时访问同一份资源时,容易导致程序产生不可预料的结果,为此多线程爬虫使用队列管理网址或网页源码。Python中分别提供了支持多线程和队列的内置模块threading和queue。 threading模块模块threading中定义了Thread类,该类专门用于管理线程。若希望在程序中创建一个线程(也称子线程),需要实例化一个Thread类的对象。6.2.2 多多线程程爬爬虫虫实现技技术Thread(group=None, target=None, name=None, args=(), kwargs=, *, daemon=None)lgroup:必须为N

8、one,目前未实现,是为以后的扩展功能保留的预留参数。ltarget:表示子线程的功能函数,用于为子线程分派任务。lname:线程的名称,默认由“Thread-N”形式组成,其中N为十进制数。largs:target指定函数的位置参数。lkwargs:target指定函数的关键字参数。ldaemon:表示是否将线程设为守护线程(在后台运行的一类特殊线程,用于执行特定的任务)6.2.2 多多线程程爬爬虫虫实现技技术class MyThread(Thread): def _init_(self, num): super()._init_() self.name = 线程 + str(num) de

9、f run(self): message = self.name + 运行 print(message)thread_two = MyThread(1) 方式二from threading import Thread# 任务函数def task(): print(线程运行)thread_one = Thread(target=task) 方式一Python创建线程的方式。 Queue模块Python的queue模块中提供了3个表示同步的、线程安全的队列的类,这些队列类包括Queue类、LifoQueue类和PriorityQueue类,队列是线程间常用的交换数据的形式。6.2.2 多多线程程爬

10、爬虫虫实现技技术from queue import Queuequeue_object = Queue(10)for i in range(4): queue_object.put(i)while not queue_object.empty(): print(queue_object.get()lQueue类Queue类表示一个基本的FIFO(First In First Out)队列,即先进先出,也就是说先存入队列中的元素先取出来。 Queue模块6.2.2 多多线程程爬爬虫虫实现技技术from queue import LifoQueuelifo_queue = LifoQueue()f

11、or i in range(4): lifo_queue.put(i)while not lifo_queue.empty(): print(lifo_queue.get()lLifoQueue类LifoQueue类表示一个LIFO(Last in First Out)队列,与栈类似,即后进先出,也就是说后存入队列中的元素先取出来。 Queue模块6.2.2 多多线程程爬爬虫虫实现技技术from queue import PriorityQueueclass Job: def _init_(self, level, description): self.level = level self.d

12、escription = description return def _lt_(self, other): return self.level other.levelpriority_queue = PriorityQueue()priority_queue.put(Job(5, 中级别工作)priority_queue.put(Job(10, 低级别工作)priority_queue.put(Job(1, 重要工作)while not priority_queue.empty(): next_job = priority_queue.get() print(开始工作:, next_job.

13、description)lPriorityQueue类PriorityQueue类表示优先级队列,它按级别顺序取出元素,级别最低的最先取出。6.2.2 多多线程程爬爬虫虫实现技技术为了便于管理队列的元素,Queue类中提供了一些常用方法,这些方法的说明如下表所示。方法说明qsize()返回队列的大小empty()如果队列为空,返回True,否则为Falsefull()如果队列满了,返回True,否则为Falseget()从队头获取并删除第一个元素put()将一个元素放入队列末尾join()阻塞线程,直至队列中所有元素被处理完task_done()在完成一项工作之后,task_done() 函数

14、向任务已经完成的队列发送一个信号get_nowait() 立即取出一个元素,无需额外等待put_nowait() 立即放入一个元素,无需额外等待l掌握多线程爬虫的实现技术,能够使用多线程技术抓取黑马程序员论坛网站数据学学习目目标6.2.3 多多线程程爬爬虫基本示例虫基本示例6.2.3 多多线程程爬爬虫基本示例虫基本示例以黑马程序员论坛网站为例,带领大家一起使用threading和queue模块实现多线程爬虫,并让多线程爬虫采集Python技术交流版块中所有帖子的文章标题、文章作者、文章链接以及发布时间。案案例需求例需求6.2.3 多多线程程爬爬虫基本示例虫基本示例案案例步例步骤案例分析定义He

15、ima类构造请求网址定义数据存储方法定义提取方法定义抓取方法6.2.3 多多线程程爬爬虫基本示例虫基本示例执行代行代码运行代码后,可以看到在代码文件同级目录下添加了一个新的文件thread-heima.json,该文件中存储了Python技术交流版块中所有贴子的文章标题、文章作者、文章链接和发布时间。l熟悉多线程爬虫性能分析,能够计算出多线程爬虫耗时时间学学习目目标6.2.4 多多线程程爬爬虫性能分析虫性能分析6.2.4 多多线程程爬爬虫性能分析虫性能分析if _name_ = _main_: begin_page = int(input(请输入起始页码:) end_page = int(in

16、put(请输入结束页码:) s_time = time.time() heima_forum(begin_page, end_page) e_time = time.time() print(f总用时:e_time-s_time秒)在4.6节中,编写了一个单线程爬虫采集Python+人工智能技术交流版块中所有贴子的文章标题、文章作者、文章链接和发布时间。使用time模块计算此爬虫运行时间。运行代码,在控制台中输入起始页码为1,结束页码为70,按下回车后输出的结果如下。总用时:17.572004795074463秒6.2.4 多多线程程爬爬虫性能分析虫性能分析if _name_ = _main_: s_time = time.time() heima = HeiMa() heima.run() e_time = time.time() print(f总用时:e_time - s_time秒)在6.2.3小节项目的main语句中添加网络爬虫耗时计算的代码。运行代码,在控制台中输入起始页码为1,结束页码为70,按下回车后输出的结果如下。总用时:3.3751931190490723秒6.2.4

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号