Python爬虫从入门到精通:一篇涵盖所有细节的高质量教程

目录

第一部分:Python爬虫基础

1.1 爬虫原理

1.2 Python爬虫常用库

1.3 爬虫实战案例

1.4 注意事项

第二部分:爬虫进阶技巧

2.1 处理动态加载的内容

2.2 登录认证

2.3 分布式爬取

2.4 反爬虫策略

第三部分:爬虫实战项目

3.1 豆瓣电影爬虫

3.2 知乎问答爬虫

3.3 电商网站商品爬虫

第四部分:爬虫注意事项与优化

4.1 反爬虫策略

4.2 异常处理

4.3 性能优化

总结


 

Python爬虫作为数据采集的重要手段,在数据分析、数据挖掘等领域具有广泛的应用。本文将从四个部分详细介绍Python爬虫的原理、常用库、实战案例及注意事项,帮助读者从入门到精通Python爬虫。

b4a9f9216955403c892d98635204f282.jpg

第一部分:Python爬虫基础

1.1 爬虫原理

爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类用户的行为,通过HTTP协议访问网页,获取所需数据。爬虫的主要工作流程如下:

  1. 发送HTTP请求:爬虫向目标网站发送HTTP请求,请求可以包含URL、请求头(Headers)、请求体(Body)等信息。请求头中可以包含User-Agent、Referer等字段,以模拟人类用户的行为。

  2. 接收响应:目标网站服务器处理请求后,返回HTTP响应,响应包括状态码、响应头(Headers)、响应体(Body)等信息。状态码通常用于判断请求是否成功,响应头包含服务器发送的元数据,响应体包含网页内容。

  3. 解析响应:爬虫解析HTTP响应,提取所需数据,如HTML、JSON等。解析HTML时,可以使用BeautifulSoup、lxml等库;解析JSON时,可以使用json等库。

  4. 存储数据:将解析后的数据存储到文件、数据库等。存储数据时,可以选择CSV、JSON、数据库等多种格式。

1.2 Python爬虫常用库

Python有许多用于爬虫的第三方库,以下是一些常用的库:

  1. Requests:用于发送HTTP请求,支持GET、POST等多种请求方法。Requests库的用法非常简单,通过requests.get(url)requests.post(url)即可发送请求。

  2. BeautifulSoup:用于解析HTML和XML文档,提取所需数据。BeautifulSoup可以轻松地解析复杂的HTML结构,并从中提取数据。

  3. lxml:另一个用于解析HTML和XML文档的库,性能较BeautifulSoup更好。lxml支持XPath,可以更方便地定位和提取数据。

  4. Scrapy:一个强大的爬虫框架,支持分布式爬取、数据存储等功能。Scrapy框架提供了丰富的功能,可以方便地构建复杂的爬虫项目。

  5. Selenium:用于模拟浏览器行为,适用于动态加载内容的网站。Selenium可以模拟浏览器的前进、后退、点击等操作,可以爬取那些需要浏览器交互的网站。

1.3 爬虫实战案例

下面通过一个简单的例子来演示如何使用Python爬虫获取百度首页的HTML内容。

import requests
from bs4 import BeautifulSoupurl = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
print(soup.prettify())

在这个例子中,我们首先使用Requests库发送GET请求,获取百度首页的HTML内容。然后,我们使用BeautifulSoup库解析HTML,并打印出解析后的结果。

1.4 注意事项

在进行爬虫时,需要遵守以下原则:

  1. 尊重目标网站的robots.txt文件:在爬取目标网站之前,应该先查看其robots.txt文件,了解哪些内容可以爬取,哪些内容禁止爬取。

  2. 控制访问频率:在爬取目标网站时,应该控制访问频率,避免对目标网站服务器造成过大压力。通常,访问频率控制在每秒不超过5次比较合适。

  3. 遵守目标网站的使用协议:在进行爬虫时,应该遵守目标网站的使用协议,合法合规地获取数据。如果目标网站有API接口,应该优先使用API接口获取数据。

  4. 遵循道德规范:在爬取数据时,应该遵循道德规范,不进行非法操作,不侵犯他人隐私。

通过学习本部分内容,读者应该已经了解了Python爬虫的基本原理、常用库以及注意事项。在接下来的部分,我们将深入学习爬虫的进阶技巧,包括处理动态加载的内容、登录认证、分布式爬取等。

第二部分:爬虫进阶技巧

2.1 处理动态加载的内容

很多网站的内容是通过JavaScript动态加载的,这使得直接使用Requests和BeautifulSoup等库无法获取到完整的网页内容。为了处理这类网站,我们需要使用Selenium或类似的工具。

