爬虫中使用多线程爬虫是一种很常见的方式,可以提高爬取的效率,特别是生产者消费者模型也经常可以见到,今天刚好学习了这种模式,爬取下王者荣耀的高清壁纸,作为练习

import requests
from urllib import parse,request
import os
import threading
from queue import Queue# 下载高清王者荣耀皮肤壁纸
# 1.拿到王者荣耀高清皮肤的访问的url
url = "https://pvp.qq.com/web201605/wallpaper.shtml"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
}
# res = requests.get(url,headers=headers,verify=False)
# print(res.content.decode("gbk"))# 2.分析返回的网页源代码发现图片的相关元素链接未在网页的源代码中,那就只能是使用了ajax技术,这个时候,可以点击翻页,查找调用的js请求
# 得到js的请求url和参数:
# url_ajax = "https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1587124601385"
# res = requests.get(url=url_ajax.format(),headers=headers,verify=False)# 3.得到响应结果,然后把响应结果转换为字典格式,最后获取到字典中的List列表(列表中包含图片的地址信息和英雄名称)
# result = res.json()["List"]# 直接使用生产者和消费者模式,来爬取王者荣耀的所有英雄高清皮肤# 生产者拿到从页面队列中拿到页面的url,用来生产图片的url,然后放入图片队列
class Productor(threading.Thread):def __init__(self,image_queue, page_queue,*args,**kwargs):super(Productor, self).__init__(*args,**kwargs)self.image_queue = image_queueself.page_queue = page_queuedef run(self) -> None:while not self.page_queue.empty():page_url = self.page_queue.get(timeout=10)res = requests.get(page_url,headers=headers,verify=False)datas = res.json()["List"]for data in datas:hero_name = parse.unquote(data["sProdName"]).strip().replace("1:1","")dirpath = os.path.join("./荣耀皮肤", hero_name)if not os.path.exists(dirpath):os.mkdir(dirpath)image_urls = get_images_urls(data)for index,image_url in enumerate(image_urls):image_url = parse.unquote(image_url)self.image_queue.put({"image_url":image_url,"dir_path":os.path.join(dirpath,"image_%d.png"%index)})# 消费图片队列中的url
class Consume(threading.Thread):def __init__(self, image_queue, *args, **kwargs):super(Consume, self).__init__(*args, **kwargs)self.image_queue = image_queuedef run(self) -> None:# 如果不加True,每个线程执行一次就会退出,因为线程代码已经执行完成了while True:try:image_dict = self.image_queue.get(timeout=10)image_url = image_dict["image_url"]dir_path = image_dict["dir_path"]try:request.urlretrieve(image_url, dir_path)except Exception as e:print("下载失败失败信息为:{},失败url为:{}".format(image_url,image_url))except:print("下载结束了")break# 获取单个英雄的图片的url
def get_images_urls(data):images_urls = []for i in range(1, 9):# 打印获取到的图片地址信息,发现地址信息都被编码了,此时想到了使用urllib中parse模块解析image_url = parse.unquote(data["sProdImgNo_%d" %i]).replace("200","0")images_urls.append(image_url)return images_urlsdef main():
# 生产页面url,放入队列image_queue = Queue(1000)page_queue = Queue(18)for i in range(1,11):url_ajax = "https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1587124601385".format(i)page_queue.put(url_ajax)# 开启两个线程用于生产image_urlfor i in range(2):pro = Productor(image_queue,page_queue)pro.start()# 开启五个线程用于消费image_urlfor j in range(5):con = Consume(image_queue)con.start()if __name__ == '__main__':main()

爬取到的结果如下

遇到的问题:
1.爬取道德url是已经进行编码的:
解决方式:打印获取到的图片地址信息,发现地址信息都被编码了,此时想到了使用urllib中parse模块解析image_url = parse.unquote(data[“sProdImgNo_%d” %i])

2.爬的时候报错如下:

原因分析:在Windows下新建文件夹时,发现不能有一些特殊字符

解决方式:使用replace方法进行替换,strip()方法去除前后空格
hero_name = parse.unquote(data[“sProdName”]).strip().replace(“1:1”,"")

