Python爬取英魂之刃高清大图

Python爬取英魂之刃英雄图片

  • 思路分析

官网url
爬取的目标是下图中全部英雄的高清大图。
爬取的目的图片
1. 打开F12, 搜索任意一个英雄名字,发现一个都不存在,那么这个页面呈现出来的数据是通过动态加载出来的,源代码里面并没有这些img标签。
2. 依旧打开开发者工具,切换到network进行抓包,刷新页面,获得一个yhzr_hero_list.js?_=1615104365057,打开preview选项,可以看到有一个json对象如下
json对象
3. 随意打开一个英雄具体资料,右击在新标签页中打开大图,可以看到这个图片的地址链接为:
狼蛛
4. 在第2步的时候,我们找到狼蛛在这个json里的信息,发现狼蛛对应的hero_id为136001,看到上图图片的地址链接里恰好也有一个1360010011.jpg,刚好与hero_id重名,后面多了一个0011,继续找多个图片地址验证,可以得出结论,图片的地址链接里面有一个hero_id合上0011。那么可以据此推出所有的图片地址。
5. 向每一个子页面发起get请求,并创建一个英魂之刃图片合集的目录,请求图片的二进制数据并下载下来保存到本地


  • 成果展示

    1. 最后的结果就是下面的了:
      在这里插入图片描述

    2. 这里还存在一个问题,就是有一些图片没有显示,找到瑞鼠小仙这张图片,回到浏览器打开对应的图片地址,可以看到:
      在这里插入图片描述
      瑞鼠小仙对应的地址不是https://wjdown.99.com/games/cos/upload/yhzrheroheadimg/bg/1710010011.jpg,后面的数字是rsxxdt.png!同理,其他出问题的图片都存在类似的问题,也就是说不是所有的图片都是规律有序的,俺还在想怎么解决这个问题,或许用selenium可以避免上面的问题出现。

    3. 总结:这次爬虫不算难,没有ua检测,防盗链之类的反爬,把逻辑思维理清,结合requests和re就能实现


  • 代码实现

import requests
import re
import os

heroes_info_url = 'https://wjdown.99.com/games/cos/upload/yhzrheroattr/yhzr_hero_list.js?_=1615084782500'
detail_hero_url_list = []
detail_hero_name_list = []

def get_hero_info():
    '''
    从英雄资料页面获得每一个英雄对应的图片链接和名字
    :return:
    '''
    resp = requests.get(url=heroes_info_url)
    # id值为4到六位的数字串
    id_name_pat = r'"hero_id":"(?P<ID>\d{4,6}).*?"name":"(?P<name>.*?)"'
    heroes_info = re.finditer(id_name_pat, resp.text)
    for i in heroes_info:
        detail_hero_url_list.append(f'https://wjdown.99.com/games/cos/upload/yhzrheroheadimg/bg/{i.group("ID")}0011.jpg')
        # 这里拿到的name是json字段的,需要转化格式
        irregular_str = i.group('name')
        china_char = eval(f'"{irregular_str}"')
        detail_hero_name_list.append(china_char)

def keep_in_file():
    '''
    向每个子页面发起请求,将图片下载保存下来
    :return:
    '''
    if not os.path.exists('./英魂之刃图片合集'):
        os.mkdir('./英魂之刃图片合集')
    for url, name in zip(detail_hero_url_list, detail_hero_name_list):
        img_data = requests.get(url=url).content
        with open(f'./英魂之刃图片合集/{name}.{url.split(".")[-1]}', mode='wb') as fp:
            fp.write(img_data)
            print(f'{name}图片下载完成')
    print(f'可以在{os.getcwd()}\英魂之刃图片合集目录下可以看到下载后的图片')


if __name__ == '__main__':
    get_hero_info()
    keep_in_file()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值