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都是用于创建目录的函数,但有以下区别:
-
os.mkdir只能创建一级目录,而os.makedirs可以同时创建多级目录。
-
如果要创建的目录已经存在,os.mkdir会抛出FileExistsError异常,而os.makedirs不会抛出异常。
-
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常用的方法:
-
xpath():在文档中使用xpath表达式进行查找,返回匹配的元素列表。 -
find():在文档中查找匹配xpath表达式的第一个元素,返回元素对象。 -
findall():在文档中查找匹配xpath表达式的所有元素,返回元素对象列表。 -
text属性:获取元素的文本内容。 -
attrib属性:获取元素的属性。 -
get()方法:获取指定属性的值。 -
iter()方法:获取文档中所有匹配xpath表达式的元素,返回迭代器对象。 -
Element()方法:创建一个新的元素对象。 -
SubElement()方法:在指定元素下创建一个新的子元素。 -
ElementTree()方法:创建一个新的XML文档树对象。
以上这些方法是在使用xpath提取HTML或XML文档中的元素时经常使用的方法,掌握了这些方法,就可以方便地对文档进行操作了。
相关文章:
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.3…...
go锁--读写锁
每个锁分为读锁和写锁,写锁互斥 没有加写锁时,多个协程都可以加读锁 加了写锁时,无法加读锁,读协程排队等待 加了读锁,写锁排队等待 Mutex用来写协程之间互斥等待 读协程使用readerSem等待写锁的释放 写协程使用writer…...
Unity中Shader的屏幕坐标
文章目录 前言一、屏幕坐标1、屏幕像素的坐标2、屏幕坐标归一化 二、在Unity中获取 当前屏幕像素 和 总像素1、获取屏幕总像素,使用_ScreenParams参数2、获取当前片段上的像素怎么使用:在片元着色器传入参数时使用 前言 Unity中Shader的屏幕坐标 一、屏幕坐标 1、屏幕像素的坐…...
springboot MongoDB 主从 多数据源
上一篇,我写了关于用一个map管理mongodb多个数据源(每个数据源,只有单例)的内容。 springboot mongodb 配置多数据源 临到部署到阿里云的测试环境,发现还需要考虑一下主从的问题,阿里云买的数据库&#x…...
【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析
目录 1 描述性统计(Descriptive Statistics) 2 数据分组和聚合 3 数据透视表 4 相关性分析 1 描述性统计(Descriptive Statistics) 描述性统计是一种用于汇总和理解数据集的方法,它提供了关于数据分布、集中趋势和…...
Unity 切换场景后场景变暗
问题 Unity版本:2019.4.34f1c1 主场景只有UI,没有灯光,天空盒;其他场景有灯光和天空盒所有场景不烘焙主场景作为启动场景运行,切换到其他场景,场景变暗某一个场景作为启动场景运行,光影效果正…...
RabbitMQ学习笔记
1、什么是MQ? MQ全称message queue(消息队列),本质是一个队列,FIFO先进先出,是消息传送过程中保存消息的容器,多 用于分布式系统之间进行通信。 在互联网架构中,MQ是一种非常常见的…...
【C# Programming】类、构造器、静态成员
一、类 1、类的概念 类是现实世界概念的抽象:封装、继承、多态数据成员: 类中存储数据的变量成员方法: 类中操纵数据成员的函数称为成员方法对象:类的实例类定义 class X {…} var instance new X(…); 2、实例字段 C#中…...
软件层面缓存基本概念与分类
缓存 缓存基本概念(百度百科) 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快…...
单片机有哪些分类?
单片机有哪些分类? 1.AVR单片机-----速度快,一个时钟周期执行一条指令,而普通的51单片机需要12个时钟周期执行一条指令。当然,Atmel公司出品的AT89LP系列单片机也是一个时钟执行一条指令,但目前还未普及。AVR单片机比51单片机多…...
高阶数据结构-----三种平衡树的实现以及原理(未完成)
TreeMap和TreeSet的底层实现原理就是红黑树 一)AVL树: 1)必须是一棵搜索树:前提是二叉树,任取一个节点,它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key,中序遍历是有序的,按照Key的大小进行排列,高度平衡的二叉…...
北斗高精度组合导航终端
UWB(Ultra-Wideband)、卫星定位(GNSS),以及IMU(Inertial Measurement Unit)的组合定位系统结合了多种传感器和定位技术,以提供高精度、高可靠性的位置估计。这种组合定位系统在各种应…...
低代码平台是否能替代电子表格?
在计算机技术普及之前,会计、助理或者是销售人员,都需要用纸和笔来记录和维护每一笔交易。计算机技术兴起之后,一项技术发明——电子表格的出现改变了低效的状况。电子表格的第一个版本出现在1977年,一个名为“VisiCalc”的程序。…...
qt多个信号如何关联一并处理
主要方法: 首先,需要创建一个包含自定义信号和槽的Qt类。假设要创建一个名为MyObject的类,并在其中定义一个自定义信号和一个槽。这个类的头文件可能如下所示: #ifndef MYOBJECT_H #define MYOBJECT_H#include <QObject>c…...
【python爬虫】12.建立你的爬虫大军
文章目录 前言协程是什么多协程的用法gevent库queue模块 拓展复习复习 前言 照旧来回顾上一关的知识点!上一关我们学习如何将爬虫的结果发送邮件,和定时执行爬虫。 关于邮件,它是这样一种流程: 我们要用到的模块是smtplib和emai…...
2023数学建模国赛C题思路--蔬菜类商品的自动定价与补货决策
C 题 蔬菜类商品的自动定价与补货决策 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此,商超通常会根据各商品的历史销售和需 求情况每天进…...
vue2与vue3的使用区别
1. 脚手架创建项目的区别: vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...
Apache httpd漏洞复现
文章目录 未知后缀名解析漏洞多后缀名解析漏洞启动环境漏洞复现 换行解析漏洞启动环境漏洞复现 未知后缀名解析漏洞 该漏洞与Apache、php版本无关,属于用户配置不当造成的解析漏洞。在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP…...
【漏洞复现】时空智友企业流程化管控系统文件上传
漏洞描述 通过时空智友该系统,可让企业实现流程的自动化、协同上提升、数据得洞察及决策得优化,来提高工作效率、管理水平及企业的竞争力。时空智友企业流程化 formservice接口处存有任意文件上传漏洞,未经认证得攻击者可利用此接口上传后门程序,可导致服务器失陷。 免责…...
elasticsearch的DSL查询文档
DSL查询分类 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_ma…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
