数据采集技术:selenium/正则匹配/xpath/beautifulsoup爬虫实例

专栏介绍

1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。
2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。
3.需要强调的是,专栏仅介绍主流、初阶知识,每一技术模块都是AI研究的细分领域,同更多技术有所交叠,此处不进行讨论和分享。

  1. 数据采集技术:selenium/正则匹配/xpath/beautifulsoup爬虫实例

——————————————————————————————————————————

文章目录

  • 专栏介绍
  • 概述
  • 爬虫思路
  • 部分技术的封装案例
      • requests+正则获取数据
      • requests+xpath获取数据
      • request抓包爬取公众号
  • 爬虫实战:小白也能看懂的爬虫详细教学
      • 1.环境配置
      • 2.代码实战

——————————————————————————————————————————

概述

数据采集在机器学习领域中扮演着至关重要的角色。它是数据分析、机器学习和人工智能应用的基础。数据采集的目的是通过各种手段和技术手段,收集、整理、存储和处理各类数据。这些数据可以来自不同的来源,如传感器、日志、社交媒体、数据库等,并可能包括结构化数据、非结构化数据和时序数据等不同类型。

Selenium、正则匹配、XPath和BeautifulSoup是网络爬虫中常用的技术手段,它们各自有不同的特点和用途。

  1. Selenium
    Selenium是一个自动化测试工具,但它也常被用于网络爬虫中。它允许用户模拟用户的行为,如点击、输入、滚动等,来与网页进行交互。Selenium支持多种浏览器,并通过各种语言的API来控制浏览器行为。它特别适用于JavaScript动态生成的网页内容,因为Selenium可以执行JavaScript,获取网页在完全加载后的状态。
  2. 正则匹配(Regular Expressions)
    正则表达式是一种文本处理工具,它可以用来检查、替换或提取字符串中的特定模式。在爬虫中,正则表达式通常用于从网页的HTML源代码中提取所需信息。它适合于处理结构化或格式化的文本数据,但当HTML结构复杂或变化时,维护正则表达式可能会变得困难。
  3. XPath
    XPath是一种在XML和HTML文档中查找节点的语言。它通过路径表达式来选取文档中的节点或节点集。XPath在网络爬虫中常用于定位HTML文档中的特定元素,从而提取信息。XPath表达式可以非常精确地定位元素,并且对于大多数静态网页来说非常有效。
  4. BeautifulSoup
    BeautifulSoup是一个Python库,用于从HTML或XML文件中提取数据。它可以将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为四种:Tag、NavigableString、BeautifulSoup和Comment。BeautifulSoup通过解析器来处理HTML文档,并提供了简单的方法和Pythonic语法来访问和修改数据。它特别适合于格式不规范的HTML文档。
    此外,还有scrapy框架式爬虫、抓包爬虫等等,数据采集工作的手段丰富多样,此处不一一赘述。

爬虫思路

数据采集工作面向端类众多,如APP、web页面、公众号等等,不同的对象有着不同的爬取思路,当然不同的思路之间也有思想和策略的交叠。
例如:
面向网页端:获取html——信息过滤、筛选——格式化后处理——数据存储
面向app、公众号端:抓包——信息过滤、筛选——格式化后处理——数据存储

当然,除此外还有假代理设置、随机ip、cookie伪装、多并发等等应对反爬、提高效率的工作

部分技术的封装案例

该部分介绍一部分selenium/正则匹配/xpath/beautifulsoup用来爬虫时所用到的模块代码,有基础者可自行取用,无基础或基础较差朋友们经过一定的学习也能看懂,属于比较简单的爬虫模块。

requests+正则获取数据

#导入库
import requests
import jieba
import numpy as np
import pandas as pd
import re
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='SimHei'#设置中文显示# http://www.xnwbw.com/html/2021-07/07/node_2.htm#定义函数
def get_html(target):html = requests.get(url=target)html.encoding = html.apparent_encoding#万能解码return html.textdef get_title(html1):html = html1 text = re.findall(r'<title>(.*?)</title>',html)return textdef get_wenzhang(html1):html = html1 text = re.findall(r'.htm>(.*?)</a> </td></TR> <tr height=27px id=row_black23',html)return textdef get_picture(html1):html = html1#http://www.xnwbw.com/page/1/2021-07/07/A01/20210707A01_brief.jpgtext = re.findall(r'</MAP><img src=../../../(.*?) border=0 USEMAP=#PagePicMap>',html)return text#/html/body/div[3]/div[2]/div[2]/ul/li[2]/div[2]/div[2]/div[1]/a/spanlink = 'http://www.xnwbw.com/html/2021-07/07/node_2.htm'
html = get_html(link)title  = get_title(html)[0]
wenzhang = get_wenzhang(html)
#print('爬取成功!')
pic_add = tou+get_picture(html)[0]
pic = requests.get(pic_add)
path = 'tupian.png'  #获取img的文件名
with open(path, "wb")as f:f.write(pic.content)f.close()

