首页 > 其他分享 >爬取网站的背景是获取《王者荣耀》游戏中各个英雄的详细属性数据

爬取网站的背景是获取《王者荣耀》游戏中各个英雄的详细属性数据

时间:2023-06-06 19:34:30浏览次数:57  
标签:hero attr 王者 get url list 爬取 英雄 属性数据

一,选题背景

 

此次爬取网站的背景是获取《王者荣耀》游戏中各个英雄的详细属性数据,以便进行游戏分析和比较。《王者荣耀》是一款非常流行的多人在线战斗竞技游戏,拥有大量的英雄角色,每个英雄都有其独特的属性和技能。游戏玩家需要通过了解每个英雄的属性和技能,才能更好地制定游戏策略,提高游戏胜率。
因此,通过爬取官方网站上的英雄详情页面,可以得到所有英雄的详细属性数据,并将这些数据保存到一个 CSV 文件中,使得游戏玩家可以更加方便地进行游戏分析和比较。同时,这种方式也避免了手动查找每个英雄的属性数据的麻烦,提高了获取数据的效率。

二,主题式网络爬虫设计方案

1.主题式网络爬虫名称

王者荣耀页面爬取

2.主题式网络爬虫爬取的内容与数据特征分析

主题式网络爬虫是一种按照主题或目标进行网络爬取的方式,其目的是获取和提取与特定主题相关的数据。对于本次爬虫,主题就是《王者荣耀》游戏中各个英雄的属性数据。
从爬取到的数据特征来看,可以发现如下几点:
数据结构:本次爬虫使用了 Python 中的列表(list)和字典(dict)这两种数据结构来保存各个英雄的属性数据。在列表中,每个元素表示一个英雄的详细属性数据,包括英雄名称、属性星级、最大生命、最大法力、物理攻击、法术攻击、物理防御、法术防御、移动速度等信息。在字典中,键表示英雄属性名,值表示该属性的具体数值。这种数据结构使得数据的存储和提取更加方便和高效。
数据类型:本次爬虫抓取的数据主要是文本数据,其中包括英雄名称、属性数字、文字描述等。它们的数据类型为字符串(str)和整数(int)。
数据大小:本次爬虫爬取了所有英雄的属性数据,共计 99 个英雄,每个英雄的数据包含多个属性,因此数据量较大。但是,使用 CSV 格式进行保存后,数据的大小相对较小,只有几百 KB,在计算机中存储和处理都非常方便。
数据精度:本次爬虫抓取的数据具有一定的精度和准确性。由于数据来自于官方网站,因此可以保证数据的真实性和可靠性。在爬取和处理数据的过程中,程序也进行了一些排错和异常处理,进一步提高了数据的精度。
综上所述,通过主题式网络爬虫爬取的数据特征清晰、数据类型统一、数据大小适中、数据精度较高。这些特点使得数据的存储和处理更加方便和高效,也为后续的数据分析和建模提供了可靠的基础。、

3.主题式网络爬虫设计方案概述(包括实现思路与数据难点)

主题式网络爬虫的设计方案可以分为以下几步:
确定目标URL:确定需要爬取的目标网站URL,以及需要抽取的数据内容和字段。
确定爬虫框架:根据需求选择合适的爬虫框架,如 Python 中的 Scrapy 框架。
编写爬虫代码:利用指定的爬虫框架编写爬虫代码,完成对目标网站的爬取和数据抽取。具体实现过程包括通过 HTTP 请求获取网页、使用正则表达式或 XPath 表达式等方式提取需要的数据、将数据存储到本地或数据库等。
防止反爬措施:对于可能存在的反爬机制,采取相应的防范措施,如设置 User-Agent、使用 IP 代理等。
数据清洗和预处理:对爬取得到的数据进行清洗和预处理,如去除重复数据、去除无用字段、转换数据类型等,确保数据的准确性和一致性。
存储和导出:将经过清洗和预处理后的数据保存到指定的数据源中,如 CSV、数据库等,或者导出到其他格式的文件中。
技术难点方面,主要包括以下几点:
网页结构复杂:目标网站的网页结构可能比较复杂,需要通过特定的 HTML 解析技术,如正则表达式、XPath 等,才能提取需要的数据。
反爬处理:目标网站可能存在一些反爬机制,如限制 IP 访问次数、设置访问速度限制等。需要采用相应的反反爬手段,如设置慢速模式、使用 IP 代理等,以避免被封禁。
数据清洗和预处理:抓取到的数据质量可能不高,需要进行数据清洗和预处理,如去除空值、重复值、异常值等。
数据存储和导出:不同的数据格式和数据源都有其自身的特点和难点,需要根据具体情况选择合适的方案,如选择数据类型、设计数据库结构等。