爬取王者荣耀高清皮肤相关推荐

  1. python爬取王者_python 爬取王者荣耀高清壁纸

    一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 预览一下桌面吧: 是不是看着这样的桌面也很带感,_ (学会这个技术,你可以爬取其他网站的类似图片 ...

  2. python 爬取王者荣耀高清壁纸

    代码地址如下: http://www.demodashi.com/demo/13104.html 一.前言 打过王者的童鞋一般都会喜欢里边设计出来的英雄吧,特别想把王者荣耀的英雄的高清图片当成电脑桌面 ...

  3. python爬取王者荣耀高清图

    原理请看:Python?30行代码?爬取王者荣耀所有英雄皮肤图片?_易果啥笔的博客-CSDN博客 我稍微改了一下:因为王者这个herolist.json文件里的信息更新的不太及时,导致爬取出来的皮肤有 ...

  4. 如何爬取王者荣耀高清壁纸(详细分析教程)

    1.准备工作 Python 3.7 Python安装有requests模块 王者荣耀官网地址:https://pvp.qq.com/web201605/wallpaper.shtml### 2.网站分 ...

  5. 使用Python爬出王者荣耀高清皮肤图片

    记录一下自己获取王者荣耀的高清皮肤图片的过程 先进入王者荣耀的官网https://pvp.qq.com/ 打开F12后,点到Network那里,再按F5,然后就会看到巴拉巴拉加载出很多网络包 对her ...

  6. Python多线程爬虫之二:爬取王者荣耀高清壁纸(多线程)

    一.项目分析 1.查询爬取网址 robots 权限 1.王者荣耀官网:https://pvp.qq.com/ 2.访问王者荣耀官网 rbots 权限: https://pvp.qq.com/robot ...

  7. python多线程爬取王者荣耀高清壁纸过程

    多线程与爬虫 目标url json中查找url 访问url 读取json 查看json的list数组 全部图片 粗暴的单线程获取 多线程执行 目标url 查看http://pvp.qq.com/web ...

  8. Python爬取王者荣耀英雄的皮肤数据并下载皮肤图片项目

    Python爬取王者荣耀英雄的皮肤数据,并下载皮肤图片!高清的图片用来做桌面也不错哟~ 网址:https://pvp.qq.com/web201605/herolist.shtml 1.获得英雄信息, ...

  9. Python爬取王者荣耀全英雄全皮肤图片

    Python爬取王者荣耀全英雄全皮肤图片 前言 思路 分析 编码 案例源码 附图 总结 前言 以前写过类似的博客,利用Java爬取王者荣耀全英雄全皮肤图片,当时是利用 jsoup包来对目标网页进行解析 ...

最新文章

  1. ACMNO.39 分解质因数 求出区间[a,b]中所有整数的质因数分解。蓝桥杯训练!
  2. java进制转化_【Java学习笔记之四】java进制转化
  3. 网络损伤测试模拟软件,网络损伤仿真系统的设计及实现
  4. Spring Cloud Zuul支持–配置超时
  5. 机器学习算法优缺点改进总结
  6. Apache、Tomcat、IIS(PHP、JSP、ASP)共存及安装Tomcat
  7. android 10 apk 存储适配,AndroidQ(10) 分区存储适配方法
  8. Python垃圾回收和内存管理
  9. 【Vegas原创】Exchange报550 5.7.1 Unable to relay for …错误的分析
  10. php 打印所有常量,php中输出常量
  11. 点阵汉字的字模读取与显示
  12. 内网穿透端口映射工具
  13. 【allegro 17.4软件操作保姆级教程七】布线操作基础之二--铜皮操作
  14. DDos-Attack攻击器教程(kali linux)
  15. 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走
  16. 忽略wx公众号网页授权域名验证
  17. 桌面窗口管理器(dwm.exe)占用高内存的解决方法
  18. 大数据实验一 关联规则实验题目:蔬菜价格相关性分析
  19. 使用神经网络和深度学习构造围棋智能算法:实现棋盘落子编码
  20. vue 回车查询 按钮_vue之在页面中监听键盘的Enter键来触发某个按钮事件

热门文章

  1. Shopee使用虚拟信用卡绑卡测试购物教程
  2. 集束管的一些基础知识
  3. SOLIDWORKS螺纹显示处理方法
  4. 【节能、绿色、高效】数据中心发展正迈入“高算力”时代
  5. Spring的核心是什么?
  6. JAVA 删除json中反斜杠_如何去除spring的ModelMap的返回类型的JSON序列化字符串中带有反斜杠符号...
  7. 本科毕业论文内容必须有国内外文献综述吗?
  8. shell脚本编程100例
  9. 拿什么拯救你,我的理财收益率
  10. C++Primer(5th) Notes - 2.1 基本内置类型