代码示例:使用Selenium获取动态加载的网页内容

from selenium import webdriver# 创建浏览器对象
driver = webdriver.Chrome()# 访问目标网站
driver.get('https://www.example.com')# 等待动态内容加载完成
driver.implicitly_wait(10)  # 等待10秒# 获取网页内容
html = driver.page_source# 关闭浏览器
driver.quit()# 解析HTML内容
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())

在这个例子中,我们使用Selenium模拟浏览器访问目标网站,并等待动态内容加载完成。然后,我们获取网页的HTML内容,并使用BeautifulSoup解析HTML。

2.2 登录认证

有些网站需要登录才能访问其内容。在这种情况下,我们需要模拟登录过程,以获取登录后的网页内容。

代码示例:使用Selenium进行登录认证

from selenium import webdriver
from selenium.webdriver.common.keys import Keys# 创建浏览器对象
driver = webdriver.Chrome()# 访问登录页面
driver.get('https://www.example.com/login')# 输入用户名和密码
user_input = driver.find_element_by_name('username')
user_input.send_keys('your_username')
password_input = driver.find_element_by_name('password')
password_input.send_keys('your_password')# 提交登录表单
login_button = driver.find_element_by_name('submit')
login_button.click()# 等待登录成功
driver.implicitly_wait(10)# 获取登录后的网页内容
html = driver.page_source# 关闭浏览器
driver.quit()# 解析HTML内容
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())

在这个例子中,我们使用Selenium模拟登录过程,包括输入用户名和密码,并提交登录表单。登录成功后,我们获取登录后的网页内容,并使用BeautifulSoup解析HTML。

2.3 分布式爬取

当目标网站的数据量很大,或者需要爬取多个网站时,单线程爬虫的效率可能会很低。这时,我们可以使用分布式爬取技术,将任务分配给多个线程或进程,以提高爬取效率。

代码示例:使用Scrapy进行分布式爬取

# 创建Scrapy项目
scrapy startproject my_spider# 进入项目目录
cd my_spider# 创建爬虫文件
scrapy genspider my_spider example.com# 修改爬虫文件,添加分布式爬取设置
# 在settings.py文件中添加以下设置
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'
SCHEDULER = 'scrapy.schedulers.Scheduler'
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

在这个例子中,我们使用Scrapy创建了一个分布式爬取项目,并修改了settings.py文件以启用分布式爬取。通过这种方式,我们可以将任务分配给多个爬虫实例,从而提高爬取效率。

2.4 反爬虫策略

在实际应用中,目标网站为了保护自身利益,可能会采取各种反爬虫策略。这些策略旨在防止自动化程序快速、大规模地获取网站数据,从而影响网站的正常运营。反爬虫策略包括但不限于验证码、IP限制、频率限制等。为了应对这些策略,我们需要采取相应的应对措施。

代码示例:使用代理IP和User-Agent池

import requests
from random import choice# 代理IP列表
proxies = ['http://10.10.1.10:3128','http://10.10.1.11:8080',# 更多代理IP
]# User-Agent列表
user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'# 更多User-Agent
]# 随机选择代理IP和User-Agent
proxy = choice(proxies)
user_agent = choice(user_agents)# 发送请求,并设置代理和User-Agent
response = requests.get('https://www.example.com', proxies={'http': proxy}, headers={'User-Agent': user_agent})
print(response.text)

在这个例子中,我们使用了一个代理IP列表和一个User-Agent列表。在每次发送请求时,我们随机选择一个代理IP和一个User-Agent,以减少被目标网站识别为爬虫的风险。

代码示例:处理验证码

对于需要验证码的网站,我们可以使用图像识别技术来自动识别验证码,或者使用某些服务来解决验证码问题。这里提供一个简单的验证码识别示例:

from PIL import Image
import pytesseract# 安装Tesseract OCR引擎
# pip install pytesseract# 打开验证码图片
image = Image.open('captcha.png')# 使用Tesseract OCR引擎识别验证码
captcha_text = pytesseract.image_to_string(image, config='--psm 11 --oem 3 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')print(captcha_text)

在这个例子中,我们使用Pillow库打开验证码图片,并使用Tesseract OCR引擎来识别验证码。为了提高识别准确率,我们可以对验证码进行预处理,例如调整亮度、对比度等。

通过学习本部分内容,读者应该已经了解了Python爬虫的进阶技巧,包括处理动态加载的内容、登录认证、分布式爬取以及应对反爬虫策略。在接下来的部分,我们将通过一些实际项目来应用所学知识,如爬取豆瓣电影、知乎问答等。

