首页 编程教程正文

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

piaodoo 编程教程 2020-02-22 22:01:52 867 0 python教程

本文来源吾爱破解论坛

[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()

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7347.html

搜索