【python爬虫】爬虫编程技术的解密与实战

​🌈个人主页:Sarapines Programmer
🔥 系列专栏: 爬虫】网络爬虫探秘
⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。

目录

🌼实验目的

🌷实验要求 

🏵️实验代码

🌿1. 爬取并下载当当网某一本书的网页内容

🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值

🌿3. 从长沙房产网爬取长沙某小区的二手房信息

🌾实验结果

🌿1. 爬取并下载当当网某一本书的网页内容

🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值

🌿3. 从长沙房产网爬取长沙某小区的二手房信息

🌺实验体会

📝总结


🌼实验目的

  • Jupyter Notebook编程工具基本用法:

    • 学习掌握Jupyter Notebook编程工具的基本用法。
  • Python读取CSV文件:

    • 理解并熟悉使用Python编程语言读取CSV文件的方法。
  • 学习使用爬虫:

    • 通过学习,熟悉爬虫技术的使用,掌握在Python环境下进行网络爬取的基本知识和技能。

🌷实验要求 

  1. 爬取并下载当当网某一本书的网页内容: 通过编写Python代码,实现对当当网上某一本书的网页内容进行爬取,并将其保存为HTML格式,这涉及到网络爬虫技术的应用。

  2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值: 运用自学的正则表达式技能,爬取豆瓣网上某本书的前50条短评内容,并计算这些评分的平均值,为数据分析提供基础。

  3. 从长沙房产网爬取长沙某小区的二手房信息: 以名都花园为例,通过网络爬虫技术从长沙房产网(长沙链家网)上获取该小区的二手房信息,并将这些信息保存到EXCEL文件中,为房产数据的整理和分析提供便利


🏵️实验代码

🌿1. 爬取并下载当当网某一本书的网页内容
import urllib.request    
#做爬虫时要用到的库
   
#定义百度函数  
def dangdang_shuji(url,begin_page,end_page):  
    #三个参数: 链接+开始页数+结束页数  
    for i in range(begin_page, end_page+1):  
        #从开始页数到结束页数,因为range性质所以要想到达end_page得到达end_page+1
        sName = str(i).zfill(5) + '.html'     
        #填充为.html文件名
        #zfill(5)表示数字前自动补0,加上字符转化的整型i一共占五位
        print ('正在下载第' + str(i) + '个网页,并将其存储为' + sName + '......')  
        #显示爬虫细节
        f = open(sName,'wb+')        
        #w+以纯文本方式读写,而wb+是以二进制方式进行读写              
        m = urllib.request.urlopen(url+str(i)) .read()  
        #urllib.request请求模块
        #urlopen实现对目标url的访问
        #可用参数
        #url:  需要打开的网址
        #data:Post提交的数据
        #timeout:设置网站的访问超时时间
        f.write(m)  
        f.close()
        
#调用部分
bdurl = str(input('请输入您在当当网上搜索的关于某本书的网页地址:'))
# 注意输入网址 https://book.dangdang.com/
begin_page = int(input(u'请输入开始的页数:\n')) 
#将输入的字符串类型转化为整型
end_page = int(input(u'请输入终点的页数:\n'))  
#同上
dangdang_shuji(bdurl,begin_page,end_page)    
#调用函数
🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值
import requests, re, time  
#获取响应时间与超时
count = 0
i = 0
sum, count_s = 0, 0
while(count < 50):
  #访问前50条记录
  if(i==0):
  #首页内容
    try:
      proxies = {'http': '120.236.128.201:8060','https': '120.236.128.201:8060'}
      headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}
      url = 'https://book.douban.com/subject/3674537/comments/?limit=20&status=P&sort=score'
      r = requests.get(url=url,headers=headers)
    except Exception as err:
      print(err)
      #打印输出错误信息
      break

  #其他页的内容
  else:
      start = i*20
    #url中start的值
      try:
        proxies = {'http': '120.236.128.201:8060','https': '120.236.128.201:8060'}
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}
        url='https://book.douban.com/subject/3674537/comments/?start='+str(start)+'&limit=20&status=P&sort=score'
        r = requests.get(url=url,headers=headers)
        # print('第'+str(i)+'页内容')
      except Exception as err:
        print(err)
        break
  soup = BeautifulSoup(r.text, 'lxml')
  # comments = soup.find_all('p', 'comment-content')
  #查找所有tag值为p,class标签为comment-content的内容

  comments = soup.find_all('span', class_='short')

  for item in comments:
    count = count + 1
    # print(count, item.string)
    print(count,item.get_text())
    #打印用户评论
    if count == 50:
      break 
  pattern = re.compile('<span class="user-stars allstar(.*?) rating"')
  #以正则表达式匹配网页中的内容

  p = re.findall(pattern, r.text)
  for star in p:
    count_s = count_s + 1
    sum += int(star)
  time.sleep(5)
  # 停顿5秒再开始
  i += 1
