吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4483|回复: 10
收起左侧

[Python 转载] 【python】多线程爬虫下载英雄联盟皮肤

  [复制链接]
reol_233 发表于 2018-12-19 18:58
[Python] 纯文本查看 复制代码
import re
from urllib import request
import threading
import os
import json
from queue import Queue


class Procuder(threading.Thread):
    ''' 获取每个皮肤及原画的链接和名字'''
    def __init__(self,hero_queue,img_queue,*args,**kwargs):
        super(Procuder,self).__init__(*args,**kwargs)
        self.hero_queue=hero_queue
        self.img_queue=img_queue


    def run(self):
        while True:
            if self.hero_queue.empty():
                break
            url=self.hero_queue.get()
            self.parser_page(url)

    def parser_page(self,url):
        response=request.urlopen(url)
        data=response.read().decode('utf-8')
        #print(data)
        skin_json=re.findall(r'{"data":(.*?);',data)
        #print(skin_json)

        skin_jsons='{"data":'+skin_json[0]

        skin=json.loads(skin_jsons)
        default=skin['data']['name']

        skins=skin['data']['skins']

        for key in skins:
            if key['name']=='default':
                imgname=default
                #print(imgname)
            else:
                imgname=key['name']
            imgid=key['id']
            #print(imgid,imgname)
            imgname=re.sub(r'/','',imgname)#替换K/AD
            save_name="D://lolskin//"+imgname+'.jpg'
            img_url="http://ossweb-img.qq.com/images/lol/web201310/skin/big" + imgid + ".jpg"
            self.img_queue.put((img_url,save_name))


class Consumer(threading.Thread):
    '''对获取到的连接进行下载'''
    def __init__(self,hero_queue,img_queue,*args,**kwargs):
        super(Consumer,self).__init__(*args,**kwargs)
        self.hero_queue=hero_queue
        self.img_queue=img_queue


    def run(self):
        while True:
            if self.hero_queue.empty() and self.img_queue.empty():
                break
            img_url,save_name=self.img_queue.get()
            try:
                if not os.path.exists(save_name):
                    request.urlretrieve(img_url,save_name)
                    print("下载完成")
            except Exception:
                print("下载失败")

def main():
    hero_queue=Queue(150)
    res=request.urlopen('http://lol.qq.com/biz/hero/champion.js')
    text=res.read().decode('utf-8')
    hero_lists=re.findall(r'LOLherojs.champion=(.+?);',text)
    hero_dic=json.loads(hero_lists[0])['keys']

    #英雄详情页的列表
    for key in hero_dic:
        url_hero="http://lol.qq.com/biz/hero/"+hero_dic[key]+".js"
        hero_queue.put(url_hero)
    img_queue=Queue(1000)
    #print(hero_queue.get())
    save_dir="D://lolskin//"
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)

    for i in range(2):#这里两个线程就够多了
        t=Procuder(hero_queue,img_queue)
        t.start()

    for i in range(5):#对这里的5进行修改可改变线程数,线程越多下载越快
        t=Consumer(hero_queue,img_queue)
        t.start()


if __name__=='__main__':
    main()

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
aiqianqian + 1 学到了 厉害
菜小刀 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

飞机中的战斗机 发表于 2018-12-19 19:25
虽然看不懂,但表示支持。
喵了个咪v 发表于 2018-12-19 19:41
要是早点看到这个帖子,我去年的爬虫作业就有办法了,感谢楼主分享
garen 发表于 2018-12-19 19:42
RoyPenn 发表于 2018-12-19 19:56
厉害了,大哥
dagger 发表于 2018-12-19 20:02
简单易懂,适合新手学习
gunxsword 发表于 2018-12-19 20:20
感谢分享,正好拿来学习一下
年少不懂事 发表于 2018-12-19 20:36
img_url 是什么地址
小黑LLB 发表于 2019-3-2 20:45
学到了 这个例子写的很有参考意义  感谢分享 点赞
BE一诺 发表于 2019-3-11 13:02
收藏学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表