部分爬取效果和后处理成果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

requests+xpath获取数据

#导入库
import requests
from lxml import etree
import numpy as np
import pandas as pd
import re
#定义函数
def get_html(target,hesders):html = requests.get(url=target,headers = headers)html.encoding = html.apparent_encoding#万能解码return html.textdef get_name(html1):html = etree.HTML(html1)  text = html.xpath('/html/body/div[5]/div[2]/div[2]/div[1]/div[2]/p/text()')#审查元素,copy,fullreturn text#/html/body/div[3]/div[2]/div[2]/ul/li[2]/div[2]/div[2]/a#模拟浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'} #开始爬取
url = 'https://www.17k.com/chapter/3259564/42183056.html'import urllib.request
from bs4 import BeautifulSoup as bsdef urlopen(url):req = urllib.request.Request(url)req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")html = urllib.request.urlopen(req)html = html.read()return html
html = urlopen(url)
html = bs(html,'lxml')
content = html.find_all('div',class_="p")
content = content[0].text
print(content)

此处强调一下审查元素的操作方法:

text = html.xpath('/html/body/div[5]/div[2]/div[2]/div[1]/div[2]/p/text()')#审查元素,copy,full

其中html字符串可通过选择爬取的元素,右击检查:
在这里插入图片描述
定位到元素代码后对xpath进行提取:
在这里插入图片描述

request抓包爬取公众号

# 定义爬虫主函数
def spider(url,headers,config):# 抓取目标网站的政策名称、政策链接、发布时间、标记content_list = []for i in range(2):print('当前进度:第{}组'.format(str(i+1)))data["begin"] = i*5time.sleep(25)# 使用get方法进行提交try:content_json = requests.get(url, headers=headers, params=config).json()print(content_json)# 返回了一个json,里面是每一页的数据for item in content_json["app_msg_list"]:    # 提取每页文章的标题及对应的urlitems = []items.append(item["title"].replace("\"",""))items.append(item["link"])# 对政策进行筛选,通不过筛选则不爬取flags = filter_data(item["title"])if flags:items.append(get_date(item["link"]))items.append(flags)else:continuecontent_list.append(items)except:print('error')return content_list
# 程序开始运行:
headers = {"Cookie":"","User-Agent": ""
}
token = ""
info1 = pd.read_excel('config.xlsx') # info1中含有token、cookie、User-Agent三项信息
headers["Cookie"] = str(np.array(info1)[0][1])
headers["User-Agent"] = str(np.array(info1)[0][2])
token = str(np.array(info1)[0][0])info2 = np.array(pd.read_excel('web_list.xlsx')) # info2是主要信息文件,在遍历时起到将配置信息配齐、将爬虫信息配齐以及驱动整个程序的作用
# 0-序列,1-公众号名称,2-url,3-省,4-市,5-区,6-token,7-lang
#8-f,9-ajax,10-action,11-begin,12-count,13-query,14-fakeid,15-type
data = {"token": "","lang": "","f": "","ajax": "","action": "","begin": "","count": "","query": "","fakeid": "","type": "",
}result = []
data_0 = datetime.date.today().strftime('%Y%m%d')
sys.stdout = Logger('./log_{}.txt'.format(data_0))
for i in info2:print('正在爬取:',i[1],i[2])#对 每个公众号设置一个补全列表,列表内容包括:公众号名称、省、市、区、检索时间mid_ls = [i[1],i[3],i[4],i[5],str(str2date(time.strftime("%Y-%m-%d %H:%M:%S")))[:10]]# 每个公众号需要重新配置data['token'] = str(token)data['query'] = ''data['lang'] = str(i[7])data['f'] = str(i[8])data['ajax'] = str(i[9])data['action'] = str(i[10])data['begin'] = str(i[11])data['count'] = str(i[12])data['fakeid'] = str(i[14])data['type'] = str(i[15])# 爬'''try:mid_result = spider(i[2],headers,data)for j in mid_result:# 补result.append(mid_ls+j)except:print('some error.')'''mid_result = spider(i[2],headers,data)for j in mid_result:# 补result.append(mid_ls+j)
print('爬取完成!')

