今天写了个小demo,多线程爬取王者荣耀全皮肤,话不多说,直入主题。

https://pvp.qq.com/web201605/herolist.shtml这个是玩王者荣耀官网上的英雄列表,这个时候一共是100个英雄整。小生这边先是用xpath获取所有<li>标签,再获取里边<a>标签的href属性,可是最后只能收集到93个英雄,不全,于是重新试了一个方法,可以获取全部100个英雄了。

一 观察站点,找方法

因为不直接使用xpath获取,所以小生这边观察了一下各个英雄页面的url,很容易就能得到规律 https://pvp.qq.com/web201605/herodetail/505.shtml 只有里边的505这一串数字是不同的,所以下一步就是找到这个id在哪里。于是就去访问文件里找。

如下图,会在访问文件中找到一个英雄列表(herolist.json)的文件,乱码不要紧,编码问题,程序获取的是没问题。访问这个url下载下来,看的清晰。

手动访问这个文件,获得一串json字符串,可以发现url的id就是这串字符串的ename属性。

现在我们就可以构造一个全英雄url列表。接下来的任务是找到皮肤的url地址。
皮肤的位置很明显,在下图位置,通过观察页面代码,发现这个切换是通过js改变style的背景,如下下图。但是不难发现,这个url的规律:两个505是英雄id,后边的那个1是英雄的皮肤编号。

现在我们也已经可以构造皮肤的url了,不过还有一点,我们还要确定每个英雄拥有的皮肤数量,接着查看源码,不难发现,如下图所示。只需要一点点的改变,用split切割,再用re匹配就可以获得皮肤名称的列表。

万事俱备,开始码代码

二 码代码啊

先简单介绍一下多线程的使用吧,还是都在代码里,看

from queue import Queue      # 导入队列,用队列代替列表
import threading        # 导入多线程# 1. 生成队列
queue = Queue()# 2. 遍历, 将数据添加到queue队列
queue.put(......)           # .put让队列计数+1# 3. 从queue去除数据,进行处理
queue.get()
...
queue.task_down()       # .task_down配合.get,可以使队列计数-1# 4. 添加thread任务
t_list = []            # 用于存放任务
for i in range(3):      # 通过循环开启三个线程t = threading.Thread(target=function_name)        # 添加多线程任务t_list.append(t)for t in t_list:t.setDaemon(True)      # 设置成守护线程,会随着主线程结束而结束t.start()queue.join()       # 让主线程等待阻塞,等待队列的任务完成之后,再完成

然后这边也没什么好说的,直接看代码,注释都在代码里。

import requests
from lxml import etree
import re
import threading
from queue import Queue
import os
from time import sleep
import jsonclass HeroSpider():def __init__(self):self.start_url = "https://pvp.qq.com/web201605/js/herolist.json"self.url = "https://pvp.qq.com/web201605/herodetail/{}.shtml"self.headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}self.hero_url_queue = Queue()self.skin_queue = Queue()# 获取英雄url列表def get_hero_list(self):url = self.start_urlres = requests.get(url, headers=self.headers).contentres = json.loads(res)for i in res:url = self.url.format(i["ename"])self.hero_url_queue.put(url)# 访问英雄页面,获取信息def get_skin_list(self):while True:# 1. 从queue获取urlurl = self.hero_url_queue.get()# 2. 访问该url, 获取信息response = requests.get(url,headers=self.headers).content.decode('gbk')response = etree.HTML(response)# 3. 将数据放入skin_queue队列item = {}item["hero_name"] = response.xpath("//h2[@class='cover-name']/text()")[0]item["hero_id"] = response.xpath("//span[@class='hidden']/text()")[0]skin_name_list = str(response.xpath("//ul[@class='pic-pf-list pic-pf-list3']/@data-imgname")).split("|")# 格式化皮肤名称item["skin_name_list"] = [re.findall(r'\[?\'?(.*)&.*', skin_name)[0] for skin_name in skin_name_list]# 4. 将item添加到队列self.skin_queue.put(item)# 5. 任务完成,hero_queue队列-1self.hero_url_queue.task_done()#  保存图片的函数def save_skin(self):while True:# 1. 从queue获取数据item = self.skin_queue.get()# 2. 创建英雄文件夹os.mkdir("heros/" + item["hero_name"])# 2. 构造url和文件名等数据for skin_name in item["skin_name_list"]:skin_id = item["skin_name_list"].index(skin_name) + 1skin_url = "http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/%s/%s-bigskin-%d.jpg" % (item["hero_id"], item["hero_id"], skin_id)skin_img = requests.get(skin_url, headers=self.headers)with open("heros/" + item["hero_name"] + "/" + skin_name +'.jpg', "wb") as f:f.write(skin_img.content)# 3. 任务完成,skin_queue队列-1self.skin_queue.task_done()def run(self):os.mkdir("heros")# 一. 构建人物列表t_list = []# 1. 构建各个英雄的链接t_get_hero_list = threading.Thread(target=self.get_hero_list)t_list.append(t_get_hero_list)# 2. 获取英雄皮肤信息for i in range(5):t_get_skin_list = threading.Thread(target=self.get_skin_list)t_list.append(t_get_skin_list)# 3. 遍历skin_queue队列,保存图片for i in range(5):t_save_skin = threading.Thread(target=self.save_skin)t_list.append(t_save_skin)# 二. 遍历任务,启动t.start()for t in t_list:t.setDaemon(True)  # 设置成守护进程,随主进程关闭而关闭; 解决函数中while True跳出问题t.start()sleep(10)  #  让主进程休眠10s,等第一个页面获取,因为在获取之前队列还是空队列,此时不能让程序认为队列是完成状态, 网速不好的可以多睡一会for q in [self.hero_url_queue, self.skin_queue]:q.join()  # 阻塞主线程,等任务队列完成之后,再完成if __name__ == "__main__":hero = HeroSpider()hero.run()