三,主题页面的结构特征分析

1.主题页面的特征与特征分析

目标页面内容

 

2.Htmls 页面解析

 

四、网络爬虫程序设计

1.数据爬取与采集

 以下为爬取过程代码

import requests
from bs4 import BeautifulSoup

# 获取英雄列表页面中每个英雄的详情页面链接
def get_hero_url():
    # 打印开始爬取英雄链接的提示信息
    print('start to get hero urls')
    url = 'http://db.18183.com/'
    url_list = []
    # 发送 GET 请求获取英雄列表页面的 HTML 代码
    res = requests.get(url + 'wzry').text
    content = BeautifulSoup(res, "html.parser")
    # 从 HTML 中找到类名为 "mod-iconlist" 的列表
    ul = content.find('ul', attrs={'class': "mod-iconlist"})
    # 找到所有包含英雄详细资料链接的 <a> 标签
    hero_url = ul.find_all('a')
    # 遍历每一个 <a> 标签,获取其中的 href 属性并将其添加到列表 url_list 中
    for i in hero_url:
        url_list.append(i['href'])
    # 打印完成爬取英雄链接的提示信息
    print('finish get hero urls')
    return url_list


# 获取每个英雄的详细资料
def get_details(url):
    # 打印开始获取英雄详细资料的提示信息
    print('start to get details')
    base_url = 'http://db.18183.com/'
    detail_list = []
    # 遍历英雄链接列表,获取每个英雄页面的 HTML 代码,并从中提取出英雄的详细资料
    for i in url:
        # 发送 GET 请求获取英雄页面的 HTML 代码
        res = requests.get(base_url + i).text
        content = BeautifulSoup(res, "html.parser")
        # 从 HTML 中找到英雄名称和属性星级
        name_box = content.find('div', attrs={'class': 'name-box'})
        name = name_box.h1.text
        hero_attr = content.find('div', attrs={'class': 'attr-list'})
        attr_star = hero_attr.find_all('span')
        survivability = attr_star[0]['class'][1].split('-')[1]
        attack_damage = attr_star[1]['class'][1].split('-')[1]
        skill_effect = attr_star[2]['class'][1].split('-')[1]
        getting_started = attr_star[3]['class'][1].split('-')[1]
        # 从 HTML 中找到剩余的详细资料
        details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
        attrs = details.find_all('p')
        attr_list = []
        for attr in attrs:
            attr_list.append(attr.text.split(':')[1].strip())
        detail_list.append([name, survivability, attack_damage,
                            skill_effect, getting_started, attr_list])
    # 打印完成获取英雄详细资料的提示信息
    print('finish get details')
    return detail_list


# 将所有英雄的详细资料保存到 CSV 文件中
def save_tocsv(details):
    # 打印开始保存数据到 CSV 文件的提示信息
    print('start save to csv')
    with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
        # 写入 CSV 文件的表头
        f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
        # 将每个英雄的详细资料写入 CSV 文件中
        for i in details:
            try:
                rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                    i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                    i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                    i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                )
                f.write(rowcsv)
                f.write('\n')
            # 如果编码出现异常,跳过这条记录的写入
            except:
                continue
    # 打印完成保存数据到 CSV 文件的提示信息
    print('finish save to csv')


if __name__ == "__main__":
    # 获取所有英雄页面的链接
    get_hero_url()
    hero_url = get_hero_url()
    # 获取每个英雄的详细资料
    details = get_details(hero_url)
    # 将所有英雄的详细资料保存到 CSV 文件中
    save_tocsv(details)

现在我们获得了一个英雄数据表格

 

包含了我们所需要的所有数据

接下来进行数据清洗

 以及可视化分析

 

import requests
from bs4 import BeautifulSoup


