python爬取opgg的LOL英雄数据

Posted b1ing丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬取opgg的LOL英雄数据相关的知识,希望对你有一定的参考价值。

完整源码链接: https://pan.baidu.com/s/1MM2Pj-CBA2EnYtUJAtmruw   (加入了部分图形界面)

打包为.exe链接:  https://pan.baidu.com/s/13_gvYqgaZq9p921h6J4uUQ

由于爬取结果都是英语的版本,所以需要翻译。

另外的两个txt文件是翻译,已经完成了大部分基础的翻译,如想需要添加可以按格式填写

 

运行效果:

 

 

 

代码思路和步骤

首先第一步,是获得所有英雄的名字和对应的url:

  先观察网页的html,就能发现 <div>的data-champion-key属性中的就是英雄的名字,然后<a>的href属性就是英雄对应url

def weburl_get():
    url=\'http://www.op.gg\'
    addtion=\'/champion/statistics\'
    r=requests.get(url+addtion,headers=headers)
    soup=bs4.BeautifulSoup(r.text,\'html.parser\')

    #获取到英雄列表
    championList=soup.find(\'div\',class_=\'champion-index__champion-list\')

    #单个英雄div格式匹配
    pattern1=re.compile(\'(<div class="champion-index__champion-item .*?</div>)\')
    champion_list=re.findall(pattern1,str(championList))

    #将英雄名和网址作为一个字典
    web_champion={}
    for champion in champion_list:
        champion_soup=bs4.BeautifulSoup(champion,\'html.parser\')
        if (champion_soup.div)!=None and (champion_soup.div.a)!=None:
            web_champion[champion_soup.div[\'data-champion-key\']]=url+champion_soup.div.a[\'href\']
    return web_champion

 

然后第二步就是进入对应英雄的网页爬取相关数据:

  先爬取召唤师技能,登场率和胜率

    #获取召唤师技能和技能加点
    skill_tbody=champion_main.table.tbody   #得到第一个tbody也就是包含召唤师技能和加点
    #正则匹配召唤师技能名字
    skill_name=[]
    pattern2=re.compile(\'(<img .*?>)\')
    user_skill=re.findall(pattern2,str(skill_tbody))
    for skill in user_skill:
        skill_soup=bs4.BeautifulSoup(skill,\'html.parser\')
        skill_name_soup=bs4.BeautifulSoup(skill_soup.img[\'title\'],\'html.parser\')
        name=skill_name_soup.b.string
        if name in item.keys():
            name=item[name]
        skill_name.append(name)
    #正则匹配召唤师技能的登场率和胜率
    skill_rate=[]
    pattern3=re.compile(\'<strong>(.*?)</strong>\')
    rate_ls=re.findall(pattern3,str(skill_tbody))
    for rate in rate_ls:
        skill_rate.append(rate)
    #skill_rate为登场率胜率

  

  然后爬取英雄技能加点

    #获取技能加点
    skillAdd=skill_tbody.find_next_siblings(\'tbody\')
    pattern4=re.compile(r\'<td>([\\s,\\S]*?)</td>\')
    skill_add=re.findall(pattern4,str(skillAdd))
    skill_add=\'\'.join(skill_add)
    pattern5=re.compile(\'(\\w*?)\')
    skill_add=re.findall(pattern5,skill_add)
    skill_add=\'\'.join(skill_add)
    skill_master=[skill_add[3],skill_add[10]]    #skill_master为主技能,副技能
    # 1 2 3 4 5 6 7 8 10 11 12 14 15  索引对应的等级

  

  再爬取装备

    #获取装备信息
    equipment_tbody=champion_text.find_next_siblings(\'table\')[0].tbody
    equipment=[]
    pattern6=re.compile(r\'(<tr[\\s,\\S]*?</tr>)\')
    equipment_text=re.findall(pattern6,str(equipment_tbody))
    for text in equipment_text:
        tmp=[]
        #获取装备名
        pattern6=re.compile(\'(<li class="champion-stats__list__item tip"[\\s,\\S]*?</li>)\')
        tmp_equipment=re.findall(pattern6,text)
        ls=[]
        for i in tmp_equipment:
            temp=bs4.BeautifulSoup(i,\'html.parser\')
            temp1=bs4.BeautifulSoup(temp.li[\'title\'],\'html.parser\')
            if temp1.b.string in item.keys():
                ls.append(item[temp1.b.string])
            else:
                ls.append(temp1.b.string)
        tmp.append(ls)
        #获取登场率和胜率
        pattern7=re.compile(r\'<strong>(.*?)</strong>\')
        tmp.append(re.findall(pattern7,text))
        equipment.append(tmp)

    #equipment格式为:[[[装备],[登场率,胜率]]]

 

   最后爬取符文主系和副系

    #获取符文信息
    runes_tbody=champion_text.find_next_siblings(\'div\')[0].tbody
    runes_tag=runes_tbody.tr.td.div
    runes_div=runes_tag.div.find_next_siblings(\'div\')
    runes_div.append(runes_tag.div)
    rune_ls=[]
    for rune in runes_div:
        tmp=[]
        #匹配符文名
        pattern8=re.compile(r\'<div class="champion-stats-summary-rune__name">(.*?)</div>\')
        z=[]
        for i in re.findall(pattern8,str(rune.a)):
            s=i.split(\' + \')
            if s[0] in item.keys():
                s[0]=item[s[0]]
            if s[1] in item.keys():
                s[1]=item[s[1]]
            z=\' + \'.join(s)
        tmp.append(z)
        pattern9=re.compile(r\'<strong>(.*?)</strong>\')
        tmp.append(re.findall(pattern9,str(rune.a)))
        pattern10=re.compile(r\'<span>(\\d.*?)</span>\')
        tmp.append(re.findall(pattern10,str(rune.a)))
        rune_ls.append(tmp)
    #rune_ls格式为[[[符文名],[登场率],[胜率]]]

以上是关于python爬取opgg的LOL英雄数据的主要内容,如果未能解决你的问题,请参考以下文章

英雄联盟Python爬虫

英雄联盟Python爬虫

python爬虫,爬取lol所以英雄的资料

用Python爬取英雄联盟(lol)全部皮肤

如何利用 Python 爬取 LOL 高清精美壁纸?

python爬虫入门练习,使用正则表达式和requests爬取LOL官网皮肤