多线程爬取王者荣耀皮肤壁纸相关推荐

  1. 利用python爬取王者荣耀皮肤壁纸

    作为python新手上路的小白,今天我来给大家安利一个爬取王者荣耀官方网站皮肤壁纸的项目,请大家多多关照! 一.登陆官网 首先我们登录王者荣耀官网,在菜单栏点击进入皮肤壁纸高清图可以看到以下画面: 通 ...

  2. python爬取王者荣耀皮肤高清图

    python爬取王者荣耀皮肤高清图 前期准备,导入模块 requests json os 进入王者荣耀官网,进入游戏壁纸页面,f12进入开发者模式,按照下图找到这个json文件,用于对图片的数据请求. ...

  3. 简单几行代码带你爬取王者荣耀皮肤

    爬取王者荣耀皮肤 分析思路 源代码 爬取王者荣耀皮肤 分析思路 url:https://pvp.qq.com/web201605/js/herolist.json url还是很容易拼接的 源代码 im ...

  4. scrapy爬取王者荣耀皮肤

    Scrapy爬取王者荣耀皮肤 一.项目需求 爬取王者荣耀官网(https://pvp.qq.com/)所有皮肤图片 要求: 英雄名作为文件夹名 皮肤名作为图片名称 皮肤图片按所属英雄存入对应的文件夹 ...

  5. 如何运用python爬游戏皮肤_Python爬虫实战之 爬取王者荣耀皮肤

    王者荣耀是目前非常火的一款游戏,相信大家都对其中的人物很感兴趣,那么今天就带大家来爬取王者荣耀的皮肤,可以选一款喜欢的来当电脑壁纸.第一步,拿到url地址 第二步,获取各个人物皮肤数据 第三步,保存文 ...

  6. Python爬虫实战之 爬取王者荣耀皮肤

    王者荣耀是目前非常火的一款游戏,相信大家都对其中的人物很感兴趣,那么今天就带大家来爬取王者荣耀的皮肤,可以选一款喜欢的来当电脑壁纸

  7. Python爬取王者荣耀皮肤

    引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工 ...

  8. Java爬取王者荣耀英雄壁纸

    编码前准备: 下载好 jsoup.jar包,或者,maven工程导入如下依赖: <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup - ...

  9. 爬取王者荣耀皮肤-点券领取

    1.首先我们要找到所有英雄列表 百度"王者荣耀"进入官网,进入https://pvp.qq.com/,按F12进入调试界面,然后按F5刷新界面,图中标识的herolist.json ...

最新文章

  1. Spring常问的面试
  2. bgi::detail::path_intersection用法的测试程序
  3. python画五角星代码_Python使用Turtle模块绘制五星红旗代码示例
  4. gunicorn部署Flask服务
  5. CAN笔记(14) STM32-M4 寄存器
  6. PHP 01 Apache HTTP
  7. linux启动清除指定内存,柴少鹏的官方网站
  8. 关于html5毕业论文设计任务书,毕业论文设计任务书(精选多篇)
  9. Java之Joda工具包处理时间的7点总结分享
  10. 金蝶凭证序时簿在哪_金蝶KIS旗舰版外购入库单序时簿界面没有凭证的按钮
  11. java 二进制 base64编码_java自定义实现base64编码转换
  12. 电路原理 | 二阶动态电路
  13. MATLAB STK构建卫星轨道姿态控制仿真演示系统
  14. 五十个SQL基本语句,来看看你的SQL语言过关了吗?
  15. 软件本身呢对shellcode 检查 SEH Exploit学习
  16. Multimodal Discriminative Binary Embedding for Large-Scale Cross-Modal Retrieval--2016.10高新波团队
  17. 一文读懂元宇宙--元宇宙技术及技术瓶颈
  18. centos上安装和卸载mysql
  19. WebSocket协议详解及应用
  20. 线性代数计算机应用论文,线性代数问题的计算机应用.docx

热门文章

  1. 超写实虚拟数字人再升级:Wav2Lip-GFPGAN完整版教程及效果视频评测【手把手】
  2. 《Dota2》大更新:优化新手体验,官网翻新
  3. 爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析 | 龙蜥技术
  4. 路由器当交换机用时是好处更多吗
  5. oracle 10.2.0.4 rac emca,Oracle RAC 10.2.0.1升级到10.2.0.4-安装配置参考手册
  6. Somethings about Floors题解
  7. springboot中连接kafka失败问题
  8. DataFrame实战-----数据规整化之USDA食品数据库-----python数据分析
  9. 上海企业2022年预计调薪率平均为6.2%,相比2021年略有提升
  10. 晗枫emlog仿小刀网修复版模板