def get_hero_url():
    print('start to get hero urls')
    url = 'http://db.18183.com/'
    url_list = []
    res = requests.get(url + 'wzry').text
    content = BeautifulSoup(res, "html.parser")
    ul = content.find('ul', attrs={'class': "mod-iconlist"})
    hero_url = ul.find_all('a')
    for i in hero_url:
        url_list.append(i['href'])
    print('finish get hero urls')
    return url_list


def get_details(url):
    print('start to get details')
    base_url = 'http://db.18183.com/'
    detail_list = []
    for i in url:
        # print(i)
        res = requests.get(base_url + i).text
        content = BeautifulSoup(res, "html.parser")
        name_box = content.find('div', attrs={'class': 'name-box'})
        name = name_box.h1.text
        hero_attr = content.find('div', attrs={'class': 'attr-list'})
        attr_star = hero_attr.find_all('span')
        survivability = attr_star[0]['class'][1].split('-')[1]
        attack_damage = attr_star[1]['class'][1].split('-')[1]
        skill_effect = attr_star[2]['class'][1].split('-')[1]
        getting_started = attr_star[3]['class'][1].split('-')[1]
        details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
        # print(details)
        attrs = details.find_all('p')
        attr_list = []
        for attr in attrs:
            attr_list.append(attr.text.split(':')[1].strip())
        detail_list.append([name, survivability, attack_damage,
                            skill_effect, getting_started, attr_list])
    print('finish get details')
    return detail_list


def save_tocsv(details):
    print('start save to csv')
    with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
        f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
        for i in details:
            try:
                rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                    i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                    i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                    i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                )
                f.write(rowcsv)
                f.write('\n')
            except:
                continue
    print('finish save to csv')


if __name__ == "__main__":
    get_hero_url()
    hero_url = get_hero_url()
    details = get_details(hero_url)
    save_tocsv(details)

 

运行后所产生的图像为以下条形图

 

 

 从中可以看出英雄的生存能力评分

5.数据持久化

import requests
from bs4 import BeautifulSoup
import shelve

# 打开 shelve 文件
with shelve.open('wzry_data') as db:
    # 获取英雄列表页面中每个英雄的详情页面链接
    def get_hero_url():
        # 打印开始爬取英雄链接的提示信息
        print('开始获取英雄链接...')
        url = 'http://db.18183.com/'
        url_list = []
        # 发送 GET 请求获取英雄列表页面的 HTML 代码
        res = requests.get(url + 'wzry').text
        content = BeautifulSoup(res, "html.parser")
        # 从 HTML 中找到类名为 "mod-iconlist" 的列表
        ul = content.find('ul', attrs={'class': "mod-iconlist"})
        # 找到所有包含英雄详细资料链接的 <a> 标签
        hero_url = ul.find_all('a')
        # 遍历每一个 <a> 标签,获取其中的 href 属性并将其添加到列表 url_list 中
        for i in hero_url:
            url_list.append(i['href'])
        # 将数据保存到 shelve 文件中
        db['url_list'] = url_list
        # 打印完成爬取英雄链接的提示信息
        print('完成获取英雄链接。')
        return url_list


    # 获取每个英雄的详细资料
    def get_details(url):
        # 打印开始获取英雄详细资料的提示信息
        print('开始获取英雄详细资料...')
        base_url = 'http://db.18183.com/'
        detail_list = []
        # 遍历英雄链接列表,获取每个英雄页面的 HTML 代码,并从中提取出英雄的详细资料
        for i in url:
            # 发送 GET 请求获取英雄页面的 HTML 代码
            res = requests.get(base_url + i).text
            content = BeautifulSoup(res, "html.parser")
            # 从 HTML 中找到英雄名称和属性星级
            name_box = content.find('div', attrs={'class': 'name-box'})
            name = name_box.h1.text
            hero_attr = content.find('div', attrs={'class': 'attr-list'})
            attr_star = hero_attr.find_all('span')
            survivability = attr_star[0]['class'][1].split('-')[1]
            attack_damage = attr_star[1]['class'][1].split('-')[1]
            skill_effect = attr_star[2]['class'][1].split('-')[1]
            getting_started = attr_star[3]['class'][1].split('-')[1]
            # 从 HTML 中找到剩余的详细资料
            details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
            attrs = details.find_all('p')
            attr_list = []
            for attr in attrs:
                attr_list.append(attr.text.split(':')[1].strip())
            detail_list.append([name, survivability, attack_damage,
                                skill_effect, getting_started, attr_list])
        # 将数据保存到 shelve 文件中
        db['detail_list'] = detail_list
        # 打印完成获取英雄详细资料的提示信息
        print('完成获取英雄详细资料。')
        return detail_list


    # 将所有英雄的详细资料保存到 CSV 文件中
    def save_tocsv(details):
        # 打印开始保存数据到 CSV 文件的提示信息
        print('开始保存数据到 CSV 文件...')
        with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
            # 写入 CSV 文件的表头
            f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                    '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                    '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
            # 将每个英雄的详细资料写入 CSV 文件中
            for i in details:
                try:
                    rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                        i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                        i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                        i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                    )
                    f.write(rowcsv)
                    f.write('\n')
                # 如果编码出现异常,跳过这条记录的写入
                except:
                    continue
        # 打印完成保存数据到 CSV 文件的提示信息
        print('完成保存数据到 CSV 文件。')


    if __name__ == "__main__":
        # 尝试从 shelve 文件中获取数据
        url_list = db.get('url_list')
        detail_list = db.get('detail_list')
        # 如果 shelve 文件中没有数据,则进行爬取
        if url_list is None or detail_list is None:
            # 获取所有英雄页面的链接
            url_list = get_hero_url()
            # 获取每个英雄的详细资料
            detail_list = get_details(url_list)
        # 将所有英雄的详细资料保存到 CSV 文件中
        save_tocsv(detail_list)

