• python-爬虫-xpath方法-批量爬取王者皮肤图片


    import requests
    from lxml import etree
    
    • 1
    • 2

    获取NBA成员信息

    # 发送的地址
    url = 'https://nba.hupu.com/stats/players'
    # UA 伪装  google
    header = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    r = requests.get(url)
    # print(r.text)  # jupyter 打印可以看到格式化的html数据
    # 将HTML文本解析成Element对象
    e = etree.HTML(r.text)
    players = e.xpath('//*[@id="data_js"]/div[4]/div/table/tbody/tr/td[2]/a/text()')
    teams = e.xpath('//*[@id="data_js"]/div[4]/div/table/tbody/tr/td[3]/a/text()')
    # 保存到txt文件
    with open('nba.txt','w',encoding='utf-8') as f:
        for player,team in zip(players,teams):
            f.write(f'球员:{player} - - - 球队:{team}\n')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    球员:乔尔-恩比德 - - - 球队:76人
    球员:卢卡-东契奇 - - - 球队:独行侠
    球员:达米安-利拉德 - - - 球队:开拓者

    批量爬取王者荣耀皮肤图片

    在这里插入图片描述

    • 爬取一张图片
    url = 'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-7.jpg'
    r = requests.get(url)
    # 保存图片
    # w write b 二进制
    with open('a.jpg','wb') as f:
        f.write(r.content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    • 该角色有7个皮肤 爬取7个图片
    for i in range(1,8):
        url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-{i}.jpg'
        r = requests.get(url)
        with open(f'{i}.jpg','wb') as f:
            f.write(r.content)    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 获取这7个皮肤的名字 保存图片
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69'
    }
    url = 'https://pvp.qq.com/web201605/herodetail/505.shtml'
    r = requests.get(url,headers=headers)
    r.encoding='gbk'
    e = etree.HTML(r.text)
    # e.xpath 返回一个列表  使用索引[0]变为str
    names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0]  # '鹿灵守心&0|森&0|遇见神鹿&71|时之祈愿&94|时之愿境&42|山海·碧波行&109|真我赫兹&117'
    # names.split('|') # split只能用于str,不能用于list  # ['鹿灵守心&0', '森&0', '遇见神鹿&71', '时之祈愿&94', '时之愿境&42', '山海·碧波行&109', '真我赫兹&117']
    names = [name[0:name.index('&')] for name in names.split('|')] # ['鹿灵守心', '森', '遇见神鹿', '时之祈愿', '时之愿境', '山海·碧波行', '真我赫兹']
    for i,n in enumerate(names):
        url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/505/505-bigskin-{i+1}.jpg'
        r = requests.get(url)
        with open(f'{n}.jpg','wb') as f:
            f.write(r.content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    • 获取所有英雄皮肤
      在这里插入图片描述

    把该行网址复制到网址栏,会自动下载该文件

    https://pvp.qq.com/web201605/js/herolist.json

    该文件内容如下,有英雄的各种信息
    每个花括号 { } 是一个json数据
    在这里插入图片描述

    import requests
    from lxml import etree
    import os
    from time import sleep
    
    
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69'
    }
    url = 'https://pvp.qq.com/web201605/js/herolist.json'
    r = requests.get(url,headers=headers)
    for x in r.json():
        ename = x.get('ename')  # 数字  url里面变化的那个数字
        cname = x.get('cname')  # 英雄的名字
        
        if not os.path.exists(cname):
            os.makedirs(cname)
            
        urlone = f'https://pvp.qq.com/web201605/herodetail/{ename}.shtml'
        r = requests.get(url=urlone,headers=headers)
        r.encoding='gbk'
        e = etree.HTML(r.text)
        # e.xpath 返回一个列表  使用索引[0]变为str
        names = e.xpath('//ul[@class="pic-pf-list pic-pf-list3"]/@data-imgname')[0]  # '鹿灵守心&0|森&0|遇见神鹿&71|时之祈愿&94|时之愿境&42|山海·碧波行&109|真我赫兹&117'
        # names.split('|') # split只能用于str,不能用于list  # ['鹿灵守心&0', '森&0', '遇见神鹿&71', '时之祈愿&94', '时之愿境&42', '山海·碧波行&109', '真我赫兹&117']
        names = [name[0:name.index('&')] for name in names.split('|')] # ['鹿灵守心', '森', '遇见神鹿', '时之祈愿', '时之愿境', '山海·碧波行', '真我赫兹']
        for i,n in enumerate(names):
            url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{ename}/{ename}-bigskin-{i+1}.jpg'
            r = requests.get(url)
            with open(f'{cname}/{n}.jpg','wb') as f:
                f.write(r.content) 
            print(f'{n}已下载')
            sleep(1) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    部分图片展示
    在这里插入图片描述
    xpath分析
    在这里插入图片描述

    //ul[@class=“pic-pf-list pic-pf-list3”]/@data-imgname

    asd = '鹿灵守心&0'
    asd.index('心')  # 3  # 心在index3的位置
    
    • 1
    • 2

    迭代器 在最左和最右加上方括号[ ]就会变成str

    os.makedirs and os.mkdir

    os.makedirs和os.mkdir都是用于创建目录的函数,但有以下区别:

    1. os.mkdir只能创建一级目录,而os.makedirs可以同时创建多级目录。

    2. 如果要创建的目录已经存在,os.mkdir会抛出FileExistsError异常,而os.makedirs不会抛出异常。

    3. os.makedirs还可以通过设置exist_ok参数来控制是否抛出异常。如果exist_ok为True,表示即使目录已经存在也不会抛出异常,如果为False,则会抛出异常。

    示例代码:

    import os
    
    # 创建单级目录
    os.mkdir('dir1')
    # 创建多级目录
    os.makedirs('dir2/subdir1/subdir2')
    
    # 创建已存在的目录
    os.mkdir('dir1') # 会抛出异常
    os.makedirs('dir2/subdir1/subdir2') # 不会抛出异常
    
    # 创建已存在的目录时,设置exist_ok参数
    os.makedirs('dir2/subdir1/subdir2', exist_ok=True) # 不会抛出异常
    os.makedirs('dir2/subdir1/subdir2', exist_ok=False) # 会抛出异常
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    xpath工具

    # 将HTML文档加载进来
    html = etree.parse('demo.html')
    
    # 将HTML文档解析成Element对象
    root = html.getroot()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Python爬虫中,使用xpath提取HTML或XML文档中的元素是非常常见的操作。下面是etree库中xpath常用的方法:

    1. xpath():在文档中使用xpath表达式进行查找,返回匹配的元素列表。

    2. find():在文档中查找匹配xpath表达式的第一个元素,返回元素对象。

    3. findall():在文档中查找匹配xpath表达式的所有元素,返回元素对象列表。

    4. text属性:获取元素的文本内容。

    5. attrib属性:获取元素的属性。

    6. get()方法:获取指定属性的值。

    7. iter()方法:获取文档中所有匹配xpath表达式的元素,返回迭代器对象。

    8. Element()方法:创建一个新的元素对象。

    9. SubElement()方法:在指定元素下创建一个新的子元素。

    10. ElementTree()方法:创建一个新的XML文档树对象。

    以上这些方法是在使用xpath提取HTML或XML文档中的元素时经常使用的方法,掌握了这些方法,就可以方便地对文档进行操作了。

  • 相关阅读:
    【Mongodb数据库】的介绍和安装(windows下和ubuntu16.04下安装及启动)
    eclipse tomcat setting
    虚拟DOM与diff算法
    kafka 3.5 主题分区的Follower创建Fetcher线程从Leader拉取数据源码
    elasticsearch配置
    Taro+react问题集合
    gee引擎修改UI界面图文教程
    Hugging Face x LangChain: 全新 LangChain 合作伙伴包
    Github操作
    nodejs+vue+elementui汽车出入库零配件4S服务管理系统python-java
  • 原文地址:https://blog.csdn.net/weixin_64729620/article/details/132699118