其中,params的参数获取需要登陆微信公众号后获取cookie等伪装登录信息,具体的内容可以自行在互联网进行搜索解决。再次强调,此处只是分析代码模块片段供有基础的人进行使用,本质上微信公众号爬虫就是抓包获取json数据进行后处理解析。

爬虫实战:小白也能看懂的爬虫详细教学

1.环境配置

网上自行查找anaconda配置教程,之后根据代码所需库进行安装即可,此处强调一下selenium配置教程:
a.下载谷歌浏览器
b.设置——关于——查看版本号
在这里插入图片描述
c.下载驱动

https://chromedriver.storage.googleapis.com/index.html
https://googlechromelabs.github.io/chrome-for-testing/#canary

在这里插入图片描述
如上图所示,找到最近的版本号(126.0…),选择系统版本通过url链接在浏览器下载即可。
d.打开谷歌浏览器所在位置,将驱动exe程序粘贴即可。
在这里插入图片描述

2.代码实战

导入环境

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import requests
from bs4 import BeautifulSoup

创建data.txt文件,内容如下:

利用不可移动文物举办展览、展销、演出等活动的许可
53ca826d-795d-4bdc-b666-ec97a0dd3aa5
机动车驾驶员培训教练场经营备案(新增)
263c2b6a-0d6c-443b-ab1e-bbcc6c01e13b

获取针对一个页面获取一个html:

options = webdriver.ChromeOptions()
# 添加无头模式选项
options.add_argument("--headless")
# 创建一个Chrome浏览器实例
driver = webdriver.Chrome(options=options,executable_path=r'C:\Program Files\Google\Chrome\Application\chromedriver.exe')
# 打开目标网页
driver.get('http://ytzwfw.sd.gov.cn/yt/icity/proinfo/index?code=53ca826d-795d-4bdc-b666-ec97a0dd3aa5')
html = driver.page_source

打印html观察其有效元素在html中的分布:
在这里插入图片描述

在这里插入图片描述
根据分布设计数据过滤、采集的代码,主要靠bs4实现:

def get_single_data(name: str, url: str, data) -> dict:options = webdriver.ChromeOptions()# 添加无头模式选项options.add_argument("--headless")# 创建一个Chrome浏览器实例driver = webdriver.Chrome(options=options,executable_path=r'C:\Program Files\Google\Chrome\Application\chromedriver.exe')# 打开目标网页driver.get(url)html = driver.page_sourcemid_time = driver.find_element(By.CLASS_NAME, 'law-time').textdriver.quit()# html = getHTMLText(url)soup = BeautifulSoup(html, 'html.parser')  # 用BeautifulSoup库解析网页temps_div = soup.find_all('div', attrs={'class': "table-table"})raw_content_ls = temps_div[0].select('td')data[name] = {}data[name]['实施主体'] = raw_content_ls[0].textdata[name]['承办机构'] = raw_content_ls[1].textdata[name]['事项版本'] = raw_content_ls[4].textdata[name]['办理结果名称'] = raw_content_ls[6].text.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')data[name]['法定办结时限'] = mid_time   # get_end_time(url)data[name]['是否存在运行系统'] = temps_div[0].select('td[width="30%"]')[-1].textdata[name]['咨询渠道'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-3].text.replace('\r', ' ').replace('\t', ' ').replace('\n', ' '))[1:-1]data[name]['投诉渠道'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-2].text.replace('\r', ' ').replace('\t', ' ').replace('\n', ' '))[1:-1]data[name]['受理时间、地点'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-1].text.replace('\r', ' ').replace('\u2003', ' ').replace('\n',' ').replace('\t', ' '))[1:-1]return data

可以看到,本质上就是通过selenium的find_element、bs4的find_all、select等功能对html标签进行层层解析,从而定位到有效信息。
在这里插入图片描述