if count == 50:
  print("\n平均分:",sum / count_s)

import requests, re, time  
#获取响应时间与超时
from bs4 import BeautifulSoup 
#html的解析器,主要功能是解析和提取数据
def douBan():
    score_list=[]   
    #用于存储得分
    import urllib  
    #做爬虫时要用到的库
    count=0
    i=0
    while(count<50):  
        #求50条评价记录
         #首页内容
        if(i==0):
            try:
                headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}
                url = 'https://movie.douban.com/subject/35437938/comments?limit=20&status=P&sort=new_score'
                r = requests.get(url=url,headers=headers)
            except Exception as err:
                #返回报错的原因
                print(err)
                break

        #非首页内容
        else:
            start = i*20
            #url中start的值
            try:
                headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}
                url='https://movie.douban.com/subject/35437938/comments?start='+str(start)+'&limit=20&status=P&sort=new_score'
                r = requests.get(url=url,headers=headers)
                # requests.get表示向服务器请求数据,服务器返回的结果是个Response对象
            except Exception as err:
                print(err)
                break
        req=urllib.request.Request(url,headers=headers)
        #Request:构造一个基本的请求。headers可以模拟浏览器,url为目的网址
        #urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以
        #模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证),
        #redirections (重定向), cookies (浏览器Cookies)以及其它内容

        response=urllib.request.urlopen(req)
        #urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)。
        #参数解释:
        #url:请求网址
        #data:请求时传送给指定url的数据,当给出该参数时,请求方式变为POST,未给出时为GET。
        #timeout:设定超时时间。如果在设定时间内未获取到响应,则抛出异常。
        #cafile, capath分别为CA证书及其路径

        
        html=response.read().decode("utf-8")
        #以utf-8方式读取爬取网页的内容
        bs=BeautifulSoup(html,"html.parser") 
        #beautifulSoup:提取html对象中的内容
        items=bs.find_all("div",class_="comment-item")
        
        findScore=re.compile('<span class="allstar(.*?) rating"')
        #匹配星级
        findName=re.compile('<img alt="(.*?)"')
        #正则表达式的字符串形式匹配电影名字

            
        for item in items:
            item=str(item)
            #找出对应的五十个电影的得分
            score=re.findall(findScore,item)[0]
            score=float(score)
            score_list.append(score)
            #将得分存放在score_list列表中
            count+=1
            #计数器加1,当计数器大于等于50则结束循环
            if(count>=50):
                break
        i+=1
        #下一页
        time.sleep(5) 
        # 停顿5秒
    print("评分表  :  ",score_list)
    
    #计算平均分
    length=len(score_list)
    print("一共%d条信息"%length)
    sum_score=0
    #计算总和,然后求平均分
    for i in score_list:
        sum_score+=i
    avg=sum_score/length
    print("豆瓣前50评价 总分为:",sum_score,"平均分:",avg)
#调用函数
douBan()
🌿3. 从长沙房产网爬取长沙某小区的二手房信息
import requests as requ
import requests
#获取响应时间与超时
from bs4 import BeautifulSoup
#html的解析器,主要功能是解析和提取数据
import xlwt
#xlwt将数据和样式信息写入excel表格的库
 