在这个示例中,我们使用了SQLite数据库来创建名为"lottery_data.db"的数据库文件,并创建了一个名为"lottery"的表。然后,我们将从网页中提取的数据插入到该表中。

请注意,这只是一个示例,您可以根据自己的需求进行修改和扩展。另外,您需要安装SQLite库(通常已内置在Python中)来运行这段代码。

通过使用数据库进行数据持久化处理,您可以更方便地进行数据管理和查询操作。

6.将以上各部分的代码汇总,附上完整程序代码

 (1)爬虫代码部分

import requests
from bs4 import BeautifulSoup

# 获取英雄列表页面中每个英雄的详情页面链接
def get_hero_url():
    # 打印开始爬取英雄链接的提示信息
    print('start to get hero urls')
    url = 'http://db.18183.com/'
    url_list = []
    # 发送 GET 请求获取英雄列表页面的 HTML 代码
    res = requests.get(url + 'wzry').text
    content = BeautifulSoup(res, "html.parser")
    # 从 HTML 中找到类名为 "mod-iconlist" 的列表
    ul = content.find('ul', attrs={'class': "mod-iconlist"})
    # 找到所有包含英雄详细资料链接的 <a> 标签
    hero_url = ul.find_all('a')
    # 遍历每一个 <a> 标签,获取其中的 href 属性并将其添加到列表 url_list 中
    for i in hero_url:
        url_list.append(i['href'])
    # 打印完成爬取英雄链接的提示信息
    print('finish get hero urls')
    return url_list


# 获取每个英雄的详细资料
def get_details(url):
    # 打印开始获取英雄详细资料的提示信息
    print('start to get details')
    base_url = 'http://db.18183.com/'
    detail_list = []
    # 遍历英雄链接列表,获取每个英雄页面的 HTML 代码,并从中提取出英雄的详细资料
    for i in url:
        # 发送 GET 请求获取英雄页面的 HTML 代码
        res = requests.get(base_url + i).text
        content = BeautifulSoup(res, "html.parser")
        # 从 HTML 中找到英雄名称和属性星级
        name_box = content.find('div', attrs={'class': 'name-box'})
        name = name_box.h1.text
        hero_attr = content.find('div', attrs={'class': 'attr-list'})
        attr_star = hero_attr.find_all('span')
        survivability = attr_star[0]['class'][1].split('-')[1]
        attack_damage = attr_star[1]['class'][1].split('-')[1]
        skill_effect = attr_star[2]['class'][1].split('-')[1]
        getting_started = attr_star[3]['class'][1].split('-')[1]
        # 从 HTML 中找到剩余的详细资料
        details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
        attrs = details.find_all('p')
        attr_list = []
        for attr in attrs:
            attr_list.append(attr.text.split(':')[1].strip())
        detail_list.append([name, survivability, attack_damage,
                            skill_effect, getting_started, attr_list])
    # 打印完成获取英雄详细资料的提示信息
    print('finish get details')
    return detail_list