形成批量化爬取的完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import requests
from bs4 import BeautifulSoupdef collapse_spaces(s):while "  " in s:s = s.replace("  ", " ")return sdef get_single_data(name: str, url: str, data) -> dict:options = webdriver.ChromeOptions()# 添加无头模式选项options.add_argument("--headless")# 创建一个Chrome浏览器实例driver = webdriver.Chrome(options=options,executable_path=r'C:\Program Files\Google\Chrome\Application\chromedriver.exe')# 打开目标网页driver.get(url)html = driver.page_sourcemid_time = driver.find_element(By.CLASS_NAME, 'law-time').textdriver.quit()# html = getHTMLText(url)soup = BeautifulSoup(html, 'html.parser')  # 用BeautifulSoup库解析网页temps_div = soup.find_all('div', attrs={'class': "table-table"})raw_content_ls = temps_div[0].select('td')data[name] = {}data[name]['实施主体'] = raw_content_ls[0].textdata[name]['承办机构'] = raw_content_ls[1].textdata[name]['事项版本'] = raw_content_ls[4].textdata[name]['办理结果名称'] = raw_content_ls[6].text.replace('\n', '').replace('\t', '').replace('\r', '').replace(' ', '')data[name]['法定办结时限'] = mid_time   # get_end_time(url)data[name]['是否存在运行系统'] = temps_div[0].select('td[width="30%"]')[-1].textdata[name]['咨询渠道'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-3].text.replace('\r', ' ').replace('\t', ' ').replace('\n', ' '))[1:-1]data[name]['投诉渠道'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-2].text.replace('\r', ' ').replace('\t', ' ').replace('\n', ' '))[1:-1]data[name]['受理时间、地点'] = collapse_spaces(temps_div[0].select('td[colspan="3"]')[-1].text.replace('\r', ' ').replace('\u2003', ' ').replace('\n',' ').replace('\t', ' '))[1:-1]return datatitles = []
url_ends = []
with open('data.txt','r',encoding='utf-8')as f:mid = f.readlines()for i in range(len(mid)):if i %2 == 0:titles.append(mid[i].strip('\n'))else:url_ends.append(mid[i].strip('\n'))
print(titles[:10])
print(url_ends[:10])
print(len(titles),len(url_ends))data = {}
# now:1000
start_index = 0
for index in range(len(titles[start_index:])):print(titles[index])url = 'http://ytzwfw.sd.gov.cn/yt/icity/proinfo/index?code={url_end}'.format(url_end=url_ends[index])print(url)try:get_single_data(titles[index],url,data)print(data[titles[index]])except Exception as e:print(e)
print('爬取完成!')import json# 将字典转换为JSON格式的字符串
json_string = json.dumps(data, ensure_ascii=False)# 将JSON字符串写入文本文件
with open('my_get_data.txt', 'w', encoding='utf-8') as file:file.write(json_string)

在这里插入图片描述

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

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

相关文章

电影解说 剪辑实战带货全新蓝海市场,电影解说实战课程(16节)

课程目录 1-影视解说自媒体带货新玩法_1.mp4 2-影视解说选品及解说规范标准_1.mp4 3-电影解说的脚本模版及流程_1.mp4 4-电影解说编写文案及爆火规律_1.mp4 5-手把手教你影视素材哪里找_1.mp4 6-影视解说剪辑、配音及创收方式_1.mp4 7-电影解说剪辑的实操课程A_1.mp4 8…

关于Ubuntu系统中.config文件夹如何找到

Ubuntu中QT项目使用了setting保存配置&#xff0c;但是找不到配置文件保存了在哪里&#xff0c;找了一下&#xff1a; 因为QT里取的名字是&#xff1a; 于是下载everything搜索Nio&#xff0c;发现目录为/home/nio/.config 虽然已经下载了everything找到了&#xff0c;但是发现…

fyne常用内置颜色

常用内置颜色 在theme包里有一个关于颜色的color.go 常用颜色如下: theme.PrimaryColor() theme.WarningColor() theme.SuccessColor() theme.ErrorColor() theme.ShadowColor() theme.HyperlinkColor()最终这些会返回color.Color接口。 效果图: theme.HyperlinkColor()和t…

VTK- 面绘制体绘制

在VTK中&#xff0c;面绘制&#xff08;Surface Rendering&#xff09;和体绘制&#xff08;Volume Rendering&#xff09;是两种常见的三维数据可视化方法。面绘制和体绘制是计算机图形学中用于三维数据可视化的重要技术&#xff0c;尤其在医学成像、科学可视化和计算机辅助设…

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX&#xff0c;子网 掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口&#xff0c;这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…

游戏行业情报 | 手机玩3A终是空想?iOS版3A大作销量滑铁卢

2023年9月的苹果发布会上&#xff0c;苹果宣布iPhone15 Pro系列首发配备的A17 Pro芯片将能够支持3A游戏的游玩&#xff0c;随着该系列设备的发布&#xff0c;《生化危机 4》、《生化危机&#xff1a;村庄》、《死亡搁浅》和《刺客信条&#xff1a;幻景》等大作先后登陆iOS平台。…

Qt 使用 QZipReader 解压文件

Qt 使用 QZipReader 解压文件 文章目录 Qt 使用 QZipReader 解压文件摘要关于 QZipReader使用 QZipReader代码解释&#xff1a; 快速解 extractAll 关键字&#xff1a; Qt、 QZipReader、 extractAll、 Zip、 解压缩 摘要 每日一坑&#xff0c;坑坑难过&#xff0c;今日在…