第三部分:爬虫实战项目

在这一部分,我们将通过一些具体的实战项目来应用前面所学到的Python爬虫知识。这些项目将帮助读者更好地理解如何在实际场景中使用爬虫技术。

3.1 豆瓣电影爬虫

豆瓣电影是一个流行的电影评分和评论网站。我们可以使用爬虫来获取电影信息、评分和评论。

代码示例:爬取豆瓣电影信息

import requests
from bs4 import BeautifulSoup# 豆瓣电影首页URL
url = 'https://movie.douban.com/'# 发送请求
response = requests.get(url)# 解析响应
soup = BeautifulSoup(response.text, 'lxml')# 获取电影列表
movies = soup.find_all('div', class_='item')# 提取电影信息
for movie in movies:title = movie.find('a').get_text()rating = movie.find('div', class_='star').get_text()print(f'电影名称:{title},评分:{rating}')

在这个例子中,我们首先发送请求到豆瓣电影首页,然后使用BeautifulSoup解析HTML,并提取电影名称和评分。

3.2 知乎问答爬虫

知乎是一个知名的问答社区,我们可以使用爬虫来获取热门问题及其答案。

代码示例:爬取知乎热门问题

import requests
from bs4 import BeautifulSoup# 知乎热门问题URL
url = 'https://www.zhihu.com/explore'# 发送请求
response = requests.get(url)# 解析响应
soup = BeautifulSoup(response.text, 'lxml')# 获取热门问题列表
questions = soup.find_all('div', class_='zm-item')# 提取问题信息
for question in questions:title = question.find('h2').get_text()content = question.find('div', class_='zm-item-rich-text').get_text()print(f'问题:{title},内容:{content}')

在这个例子中,我们发送请求到知乎热门问题页面,然后使用BeautifulSoup解析HTML,并提取问题的标题和内容。

3.3 电商网站商品爬虫

许多电商网站提供了丰富的商品信息。我们可以使用爬虫来获取商品的名称、价格、描述等。

代码示例:爬取电商网站商品信息

import requests
from bs4 import BeautifulSoup# 电商网站商品页URL
url = 'https://www.example.com/product/12345'# 发送请求
response = requests.get(url)# 解析响应
soup = BeautifulSoup(response.text, 'lxml')# 获取商品信息
title = soup.find('h1').get_text()
price = soup.find('span', class_='price').get_text()
description = soup.find('div', class_='description').get_text()print(f'商品名称:{title},价格:{price},描述:{description}')

在这个例子中,我们发送请求到电商网站的商品页,然后使用BeautifulSoup解析HTML,并提取商品的名称、价格和描述。

通过学习本部分内容,读者应该已经了解了如何将Python爬虫技术应用于实际项目。在接下来的部分,我们将讨论爬虫的注意事项和优化策略,包括反爬虫策略、异常处理、性能优化等。

第四部分:爬虫注意事项与优化

在这一部分,我们将讨论Python爬虫在实际应用中需要注意的事项和优化策略,以确保爬虫的稳定运行和高效性。

4.1 反爬虫策略

在爬虫过程中,目标网站可能会采取各种反爬虫策略,如验证码、IP限制、频率限制等。为了应对这些策略,我们需要采取相应的应对措施。

代码示例:使用代理IP和User-Agent池

import requests
from random import choice# 代理IP列表
proxies = ['http://10.10.1.10:3128','http://10.10.1.11:8080',# 更多代理IP...
]# User-Agent列表
user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'# 更多User-Agent
]# 随机选择代理IP和User-Agent
proxy = choice(proxies)
user_agent = choice(user_agents)# 发送请求,并设置代理和User-Agent
response = requests.get('https://www.example.com', proxies={'http': proxy}, headers={'User-Agent': user_agent})
print(response.text)

在这个例子中,我们使用了一个代理IP列表和一个User-Agent列表。在每次发送请求时,我们随机选择一个代理IP和一个User-Agent,以减少被目标网站识别为爬虫的风险。

代码示例:处理验证码

对于需要验证码的网站,我们可以使用图像识别技术来自动识别验证码,或者使用某些服务来解决验证码问题。这里提供一个简单的验证码识别示例:

from PIL import Image
import pytesseract# 安装Tesseract OCR引擎
# pip install pytesseract# 打开验证码图片
image = Image.open('captcha.png')# 使用Tesseract OCR引擎识别验证码
captcha_text = pytesseract.image_to_string(image, config='--psm 11 --oem 3 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')print(captcha_text)

在这个例子中,我们使用Pillow库打开验证码图片,并使用Tesseract OCR引擎来识别验证码。为了提高识别准确率,我们可以对验证码进行预处理,例如调整亮度、对比度等。