# 将所有英雄的详细资料保存到 CSV 文件中
def save_tocsv(details):
    # 打印开始保存数据到 CSV 文件的提示信息
    print('start save to csv')
    with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
        # 写入 CSV 文件的表头
        f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
        # 将每个英雄的详细资料写入 CSV 文件中
        for i in details:
            try:
                rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                    i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                    i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                    i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                )
                f.write(rowcsv)
                f.write('\n')
            # 如果编码出现异常,跳过这条记录的写入
            except:
                continue
    # 打印完成保存数据到 CSV 文件的提示信息
    print('finish save to csv')


if __name__ == "__main__":
    # 获取所有英雄页面的链接
    get_hero_url()
    hero_url = get_hero_url()
    # 获取每个英雄的详细资料
    details = get_details(hero_url)
    # 将所有英雄的详细资料保存到 CSV 文件中
    save_tocsv(details)

(2)数据清洗加可视化代码

import requests
from bs4 import BeautifulSoup


def get_hero_url():
    print('start to get hero urls')
    url = 'http://db.18183.com/'
    url_list = []
    res = requests.get(url + 'wzry').text
    content = BeautifulSoup(res, "html.parser")
    ul = content.find('ul', attrs={'class': "mod-iconlist"})
    hero_url = ul.find_all('a')
    for i in hero_url:
        url_list.append(i['href'])
    print('finish get hero urls')
    return url_list


def get_details(url):
    print('start to get details')
    base_url = 'http://db.18183.com/'
    detail_list = []
    for i in url:
        # print(i)
        res = requests.get(base_url + i).text
        content = BeautifulSoup(res, "html.parser")
        name_box = content.find('div', attrs={'class': 'name-box'})
        name = name_box.h1.text
        hero_attr = content.find('div', attrs={'class': 'attr-list'})
        attr_star = hero_attr.find_all('span')
        survivability = attr_star[0]['class'][1].split('-')[1]
        attack_damage = attr_star[1]['class'][1].split('-')[1]
        skill_effect = attr_star[2]['class'][1].split('-')[1]
        getting_started = attr_star[3]['class'][1].split('-')[1]
        details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
        # print(details)
        attrs = details.find_all('p')
        attr_list = []
        for attr in attrs:
            attr_list.append(attr.text.split(':')[1].strip())
        detail_list.append([name, survivability, attack_damage,
                            skill_effect, getting_started, attr_list])
    print('finish get details')
    return detail_list


def save_tocsv(details):
    print('start save to csv')
    with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
        f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
        for i in details:
            try:
                rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                    i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                    i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                    i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                )
                f.write(rowcsv)
                f.write('\n')
            except:
                continue
    print('finish save to csv')


if __name__ == "__main__":
    get_hero_url()
    hero_url = get_hero_url()
    details = get_details(hero_url)
    save_tocsv(details)

(3)数据持久化代码

import requests
from bs4 import BeautifulSoup
import shelve

