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

import requests
from lxml import etree

获取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')

球员:乔尔-恩比德 - - - 球队: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)

在这里插入图片描述

  • 该角色有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)    
  • 获取这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)

在这里插入图片描述

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

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

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

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

import requests
from lxml import etree
import os
from time import sleepheaders = {'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]变为strnames = 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) 

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

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

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

<generator object at 0x0000029394AFACF0> 迭代器 在最左和最右加上方括号[ ]就会变成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) # 会抛出异常

xpath工具

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

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文档中的元素时经常使用的方法,掌握了这些方法,就可以方便地对文档进行操作了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中&#xff0c;子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中&#xff0c;方法重写是一种多态的表现形式&#xff0c;它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

基于单片机的点阵电子显示屏上下左右移加减速系统

一、系统方案 本设计的任务就是完成一个1616的点阵设计&#xff0c;并能滚动显示“********************”内容。 主要内容是&#xff0c;能同时流动显示汉字&#xff1b;能实现显示汉字无闪烁&#xff1b;能实屏幕亮度较高。本LED显示屏能够以动态扫描的方式显示一个1616点阵汉…

【WPF C#】PorphyStruct类卟啉和类咕啉的结构分析

前言 首先&#xff0c;热烈祝贺家姐申请到了国家自然科学基金&#xff08;8月底&#xff09;&#xff0c;找一些化学领域的程序和软件&#xff0c;助我姐一臂之力&#xff0c;顺便自己研究一下源码。 卟啉类化合物的结构分析 PorphyStruct&#xff0c;一种用于分析不同卟啉类非…

ac7260网卡不能连5g

之前路由器是双频&#xff0c;最近为了连物联网一堆&#xff0c;把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了&#xff0c;连4g可以&#xff0c;但是连5g网络就不行&#xff0c;连上却没网&#xff0c;导致网盘下东西慢。刚开始以为是tplink的易展问题&#xff0c;结果看…

【继RNN之后的一项技术】Transfomer 学习笔记

谷歌团队在17年的神作&#xff0c;论文17年6月发布 https://arxiv.org/abs/1706.03762 被NIPS2017收录&#xff0c;目前引用量已经逼近3w。 以下内容参考李沐老师的课程《动⼿学深度学习(Pytorch版)》 简介 注意力 自主性&#xff1a;有目的的搜索某样东西&#xff08;键&…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果&#xff08;Text Stroke&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

肖sir__设计测试用例方法之判定表06_(黑盒测试)

设计测试用例方法之判定表 1、判定表&#xff1a;是一种表达逻辑判断的工具。 2、判定表&#xff1a;包含四部分 1&#xff09;条件桩&#xff08;condition stub&#xff09;:列出问题的 所有条件&#xff08;通常条件次序无关紧要&#xff09;。 2&#xff09;条件项&#x…

【数学建模竞赛】优化类赛题常用算法解析

优化类建模 问题理解和建模&#xff1a;首先&#xff0c;需要深入理解问题&#xff0c;并将问题抽象为数学模型。这包括确定问题的目标函数、约束条件和决策变量。 模型分析和求解方法选择&#xff1a;对建立的数学模型进行分析&#xff0c;可以使用数学工具和方法&#xff0c;…

【STM32】学习笔记(串口通信)

串口通信 通信接口硬件电路电平标准USARTUSART框图 通信接口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#…

【Linux从入门到精通】通信 | 管道通信(匿名管道 命名管道)

本派你文章主要是对进程通信进行详解。主要内容是介绍 为什么通信、怎么进行通信。其中本篇文章主要讲解的是管道通信。希望本篇文章会对你有所帮助。 文章目录 一、进程通信简单介绍 1、1 什么是进程通信 1、2 为什么要进行通信 1、3 进程通信的方式 二、匿名管道 2、1 什么是…

LeetCode刷题笔记【25】:贪心算法专题-3(K次取反后最大化的数组和、加油站、分发糖果)

文章目录 前置知识1005.K次取反后最大化的数组和题目描述分情况讨论贪心算法 134. 加油站题目描述暴力解法贪心算法 135. 分发糖果题目描述暴力解法贪心算法 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】&#xff1a;贪心算法专题-1&#xff08;分发饼…