def getHouseList(url):
    "获取房源信息:标题、链接地址、户型、面积、朝向、总价、所属区域、套内面积"
    house =[]
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}   
    #解析内容
    res = requests.get(url,headers=headers)
    soup = BeautifulSoup(res.content,'html.parser')
    housename_divs = soup.find_all('div',class_='title')
    #查找该html网页中tag值为div、class值为title的部分
    #指定属性查找标签
    
    for housename_div in housename_divs:
        housename_as=housename_div.find_all('a')
        #参数解释:在原网页中,div标志下有一个叫"a"的超链接。所以次数找tag值为a的元素
        #返回值:对象数组,对象内容为a超链接中的属性)

        for housename_a in housename_as:
            housename=[]
            housename.append(housename_a.get_text())
            #得到超链接中的文字内容,放在housename列表中

            housename.append(housename_a.get('href'))
            house.append(housename)
            #获取超链接中的链接,放在house列表中

    huseinfo_divs = soup.find_all('div',class_='houseInfo')
    #参数解释:获取该网页中tag值为div,class值为houseInfo

    for i in range(len(huseinfo_divs)):
        info = huseinfo_divs[i].get_text()#获取houseInfo中的标题
        infos = info.split('|')
        #原网页以|符号分割的,这里以此做分割

        #小区名称
        house[i].append(infos[0])
        #户型
        house[i].append(infos[1])
        #平米
        house[i].append(infos[2])

    house_prices = soup.find_all('div',class_='totalPrice')
    #函数作用:获取网页中tag值为div,且class值为totalPrice的内容

    for i in range(len(house_prices)):
        price = house_prices[i].get_text()
        #获取文字内容
        house[i].append(price)
    return house
 
#爬取房屋详细信息:所在区域、套内面积
def houseinfo(url):
    #为什么要分为两个函数?因为这个网页中,输入一个url只是得到一些基本信息
    #而详细信息需要到从基本信息中的链接再去提取

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}
    res = requests.get(url,headers=headers)
    soup = BeautifulSoup(res.content,'html.parser')
    #headers、res、soup与getHouseList()函数中一致。基本上可以作为固定不变的部分

    msg =[]
    #获取房源的所在区域
    areainfos = soup.find_all('span',class_='info')
    #获取网页中tag值为span,class为info的内容(以具体网页内容为准)

    for areainfo in areainfos:
        #只需要获取第一个a标签的内容即可
        area = areainfo.find('a')
        #找到tag值为a(超链接)的内容。返回一个对象数组
        #具体内容为:herf、target、text

        if(not area):#如果area为null
            continue#如果没有这部分信息就跳过
        hrefStr = area['href']#提取该房源的链接
        if(hrefStr.startswith('javascript')):
            continue
        msg.append(area.get_text())#获取房源所在的地区名称
        break#由于只需要获取第一个a标签的内容,所以此时就可以跳出循环

    #根据房屋户型计算套内面积
    infolist = soup.find_all('div',id='infoList')
    #获取tag值为div,id为infolist的内容
    #注意网站标注的总面积与实际的套内面积是不一样的,所以需要重新计算

    num = []
    for info in infolist:
        cols = info.find_all('div',class_='col')
        #网站中包含col列的有很多,包括面积、方位、名称等等
        #老师的方法是遍历所有的col,
        #我觉得更好的方法是将包含平米的col单独提取出来,这样就无需使用try

        for i in cols:
            pingmi = i.get_text()#获取标题(面积,即xxx平米)
            try:
                #尝试从string中提取数字
                a = float(pingmi[:-2])#从开头到距离尾部2个字符,即把"平米"汉字去掉了
                num.append(a)
            except ValueError:
                #如果出错就跳出
                continue
    msg.append(sum(num))#计算各户型的总面积
    return msg
 
def writeExcel(excelPath,houses):
    "#将爬取数据写入excel文件"
    #excelPath:excel文件存储的路径,houses:包含房源基本信息的列表
    workbook = xlwt.Workbook()
    #函数作用:新建一个工作簿
    sheet = workbook.add_sheet('git')
    #添加一行

    row0=['标题','链接地址','户型','面积','朝向','总价','所属区域','套内面积']
    for i in range(0,len(row0)):
        sheet.write(0,i,row0[i])
        #作为excel表列索引

    for i in range(0,len(houses)):
        house = houses[i]
        print(house)
        for j in range(0,len(house)):
            sheet.write(i+1,j,house[j])
            #数据写完一行接上一行
    workbook.save(excelPath)
    #将excel工作簿保存到指定位置
 