# 打开 shelve 文件
with shelve.open('wzry_data') as db:
    # 获取英雄列表页面中每个英雄的详情页面链接
    def get_hero_url():
        # 打印开始爬取英雄链接的提示信息
        print('开始获取英雄链接...')
        url = 'http://db.18183.com/'
        url_list = []
        # 发送 GET 请求获取英雄列表页面的 HTML 代码
        res = requests.get(url + 'wzry').text
        content = BeautifulSoup(res, "html.parser")
        # 从 HTML 中找到类名为 "mod-iconlist" 的列表
        ul = content.find('ul', attrs={'class': "mod-iconlist"})
        # 找到所有包含英雄详细资料链接的 <a> 标签
        hero_url = ul.find_all('a')
        # 遍历每一个 <a> 标签,获取其中的 href 属性并将其添加到列表 url_list 中
        for i in hero_url:
            url_list.append(i['href'])
        # 将数据保存到 shelve 文件中
        db['url_list'] = url_list
        # 打印完成爬取英雄链接的提示信息
        print('完成获取英雄链接。')
        return url_list


    # 获取每个英雄的详细资料
    def get_details(url):
        # 打印开始获取英雄详细资料的提示信息
        print('开始获取英雄详细资料...')
        base_url = 'http://db.18183.com/'
        detail_list = []
        # 遍历英雄链接列表,获取每个英雄页面的 HTML 代码,并从中提取出英雄的详细资料
        for i in url:
            # 发送 GET 请求获取英雄页面的 HTML 代码
            res = requests.get(base_url + i).text
            content = BeautifulSoup(res, "html.parser")
            # 从 HTML 中找到英雄名称和属性星级
            name_box = content.find('div', attrs={'class': 'name-box'})
            name = name_box.h1.text
            hero_attr = content.find('div', attrs={'class': 'attr-list'})
            attr_star = hero_attr.find_all('span')
            survivability = attr_star[0]['class'][1].split('-')[1]
            attack_damage = attr_star[1]['class'][1].split('-')[1]
            skill_effect = attr_star[2]['class'][1].split('-')[1]
            getting_started = attr_star[3]['class'][1].split('-')[1]
            # 从 HTML 中找到剩余的详细资料
            details = content.find('div', attrs={'class': 'otherinfo-datapanel'})
            attrs = details.find_all('p')
            attr_list = []
            for attr in attrs:
                attr_list.append(attr.text.split(':')[1].strip())
            detail_list.append([name, survivability, attack_damage,
                                skill_effect, getting_started, attr_list])
        # 将数据保存到 shelve 文件中
        db['detail_list'] = detail_list
        # 打印完成获取英雄详细资料的提示信息
        print('完成获取英雄详细资料。')
        return detail_list


    # 将所有英雄的详细资料保存到 CSV 文件中
    def save_tocsv(details):
        # 打印开始保存数据到 CSV 文件的提示信息
        print('开始保存数据到 CSV 文件...')
        with open('all_hero_init_attr_new.csv', 'w', encoding='gb18030') as f:
            # 写入 CSV 文件的表头
            f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
                    '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
                    '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
            # 将每个英雄的详细资料写入 CSV 文件中
            for i in details:
                try:
                    rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
                        i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
                        i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
                        i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
                    )
                    f.write(rowcsv)
                    f.write('\n')
                # 如果编码出现异常,跳过这条记录的写入
                except:
                    continue
        # 打印完成保存数据到 CSV 文件的提示信息
        print('完成保存数据到 CSV 文件。')


    if __name__ == "__main__":
        # 尝试从 shelve 文件中获取数据
        url_list = db.get('url_list')
        detail_list = db.get('detail_list')
        # 如果 shelve 文件中没有数据,则进行爬取
        if url_list is None or detail_list is None:
            # 获取所有英雄页面的链接
            url_list = get_hero_url()
            # 获取每个英雄的详细资料
            detail_list = get_details(url_list)
        # 将所有英雄的详细资料保存到 CSV 文件中
        save_tocsv(detail_list)

五、总结

这段代码是一个 Python 爬虫程序,通过爬取游戏《王者荣耀》官网的英雄列表页面和每个英雄的详情页面,获取每个英雄的详细属性,并将其保存到一个 CSV 文件中。

该代码主要分为三部分:

get_hero_url 函数:用于获取所有英雄的详情页面链接。首先发送 GET 请求获取英雄列表页面的 HTML 代码,然后从 HTML 代码中找到包含英雄详细资料链接的 <a> 标签,遍历每个 <a> 标签,获取其中的 href 属性并将其添加到列表 url_list 中。
get_details 函数:用于获取每个英雄的详细资料。遍历英雄链接列表,获取每个英雄页面的 HTML 代码,并从中提取出英雄的详细资料,包括英雄名称、属性星级、最大生命、最大法力、物理攻击、法术攻击、物理防御、法术防御、移动速度等信息。
save_tocsv 函数:将所有英雄的详细资料保存到 CSV 文件中。先打开 CSV 文件,然后将每个英雄的详细资料写入 CSV 文件中。
在主程序中,首先尝试从 shelve 文件中获取数据。如果 shelve 文件中没有数据,则调用 get_hero_url 函数获取所有英雄的链接,调用 get_details 函数获取每个英雄的详细资料,并将这些数据保存到 shelve 文件中。然后,调用 save_tocsv 函数将所有英雄的详细资料保存到 CSV 文件中。

