python结合多线程爬取英雄联盟皮肤(原理分析)
作者:武亮宇 发布时间:2023-05-31 21:49:37
1.什么是多线程?
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
为什么要使用多线程
线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。
因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性多个线程共享同一个进程的虚拟空间。线程共享的环境包括进程代码段、进程的公有数据等,利用这些共享的数据,线程之间很容易实现通信。
操作系统在创建进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能要高得多。
总结起来,使用多线程编程具有如下几个优点:
进程之间不能共享内存,但线程之间共享内存非常容易。
操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。
Python 语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了 Python 的多线程编程。
2.原理
实现多线程是采用一种并发执行机制 。
并发执行机制原理:简单地说就是把一个处理器划分为若干个短的时间片,每个时间片依次轮流地执行处理各个应用程序,由于一个时间片很短,相对于一个应用程序来说,就好像是处理器在为自己单独服务一样,从而达到多个应用程序在同时进行的效果 。
多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序 。
3.优点
1、使用线程可以把占据时间长的程序中的任务放到后台去处理 。
2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
3、程序的运行速度可能加快 。
4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等 。
5、多线程技术在IOS软件开发中也有举足轻重的作用。
4.缺点
1、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
2、更多的线程需要更多的内存空间。
3、线程可能会给程序带来更多“bug”,因此要小心使用。
4、线程的中止需要考虑其对程序运行的影响。
5、通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
好的废话不多说,我们直接来实战吧
1.进入英雄联盟官网点击游戏资料进入此画面
2.确定爬取的网页是同步加载还是异步加载
1.鼠标右键打开网页源代码
2.ctrl+f打开搜索框
3.在搜索框了输入英雄的名字
没有搜索结果则为异步加载 3.寻找英雄url地址
回到英雄页面鼠标右击打开检查。
在获取的包中找到hero_list.js这个包 英语翻译过来英雄列表.js文件
点击网页上英雄安妮拿回地址再点击其他英雄拿回地址做比较。
安妮:
狂战士:
点击headers拿回resquests url
安妮:https://game.gtimg.cn/images/lol/act/img/js/hero/1.js
狂战士:https://game.gtimg.cn/images/lol/act/img/js/hero/2.js
可以发现变化在最后面 是英雄的id 这样我们有思路了
1.第一次发送请求,拿回所有英雄的id和名字
2.第二次请求,得到英雄皮肤名,英雄手机皮肤url, 英雄电脑皮肤url
3.请求得到 手机图片二进制数据, 电脑图片二进制数据
4.保存电脑版英雄联盟图片,保存手机版英雄联盟图片
5.多进程实现保存数据
是时候写一点代码了。。。嘿嘿
起始地址弄成全局变量
观察网页
1第一次请求,我们要拿回这两个数据。可以看出preview里面是个json数据,导入jsonpath库进行提取数据。
2第二次请求,得到英雄皮肤名,英雄手机皮肤url, 英雄电脑皮肤url
3 请求得到 手机图片二进制数据, 电脑图片二进制数据 利用try-except语句防止报错停止代码运行。
4.保存电脑版英雄联盟图片,保存手机版英雄联盟图片,利用try-except语句防止报错停止代码运行。
5.多进程实现保存数据 导包:import threading
threading.Thread(target=self.函数名, args=(用到的参数)) 写法
代码全解:
最后在发一个守护线程防止报错的模板,大家好好参考。
from threading import Thread
from queue import Queue
class Love(object):
def init(self):
# 队列容量,队列创建 ,[], {}
self.q = Queue()
def parse_data(self):
"""功能:往队列添加数据"""
data = "第{}天----我爱你----"
for i in range(1, 100):
# 将数据放入队列,put的时候计数+1,get不会-1,get需要和task_done一起使用才会-1
self.q.put(data.format(i))
# 等待task_done()返回的信号量和put进去的数量一直才会往下执行
# join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一
# 直等待其他的子线程执行结束之后,主线程在终止,否则主线程会杀死子线程
# 主线程结束后子线程无论是否执行完毕都将结束,因此join的作用就显现出来了
self.q.join()
def func2(self):
"""功能:从队列中获取数据"""
while True:
# 循环从队列中获取, 取出数据,队列为空的时候会等待
result = self.q.get()
print(result)
# 使队列计数-1
self.q.task_done()
def run(self):
# 进程创建
"""进程:功能:往队列中添加数据"""
m1 = Thread(target=self.parse_data)
"""进程:功能:从队列里面获取数据"""
m2 = Thread(target=self.func2)
m1.start()
# 将m2设置成守护进程 因为m2一直是死循环,设置成守护进程之后当主程序代码运行完毕,m2就会结束,不会成为僵尸进程
# 即只在需要的时候才启动,完成任务后就自动结束
m2.daemon = True
m2.start()
# 队列中维持了一个计数,计数不为0时候让主线程阻塞等待,队列计数为0的时候才会继续往后执行
m1.join()
if name == ‘main':
love = Love()
love.run()
祝大家学习python顺利
来源:https://blog.csdn.net/weixin_54733110/article/details/117294289
猜你喜欢
- 我们知道Python的内置dictionary数据类型是无序的,通过key来获取对应的value。可是有时我们需要对dictionary中
- 最好的方法: 先说一下基本的东西: <%@ codepage=65001%>UTF-8 <%@&nbs
- 每月需更新某个excel表格,进行两项操作,且不覆盖原有的sheet:1. 在原来的excel表中新增sheet2. 往原有的excel表中
- 用python读取视频有两种主要方法,大家可依据自己的需求进行使用。方法一:使用imageio库,没有安装的可用pip安装或自己下载,安装好
- 1、Introduction之前写过2篇文章,分别是:Mysql主从同步的原理 Myql主从同步实战 基于此,我们再实
- 前言Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypt
- 前言:Event在python线程间同步是一种常用的方法,本博客以生产者线程和工作者线程为例说明Event在线程间进行10次同步的应用。im
- 这篇文章用来整理一下入门深度学习过程中接触到的四种激活函数,下面会从公式、代码以及图像三个方面介绍这几种激活函数,首先来明确一下是哪四种:S
- 有时,希望除去某些记录或更改它们的内容。DELETE 和 UPDATE 语句令我们能做到这一点。用update修改记录UPDATE tbl_
- 本文实例为大家分享了python实现网页自动签到功能的具体代码,供大家参考,具体内容如下第1步、环境准备(用的chrome浏览器)1.安装s
- 本文实例讲述了Python学习笔记之字符串和字符串方法。分享给大家供大家参考,具体如下:字符串在 python 中,字符串的变量类型显示为
- 前言:在转换操作中,我们执行各种操作,例如更改系列的数据类型,将系列更改为列表等。为了执行转换操作,我们有各种有助于转换的功能,例如.ast
- XMLHttpRequest的兼容代码功能结构上大体没有什么变动主要处理了这么几条:1.不同浏览器的创建方式2.事件大小写问题(ie7的XM
- 概要:要实现点赞功能,需要实现的有:谁进行的点赞、什么时候进行点赞、点赞的对象是谁、每一个对象的点赞数量是多少、点赞过后还需要能够取消点赞,
- 本文详细罗列并说明了Python的标准库与第三方库如下,供对此有需要的朋友进行参考:Tkinter———— Python默认的图形界面接口。
- 比较两个时间序列在图形上是否相似,可以通过以下方法:1.可视化比较:将两个时间序列绘制在同一张图上,并使用相同的比例和轴标签进行比较。可以观
- 方法一:<script language="JavaScript"> <!--
- 程序测试是展现BUG存在的有效方式,但令人绝望的是它不足以展现其缺位。——艾兹格·迪杰斯特拉(Edsger W. Dijkstra)算法审查
- 本文实例讲述了python解析多层json操作。分享给大家供大家参考,具体如下:原始文件内容:{ "MaskPolyg
- 练习一:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?a = [&quo