我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python爬虫利用多线程爬取LOL高清壁纸

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python爬虫利用多线程爬取LOL高清壁纸

前言:

随着移动端的普及出现了很多的移动 APP,应用软件也随之流行起来。

最近又捡起来了英雄联盟手游,感觉还行,PC 端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何,那今天我们使用到多线程的方式爬取 LOL 官网英雄高清壁纸。

页面分析

目标网站:英雄联盟

官网界面如图所示,显而易见,一个小图表示一个英雄,我们的目的是爬取每一个英雄的所有皮肤图片,全部下载下来并保存到本地。

次级页面

上面的页面我们称为主页面,次级页面也就是每一个英雄对应的页面,就以黑暗之女为例,它的次级页面如下所示:

我们可以看到有很多的小图,每一张小图对应一个皮肤,通过 network 查看皮肤数据接口,如下图所示:

我们知道了皮肤信息是一个 json 格式的字符串进行传输的,那么我们只要找到每个英雄对应的 id,找到对应的 json 文件,提取需要的数据就能得到高清皮肤壁纸。

然后这里黑暗之女的 json 的文件地址是:

hero_one = 'https://game.gtimg.cn/images/lol/act/img/js/hero/1.js'

这里其实规律也非常简单,每个英雄的皮肤数据的地址是这样的:

url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(id)

那么问题来了 id 的规律是怎么样的呢?这里英雄的 id 需要在首页查看,如下所示:

我们可以看到两个列表[0,99],[100,156],即 156 个英雄,但是 heroId 却一直到了 240….,由此可见,它是有一定的变化规律的,并不是依次加一,所以要爬取全部英雄皮肤图片,需要先拿到全部的heroId。

抓取思路

为什么使用多线程,这里解释一下,我们在爬取图片,视频这种数据的时候,因为需要保存到本地,所以会使用大量的文件的读取和写入操作,也就是 IO 操作,试想一下如果我们进行同步请求操作;

那么在第一次请求完成一直到文件保存到本地,才会进行第二次请求,那么这样效率非常低下,如果使用多线程进行异步操作,效率会大大提升。

所以必然要使用多线程或者是多进程,然后把这么多的数据队列丢给线程池或者进程池去处理;

在 Python 中,multiprocessing Pool 进程池,multiprocessing.dummy 非常好用。

  • multiprocessing.dummy模块:dummy模块是多线程;
  • multiprocessing模块:multiprocessing是多进程;

multiprocessing.dummy模块与multiprocessing模块两者的 api 都是通用的,代码的切换使用上比较灵活;

我们首先在一个测试的 demo.py 文件抓取英雄 id,这里的代码我已经写好了,得到一个储存英雄 id 的列表,直接在主文件里使用即可;

demo.py

url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
res = requests.get(url,headers=headers)
res = res.content.decode('utf-8')
res_dict = json.loads(res)
heros = res_dict["hero"] # 156个hero信息
idList = []
for hero in heros:
    hero_id = hero["heroId"]
    idList.append(hero_id)
print(idList)

得到 idList 如下所示:

idlist = [1,2,3,….,875,876,877] # 中间的英雄 id 这里不做展示

构建的 url:

page = 'http://www.bizhi88.com/s/470/{}.html'.format(i)

这里的 i 表示 id,进行 url 的动态构建;

那么我们定制两个函数一个用于爬取并且解析页面(spider),一个用于下载数据  (download),开启线程池,使用 for 循环构建存储英雄皮肤 json 数据的 url,储存在列表中,作为 url 队列,使用 pool.map() 方法执行 spider (爬虫)函数;