需要注意的是,在该程序中涉及到了一些 Python 库和模块,包括 requests、BeautifulSoup 和 shelve 等。其中,requests 库用于发送 HTTP 请求以获取 HTML 代码,BeautifulSoup 库用于解析 HTML 代码,shelve 模块用于持久化存储数据。除此之外,该程序还使用了一些 Python 的基本语法,如函数定义、条件语句、循环等。

 

标签:hero,attr,王者,get,url,list,爬取,英雄,属性数据
From: https://www.cnblogs.com/grj12345/p/17461491.html

相关文章

  • python爬取图片
    希望用python爬取京东手机图片,但是pdb调试发现期望用来保存匹配的图片的列表一直是空怀疑两个原因:获取到的要匹配关键字的html网页有问题正则表达式没写对将获取到的要匹配关键字的html的字符串写入txt,以utf-8解码,看看是否能查到浏览器打开html搜索到的关键字发现str(urll......
  • 04 Xpath_[实例]爬取maoyan
    目录Xpathlxml库的安装和使用提取的内容代码生成的csv下载的图片参考文档Xpathlxml库的安装和使用提取的内容随意选取的一段节点包含的影片信息,如下所示:<dd> <iclass="board-indexboard-index-1">1</i> <ahref="/films/1200486"title="我不是药神"class="image-link&quo......
  • Python爬取郑州安居客租房数据采集分析
    一、选题背景在现在,虽然我国实行楼市调控,使得总体的房价稳定下来,但是我国房价还是处于一个高水平之上。在这种情况下,大批在郑奋斗的年轻人选择租房,所以此次数据分析可以使在郑的年轻人了解郑州租房现状,让年轻人在租房时可以选到更加适合的房源。二、爬虫设计方案1、爬虫网址郑......
  • 【Python网络爬虫课程设计】B站up主——老番茄视频数据爬取+数据可视化分析
    一、选题背景1.背景随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。对于身为数据科学与大数据技术专业的学生来说,网络......
  • 在B站爬取坤坤的视频,并获取视频基本信息
    在B站有许多坤坤的视频,作为一名ikun,让我们写个爬虫研究一下视频的视频的名字、链接、观看次数、弹幕、发布时间以及作者。我们用selenium来实现这个爬虫,由于要获取的数据比较多,我们写几个函数来实现这个爬虫。先倒入需要用到的库,包括selenium,time,BeautifulSoup,ChromeDriver......
  • python爬虫爬取快手视频多线程下载功能【fd的使用】
    环境:python2.7+win10工具:fiddlerpostman安卓模拟器首先,打开fiddler,fiddler作为http/https抓包神器,这里就不多介绍。配置允许https 配置允许远程连接也就是打开http代理 电脑ip:192.168.1.110然后确保手机和电脑是在一个局域网下,可以通信。由于我这边没有安卓......
  • 记录:一次爬取gitee项目名称和url
    items:classGiteeItem(scrapy.Item):link=scrapy.Field()desc=scrapy.Field()passdb:importemojiimportpymysqlconnect=pymysql.connect(host='localhost',user='root',password='root',db='mindsa',......
  • Python网络爬虫对汽车团购报名的爬取及分析
    一、选题的背景(10分)现如今汽车已逐步进入家庭中,对于一些准备购入新车的家庭,犹豫不决,不知道现在市场上与车友们推荐的哪些车,此次爬虫项目将对网上的团购排名进行爬取,更能简单直观的让大家依据个人情况来挑选自己中意的车辆详情。二、设计方案(20分)主题式网络爬虫名称    ......
  • 基于Selenium库的python爬虫脚本,爬取painterest上的图片
    基于Selenium库的python爬虫脚本,爬取painterest上的图片问题背景Pinterest是一个社交媒体平台,它提供了一个虚拟的个人兴趣画板,让用户可以收集和分享他们喜欢的图片、视频和链接。上面有许多优秀的图片供浏览和下载,但是一个个点图片下载非常麻烦。于是想要用Python语言写一个自......
  • 如何防止网站被爬虫爬取的几种办法
     今天想对一个问题进行分析和讨论,就是关于爬虫对网站页面爬取的问题,有些网站通过爬虫去采集其它的网站页面信息作为己用,大量的爬取行为会对web服务器有比较性能有影响,主要的表现就是会变得很慢。对于如何防止网站被爬取,我想从以下几种方法去分析:1.基于程序本身去防止爬取:作为爬虫......