#主函数
def main():
    data = []
    for i in range(1,5):
        print('-----分隔符',i,'-------')
        #i从1到4
        if i==1:
            url ='https://cs.lianjia.com/ershoufang/c3511059937033rs%E5%90%8D%E9%83%BD%E8%8A%B1%E5%9B%AD/'
            #此时i=1时url指向该地址
        else:
            url='https://cs.lianjia.com/ershoufang/pg'+str(i)+'c3511059937033rs%E5%90%8D%E9%83%BD%E8%8A%B1%E5%9B%AD/'
            #i不等于1时url执行不同位置
        
        houses =getHouseList(url)
        
        for house in houses:
            link = house[1]
            if(not link or not link.startswith('http')):
                #无法连接或连接协议不是http,使用continue跳出循环
                continue
            mianji = houseinfo(link)
            house.extend(mianji)
        data.extend(houses)
        #将数据整合到daya里统一写入excel表
    writeExcel('d:/cs.xls',data)
    
if __name__ == '__main__':
    main()
    #如果模块是被直接运行的,则代码块被运行,
    #如果模块是被导入的,则代码块不被运行

🌾实验结果

🌿1. 爬取并下载当当网某一本书的网页内容


🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值


🌿3. 从长沙房产网爬取长沙某小区的二手房信息


🌺实验体会

  1. 实验学习和爬虫指令使用

    • 通过实验首次接触了使用Python进行爬虫,学到了相关爬虫指令,并成功爬取了当当网和长沙二手房的信息。
    • 发现在Linux系统下使用cat语法访问.csv文件,而在Windows系统下要使用type,需要注意斜线的差异。
  2. 对Python库的认识和意识拓展

    • 在此实验中,通过社区查阅了相关资源,附上了详细注释,深化了对爬虫的理解。
    • 意识到Python语言的强大之处,不论是机器学习的scikit-learn库还是爬虫的requests库,都涉及到Python,并体会到其调用封装在不同的库中。
  3. 爬虫问题解决和环境疑惑

    • 遇到在Jupyter Notebook中出现‘int’ object is not callable的问题,通过重新创建文件解决,但对问题原因产生疑惑。
    • 怀疑问题可能与装了PyTorch导致与Python两个虚拟环境冲突,但并未做实质修改,问题自行解决,留下疑惑。

📝总结

Python领域就像一片未被勘探的信息大海,引领你勇敢踏入Python数据科学的神秘领域。这是一场独特的学习冒险,从基本概念到算法实现,逐步揭示更深层次的模式分析、匹配算法和智能模式识别的奥秘。

渴望挑战Python信息领域的技术?不妨点击下方链接,一同探讨更多Python数据科学的奇迹吧。我们推出了引领趋势的💻 Python数据科学专栏:【爬虫】网络爬虫探秘,旨在深度探索Python模式匹配技术的实际应用和创新。🌐🔍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android开发修炼之路——(一)Android App开发基础-2

本专栏文章 上一篇 Android开发修炼之路——&#xff08;一&#xff09;Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置&#xff0c;首先描述项目和模块的区别&#xff0c;以及工程内部各目录与配置文件的用途说明&#xff1b;其次阐述两种级别…

BabylonJS 6.0文档 Deep Dive 摄像机(六):遮罩层和多相机纹理

1. 使用遮罩层来处理多个摄影机和多网格物体 LayerMask是分配给每个网格&#xff08;Mesh&#xff09;和摄像机&#xff08;Camera&#xff09;的一个数。它用于位&#xff08;bit&#xff09;级别用来指示灯光和摄影机是否应照射或显示网格物体。默认值为0x0FFFFFFF&#xff…

SpringBoot使用druid

SpringBoot使用druid 一、前言二、配置1、pom依赖2、配置文件yml3、配置类 一、前言 Java程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C…

【wink】草稿损坏如何恢复?

为节省储存空间&#xff0c;我们不会缓存您的原始视频。 原视频被删除或上传云盘后&#xff0c;可能会由于读取不到原视频而提示草稿损坏。 草稿损坏后&#xff0c;您可以尝试以下方法进行恢复&#xff1a; 从相册「最近删除」中恢复原视频&#xff1b;从云盘中下载原视频&…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

力扣646. 最长数对链

动态规划 思路&#xff1a; 思路与 力扣354. 俄罗斯套娃信封问题 类似将序列进行排序&#xff0c;然后假设 dp[i] 为第 i 个元素的最长数对链个数&#xff1b;则其状态转移方程&#xff1a; 第 i 个元素之前的某一个元素&#xff08;假设是下标是 j&#xff09;&#xff0c;如…