def map(self, fn, *iterables, timeout=None, chunksize=1):
    """Returns an iterator equivalent to map(fn, iter)”“”
# 这里我们的使用是:pool.map(spider,page) # spider:爬虫函数;page:url队列

作用:将列表中的每个元素提取出来当作函数的参数,创建一个个进程,放进进程池中;

参数1:要执行的函数;

参数2:迭代器,将迭代器中的数字作为参数依次传入函数中;

json数据解析

这里我们就以黑暗之女的皮肤的 json 文件做展示进行解析,我们需要获取的内容有:

  • 1.name
  • 2.skin_name
  • 3.mainImg

因为我们发现 heroName 是一样的,所以把英雄名作为该英雄的皮肤文件夹名,这样便于查看保存;

item = {}
item['name'] = hero["heroName"]
item['skin_name'] = hero["name"]
if hero["mainImg"] == '':
   continue
item['imgLink'] = hero["mainImg"]

有一个注意点:

有的 mainImg 标签是空的,所以我们需要跳过,否则如果是空的链接,请求时会报错;

数据采集

导入相关第三方库

import requests # 请求
from multiprocessing.dummy import Pool as ThreadPool # 并发
import time # 效率
import os # 文件操作
import json # 解析

页面数据解析

def spider(url):
    res = requests.get(url, headers=headers)
    result = res.content.decode('utf-8')
    res_dict = json.loads(result)
    skins = res_dict["skins"]  # 15个hero信息
    print(len(skins))
    for index,hero in enumerate(skins): # 这里使用到enumerate获取下标,以便文件图片命名;
        item = {} # 字典对象
        item['name'] = hero["heroName"]
        item['skin_name'] = hero["name"]

        if hero["mainImg"] == '':
            continue
        item['imgLink'] = hero["mainImg"]
        print(item)
        download(index+1,item)

download 下载图片

def download(index,contdict):
    name = contdict['name']
    path = "皮肤/" + name
    if not os.path.exists(path):
        os.makedirs(path)
    content = requests.get(contdict['imgLink'], headers=headers).content
    with open('./皮肤/' + name + '/' + contdict['skin_name'] + str(index) + '.jpg', 'wb') as f:
        f.write(content)

这里我们使用 OS 模块创建文件夹,前面我们有说到,每个英雄的 heroName 的值是一样的,借此创建文件夹并命名,方便皮肤的保存(归类),然后就是这里图片文件的路径需要仔细,少一个斜杠就会报错。

main() 主函数

def main():
    pool = ThreadPool(6)
    page = []
    for i in range(1,21):
        newpage = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(i)
        print(newpage)
        page.append(newpage)
    result = pool.map(spider, page)
    pool.close()
    pool.join()
    end = time.time()

说明:

  • 在主函数里我们首选创建了六个线程池;
  • 通过 for 循环动态构建 20 条 url,我们小试牛刀一下,20 个英雄皮肤,如果爬取全部可以对之前的 idList 遍历,再动态构建 url;
  • 使用 map() 函数对线程池中的 url 进行数据解析存储操作;
  • 当线程池 close 的时候并未关闭线程池,只是会把状态改为不可再插入元素的状态;

程序运行

if __name__ == '__main__':
    main()

结果如下:

当然了这里只是截取了部分图像,总共爬取了 200+ 张图片,总体来说还是可以。

总结

本次我们使用了多线程爬取了英雄联盟官网英雄皮肤高清壁纸,因为图片涉及到 IO 操作,我们使用并发方式进行,大大提高了程序的执行效率。

到此这篇关于Python爬虫利用多线程爬取 LOL 高清壁纸的文章就介绍到这了,更多相关Python 爬取壁纸内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python爬虫利用多线程爬取LOL高清壁纸

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么利用多线程爬取LOL高清壁纸

这篇“Python怎么利用多线程爬取LOL高清壁纸”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么利用多线程爬
2023-07-02

怎么在python中利用多线程爬取网站壁纸

本篇文章给大家分享的是有关怎么在python中利用多线程爬取网站壁纸,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python主要用来做什么Python主要应用于:1、Web开
2023-06-06

Python怎么爬取图虫创意优质高清壁纸图

本篇文章给大家分享的是有关Python怎么爬取图虫创意优质高清壁纸图,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。图片素材一直各类设计必不可少的元素,一图胜千言,一张好的图片贯
2023-06-02

使用Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载。刚开始学习python希望可以获得宝贵的意见。先来简单介绍一下,网络爬虫的基本实现原理
2022-06-04

Golang多线程爬虫高效抓取大量数据的利器

Golang多线程爬虫是一种高效抓取大量数据的利器。Golang语言天生支持并发和多线程,可以轻松实现多线程爬虫的开发。通过使用Golang的协程和通道,可以实现爬虫的高效并发抓取、数据处理和存储
2023-05-19

怎么利用python多线程爬取天气网站图片并保存

这篇文章主要介绍了怎么利用python多线程爬取天气网站图片并保存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.1 题目指定一个网站,爬取这个网站中的所有的所有图片,例如
2023-06-25

如何使用Python中的多线程和协程实现一个高性能的爬虫

如何使用Python中的多线程和协程实现一个高性能的爬虫导语:随着互联网的快速发展,爬虫技术在数据采集和分析中扮演着重要的角色。而Python作为一门强大的脚本语言,具备多线程和协程的功能,可以帮助我们实现高性能的爬虫。本文将介绍如何使用P
2023-10-22

如何使用Python编写多线程爬虫抓取百度贴吧邮箱与手机号

本篇文章给大家分享的是有关如何使用Python编写多线程爬虫抓取百度贴吧邮箱与手机号,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。不知道大家过年都是怎么过的,反正栏主是在家睡了
2023-06-17

python怎么利用多线程+队列技术爬取中介网互联网网站排行榜

本篇内容介绍了“python怎么利用多线程+队列技术爬取中介网互联网网站排行榜”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目标站点分析本次
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录