4.2 异常处理

在爬虫过程中,可能会遇到各种异常情况,如网络连接失败、页面加载超时等。为了保证爬虫的稳定运行,我们需要对异常情况进行处理。

代码示例:使用try-except处理异常

import requestsurl = 'https://www.example.com'try:response = requests.get(url)response.raise_for_status()
except requests.exceptions.HTTPError as e:print(f'HTTP Error: {e}')
except requests.exceptions.ConnectionError as e:print(f'Connection Error: {e}')
except requests.exceptions.Timeout as e:print(f'Timeout Error: {e}')
except requests.exceptions.RequestException as e:print(f'Request Error: {e}')
else:print('请求成功')

在这个例子中,我们使用try-except语句来处理可能出现的异常情况。如果请求成功,我们执行else块中的代码;如果请求失败,我们根据异常类型执行相应的except块中的代码。

4.3 性能优化

为了提高爬虫的效率,我们需要对其进行性能优化。以下是一些常见的性能优化策略:

  1. 使用异步IO:使用如aiohttpasyncio等库来提高爬虫的并发处理能力。

  2. 缓存数据:使用缓存技术,如Redis或Memcached,来存储已获取的数据,避免重复爬取。

  3. 分页爬取:对于大型网站,可以通过分页爬取来逐步获取数据,避免一次性请求过多数据导致服务器压力过大。

  4. 合理设置请求头:在发送请求时,设置合适的User-Agent、Referer等头部信息,以模拟真实用户的行为。

  5. 限速:设置合理的访问频率,避免对目标网站服务器造成过大压力。

  6. 使用分布式爬虫:对于大规模数据爬取任务,可以使用分布式爬虫框架,如Scrapy,将任务分配给多个爬虫实例,提高爬取效率。

  7. 优化数据解析:对于复杂的HTML结构,可以优化数据解析逻辑,提高解析效率。

  8. 代码优化:编写高效的代码,避免不必要的循环和计算,提高程序运行速度。

通过学习本部分内容,读者应该已经了解了Python爬虫在实际应用中需要注意的事项和优化策略。这些策略将帮助我们在实际项目中更好地使用爬虫技术,提高爬虫的稳定性和效率。

总结

本文从Python爬虫的基础知识出发,详细介绍了爬虫原理、常用库、实战案例、注意事项以及优化策略。通过学习本文,读者应该能够全面掌握Python爬虫的原理和实践技巧,为数据采集和处理提供有力支持。在实际应用中,我们需要根据具体情况选择合适的爬虫技术和策略,以达到高效、稳定地获取数据的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/328772.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

党务政务服务热线|基于SSM的党务政务服务热线平台(源码+数据库+文档)

目录 基于SprinBootvue的党务政务服务热线平台 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2部门功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: …

开源的图形化Windows软件安装升级方案:WingetUI