2024年度 | 推荐PC端时间规划、项目管理软件(最新)

PingCode&#xff1a;适用于IT团队的项目/任务管理。 https://pingcode.com/ Worktile&#xff1a;团队通用的任务规划工具。 https://worktile.com/ Todoist&#xff1a;个人任务管理工具&#xff0c;支持跨平台同步。 Todoist | 管理您工作和生活的To Do List Pomodoro Ti…

Android选择题界面的设计——线性布局实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button、CheckBox等实现一个选择题界面&#xff0c;界面如图1所示。 图1 选择题界面效果图 任务分析 上述界面可以分解为上下两部分&#xff0c;上面部分可以使用横向的线性布局来完成&#xff0c;下面部分可以使用…

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势

独家带你get懂印尼直播工具APP借助海外快手kwai短视频广告推广优势 随着全球互联网的迅猛发展和移动互联网的普及&#xff0c;广告投放已经成为企业扩大品牌影响力、获取潜在客户的重要手段之一。在印尼这一充满活力的市场中&#xff0c;直播工具APP的广告投放尤为关键。海外快…

快速了解 | 企业代码签名证书怎么弄

企业代码签名证书是用于签名软件、驱动程序、代码库等的数字证书&#xff0c;它能够保证软件的完整性和来源的真实性&#xff0c;从而提升用户对软件的信任度&#xff0c;消除电脑系统对于“未知发布者”软件的安装拦截和弹窗警告&#xff0c;消除微软的SmartScreen提醒。 1、…

ArmPiPro-多人同时开发

V0.0 2024.07.04 ROS节点间的通信是分布式的&#xff0c;也就是节点可以运行在不同的”主机“上&#xff0c;这些主机包括安装在机器人上的主控&#xff08;Pi4&#xff09;、通过串口连接PI4的烧写有Serialros的MCU从控、负责视觉开发的VM1、负责移动的VM2、负责机械臂的VM3都…

【自适应滤波系列四】回声消除(Acoustic Echo Cancellation, AEC)信号模型及其本质

什么是回声 关于回声的产生与传播,凌逆战(https://www.cnblogs.com/LXP-Never)大佬在其博客中阐述得很详细,可以去看他的博客,下面部分图片来源于其博客 回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声。一些回声是必要的,比如剧院里的音乐回声…

海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益:) 用过 DolphinScheduler 的小伙伴应该都知道&#xff0c;Dolphin…

代理IP和VPN有什么区别?该怎么选择?

今天我们来聊聊很多人关心的一个问题——代理IP和VPN到底有什么区别&#xff1f;虽然它们听起来差不多&#xff0c;但其实有很大的不同。这篇文章&#xff0c;小编就带大家一起了解一下吧&#xff01; 什么是代理IP&#xff1f; 代理IP是一种通过代理服务器替换用户真实IP地址…

第3章.中央服务器的物联网模式--AI/ML集成

第3章.中央服务器的物联网模式 本章列出了由于存储和/或计算需求而部署在中央服务器上以及部署在边缘&#xff08;本地&#xff09;或云上的体系结构模式。 这些模式基于现场设备生成的数据提供见解&#xff0c;使用附加数据&#xff08;来自附加系统&#xff0c;如企业系统&am…

【数据结构】建堆的时间复杂度

一.向下调整建堆 1.二叉树层数与总节点个数关系 层数一定时&#xff0c;在二叉树节点个数最大的情况下&#xff0c;二叉树为满二叉树&#xff0c;如下图所示&#xff0c;可以清晰地看到在满二叉树中第h层有2^(h-1)个节点&#xff0c;总节点N就等于一个等比数列的求和&#xf…

6.基于SpringBoot的SSMP整合案例-业务层开发

目录 1.业务层标准开发 1.1接口定义 1.2实现类定义 1.3测试类定义 1.4小结&#xff1a; 2.业务层快速开发 2.1使用MyBatisP1us提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl),t> 接口定义&#xff1a; 实现类定义&#xff1a; 测试类&#xff1a; …

AI绘画Stable Diffusion 超高分辨率扩图教程:ControlNet组件-Tile妙用,增强细节保持构图完整!

大家好&#xff0c;我是向阳 今天给大家分享如何用AI绘画工具Stable Diffusion 的 ControlNet Tile工具应用。ControlNet Tile模型能够在SD绘图过程中&#xff0c;实现高分辨率下实现高清扩图&#xff0c;并且避免出现图像分身现象&#xff0c;以及可以调整SD扩散生产过程噪声…

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…