残留扭矩测量方法有哪些——SunTorque智能扭矩系统

残留扭矩是指在设备或机器的转动部分停机后仍然存在的扭矩&#xff0c;通常是由于摩擦力、粘性阻力等因素引起的。残留扭矩测量是设备维护和故障诊断的重要环节&#xff0c;SunTorque智能扭矩系统一起和大家学习了解几种常见的残留扭矩测量方法。 suntoruqe智能扭矩系统 静态扭…

C++技术要点总结, 面试必备, 收藏起来慢慢看

目录 1. 语言对比 1.1 C 11 新特性 2.2 C 和 C 的区别 2.3 Python 和 C 的区别 2. 编译内存相关 2.1. C 程序编译过程 2.2. C 内存管理 2.3. 栈和堆的区别 2.4. 变量的区别 2.5. 全局变量定义在头文件中有什么问题&#xff1f; 2.6. 内存对齐 2.7. 什么是内存泄露 …

Tomcat运维

目录 一、Tomcat简介 二、系统环境说明 1、关闭防火墙&#xff0c;selinux 2、安装JDK 3、安装Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 四、Tomcat 配置管理页面(了解) …

【Linux】从新认识Linux 服务(Service)

文章目录 Linux中service的概念Linux中常见的service常见的服务管理方式Linux中列出serviceLinux中service的特点推荐阅读 Linux中service的概念 在Linux操作系统中&#xff0c;服务&#xff08;Service&#xff09;是一个基本概念&#xff0c;它通常指的是运行在后台的、持续…

Vue自定义成功弹窗H5实现类似于小程序的效果

效果图: <div class="father"><div class="success-box" v-if="isSuccess"><img src="../../assets/insure/success-logo.png" alt=""><span>{{ successTitle }}</span></div> </d…

Go、容器以及Linux调度器

在容器中运行Go应用程序时&#xff0c;需要设置合理的GOMAXPROCS&#xff0c;从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时&#xff0c;重要的一点是要设置CPU限制以确保容器不会耗…

Linux基础指令【下篇】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.时间指令----date1…

【EI会议征稿】第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024)

第三届大数据、区块链与经济管理国际学术会议 (ICBBEM 2024) The 3rd International Conference on Bigdata Blockchain and Economy Management 第三届大数据、区块链与经济管理国际学术会议(ICBBEM 2024)&#xff0c;将于2024年3月22-24日在中国南昌召开。大会由江西科技师…

SpringBoot01

一、SpringBoot项目中常见的依赖 1.1、spring-boot-starter-parent 这个是SpringBoot项目必须导入的依赖,这个父模块内部定义了springboot整合各个技术的依赖版本,降低版本的冲突。 <parent><artifactId>spring-boot-starter-parent</artifactId><group…

[git] windows系统安装git教程和配置

一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本&#xff0c;Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…

数据结构——图的存储结构

一、邻接矩阵 图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息&#xff0c;一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。 设图G 有n 个顶点&#xff0c;则邻接矩阵A 是一个n ∗ n 的方阵&#xff0c;定义为: 下图是一个…

MSB20M-ASEMI小功率家电专用MSB20M

编辑&#xff1a;ll MSB20M-ASEMI小功率家电专用MSB20M 型号&#xff1a;MSB20M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;2A 功率(Pd)&#xff1a;50W 芯片个数&#xff1a;4 引…

HarmonyOS使用Canvas绘制自定义图形

Entry Component struct CanvasSimple {//用来配置CanvasRenderingContext2D对象的参数&#xff0c;包括是否开启抗锯齿&#xff0c;true表明开启抗锯齿。private settings: RenderingContextSettings new RenderingContextSettings(true)//用来创建CanvasRenderingContext2D对…

重生奇迹MU中pk要掌握好哪些点

在重生奇迹MU中&#xff0c;PK是一个非常重要的游戏环节&#xff0c;需要玩家掌握一定的技巧和策略才能取得胜利。以下是一些掌握好的点&#xff0c;帮助玩家在PK中取得优势。 技能的选择和使用&#xff1a; 在重生奇迹MUPK中&#xff0c;选择正确的技能并熟练使用它们非常关…