WingetUI:简化数字生活,WingetUI让软件管理轻松便捷- 精选真开源,释放新价值。 概览 WingetUI是在GitHub上开发的一个实用工具,专为Windows用户设计,旨在为常见的命令行包管理工具(如Winget、Scoop、Pip、…

爬虫入门经典(七) | 采集淘宝电场相关信息

大家好,我是不温卜火,昵称来源于成语—不温不火,本意是希望自己性情温和。 PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!&a…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(76)

1. 题目解析 题目链接:LCR 091. 粉刷房子 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 1. 状态定义 在解决这类问题时,我们首先需要根据题目的具体要求来定义状态。针对房屋粉刷问题&#…

C语言 | Leetcode C语言题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;if (m 0) {return 0;}int n matrixColSize[0];int left[m][n];memset(left, 0, sizeof(left));for (int i 0; i < m; i) {for (int j …

AI图书推荐:ChatGPT 和Power BI驱动未来金融投资变革

《ChatGPT 和Power BI驱动未来金融变革》&#xff08;The Future of Finance with ChatGPT and Power BI&#xff09;由James Bryant和Aloke Mukherjee撰写&#xff0c;探讨了ChatGPT和Power BI在金融领域的应用。 主要特点&#xff1a; - 使用ChatGPT自动化Power BI&#xff…

01 | 为什么需要消息队列?

哪些问题适合使用消息队列来解决&#xff1f; 1. 异步处理 2. 流量控制 使用消息队列隔离网关和后端服务&#xff0c;以达到流量控制和保护后端服务的目的。 3. 服务解耦 无论增加、减少下游系统或是下游系统需求如何变化&#xff0c;订单服务都无需做任何更改&#xff0c…

Linux上编译安装和卸载软件

在maven官网下载maven时候&#xff0c;看到maven-3.9.5这个版本有2份安装包&#xff0c;一个是binaries&#xff0c;一个是source binaries是已编译好的文件&#xff0c;可以直接使用的版本&#xff1b;source是源代码版本&#xff0c;需要自己编译 源码的安装一般由这三个步…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

Foxmail使用经验总结

目录 1.概述 2.版本历史 3.使用方法 3.1.安装和设置账户 3.2.收取和阅读邮件 ​​​​​​​3.3.发送邮件 ​​​​​​​3.4.管理联系人 ​​​​​​​3.5.日程安排和任务管理 ​​​​​​​3.6.定制设置和插件 ​​​​​​​3.7.跨平台同步 4.小结 1.概述 Fox…

QT:QML制作线形图

目录 一.介绍 二.引入库 三.自定义属性 四.悬停处理函数 五.设置X轴 六.设置Y轴 七.画线 八.测试点坐标 九.设置值 十.效果演示 十一.代码演示 1.LineGraph.qml 2.main.qml 一.介绍 线形图&#xff08;也称为折线图&#xff09;是一种常用的数据可视化工具&#…

Springboot开发 -- Postman 调试 session 验证 接口

当我们在开发Spring Boot应用时&#xff0c;经常会遇到带有Session验证的接口&#xff0c;这些接口需要用户先登录并获取到Session ID&#xff08;或称为cookie中的JSESSIONID&#xff09;&#xff0c;然后在后续的请求中携带这个Session ID来保持会话状态。下面我将以一个实际…

Java 插入数据到Elasticsearch中进行各种类型文档的内容检索

源码下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1D3yszkTzjwQz0vFRozQl2g?pwdz6kb 提取码&#xff1a;z6kb 实现思路 1.搭建一个新的springboot项目&#xff0c;不会的请看我这篇博客&#xff1a;springboot项目搭建 2.添加maven依赖 <dependency><…

信息系统项目管理师0602:项目立项管理 — 历年考题(详细分析与讲解)

点击查看专栏目录 1、2017年11月第31题 题干: 项目经理小李依据当前技术发展趋势和所掌握的技术能否支撑该项目的开发,进行可行性研究。小李进行的可行性研究属于( )。 选项: A. 经济可行性分析 B. 技术可行性分析 C. 运行环境可行性分析 D. 其他方面的可行性分析 答案…

远程桌面如何配置?使用快解析远程访问

远程桌面如何设置&#xff1f; 远程桌面作为windows系统内置的一个组件&#xff0c;多年来深受用户喜爱。使用此功能&#xff0c;我们能够轻而易举的控制我们想要控制的电脑。下面我就简单的介绍一下远程桌面的设置方法。 在讲具体设置方法之前&#xff0c;首先应该给大家普及…

6大部分,20 个机器学习算法全面汇总!!建议收藏!(上篇)

前两天有小伙伴说想要把常见算法的原理 公式汇集起来。 这样非常非常方便查看&#xff01;分为上下两篇&#xff0c;下篇地址&#xff1a; 本次文章分别从下面6个方面&#xff0c;涉及到20个算法知识点&#xff1a; 监督学习算法 无监督学习算法 半监督学习算法 强化学习…

PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来

日前&#xff0c;第十二期 CCF 秀湖会议在苏州 CCF 业务总部 & 学术交流中心成功举办。本次会议以“开源教育&#xff1a;使命、挑战与发展”为主题&#xff0c;汇聚了来自学术界、工业界的二十余位专家&#xff0c;共同探讨开源教育的现状与未来。 PingCAP 联合创始人兼 C…

【微信小程序开发(从零到一)【婚礼邀请函】制作】——邀请函界面的制作(2)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

QT多线程的使用

目录 一.介绍 二.第一种多线程方式 1.创建一个线程子类&#xff0c;继承QT中的QThread 2.重新父类的run( )方法 3.在线程中创建子线程对象 4.run( )方法 5.启动子线程 三.第二种多线程方式 1.创建一个新类&#xff08;这个类是QObject的派生&#xff09; 2.在这个类中…

Unity射击游戏开发教程:(18)添加弹药计数+补充弹药

添加简单的弹药计数 我将讨论如何向游戏中添加简单的弹药计数。这将包括在 HUD 中添加弹药计数器,当弹药达到 0 时,文本会将颜色更改为红色以提醒玩家。另外,当弹药数为0时,玩家将无法再射击。让我们深入了解吧! 在播放器脚本中我们需要添加一些变量。我们将创建两个公共整…