多线程下载王者农药高清壁纸

。。其实我不喜欢玩王者的,,不过壁纸好看就算了脑部链接

踩点

毕竟企鹅baba的网站,不是那么好爬的。。壁纸图片的url并不在网页源代码中,所以通过减缓网页加载速度来得到这些url 藏在了哪里。。。具体方法可见我之前写的爬网易云的方法。

经过操作我们会在worklist。。。。。这个文件中找到我们需要的数据。不过是加密的,放到 json解析网站上一解析就有了
多线程下载王者农药高清壁纸_第1张图片
注意要删掉jQuery171019307142189807158_1586675620843(这个开头和最后的小括号。这些蓝色的就是我们要的 url了。不过还是解密的。所以打开我们的python,使用parse 这个解码工具,于是我们就有了真正的url。。。。。

from urllib import parse
result = parse.unquote('http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735040117%2F1585734643%5F84828260%5F29030%5FsProdImgNo%5F3%2Ejpg%2F200')

print(result)
>>>http://shp.qpic.cn/ishow/2735040117/1585734643_84828260_29030_sProdImgNo_3.jpg/200

我们要的是大的图,根据在原网站上看到的图片地址做一下对比,将最后的200改成0就好了。。。

所以说我们要的数据就在这个url 中,并且通果其中page=数字,来获取不同页面的壁纸(page在哪?自己找吧)…

Request URL: 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=9&iOrder=0&iSortNumClose=1&jsoncallback=jQuery171019307142189807158_1586675620843&iAMSActivityId=51991&everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&=1586676909304

代码

速度飞起,,爬虫真是太神奇了,hhhhh

from urllib import parse, request
import requests
import os
import threading
import queue
headers = {
     
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    "Referer": "https://pvp.qq.com/web201605/wallpaper.shtml"}


class Producer(threading.Thread):   # 生产真正的url
    def __init__(self, page_queue, image_queue, *args, **kwargs):  
        # 重写构造函数,传入队列。代表了任意位置参数和关键字参数
        # 因为我们重写了init 函数,所以要想正常使用还要调用父类的方法。
        super(Producer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.image_queue = image_queue

    def run(self) -> None:
        while not self.page_queue.empty():
            url = self.page_queue.get()
            resp = requests.get(url, headers=headers)
            result = resp.json()
            datas = result['List']
            for data in datas:
                image_urls = extract_images(data)
                name = parse.unquote(
                    data['sProdName']).strip().replace(
                    "1:1", "")  # 避免取名出错,不能有空格,不能有冒号之类的
                dirpath = os.path.join("images1", name)
                if not os.path.exists(dirpath):
                    os.mkdir(dirpath)         # 避免重复创建文件
                for index, image_url in enumerate(image_urls):
                    self.image_queue.put({
     'image_url': image_url, 'image_path': os.path.join(
                        dirpath, "%d.jpg" % (index + 1))})
                    # 消费者需要从生产者提取图片链接和保存路径,所以以字典的方式添加。


class Consumer(threading.Thread):
    def __init__(self, image_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.image_queue = image_queue

    def run(self) -> None:
        while True:
            try:
                image_obj = self.image_queue.get(timeout=10)   
                # 得到一个字典,设置超时,如果图片已经下载完避免一直卡在那抛出异常
                image_url = image_obj.get('image_url')
                image_path = image_obj.get('image_path')
                try:
                    request.urlretrieve(image_url, image_path)
                    print("%s下载完成!" % (image_url))
                except:
                    print('下载失败')
            except:
                break

def extract_images(data):
    image_urls = []
    for x in range(1, 9):
        image_url = parse.unquote(
            data['sProdImgNo_%d' % x]).replace("200", "0")
        # unquote(string, encoding='utf-8', errors='replace')
        image_urls.append(image_url)
    return image_urls


def main():
    page_queue = queue.Queue(10)
    image_queue = queue.Queue(1000)   # 保存每个图片url 的中间队列,所以要大一点
    for i in range(0, 10):
        url = '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={page}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1586675621245'.format(
            page=i)
        page_queue.put(url)
    for x in range(3):
        th = Producer(page_queue, image_queue, name='生产者%d号' % x)
        th.start()
    for x in range(5):
        th = Consumer(image_queue, name='消费者%d' % x)
        th.start()


if __name__ == '__main__':
    main()

然后我在想,,,如果当初把打王者的时间用来敲代码,,,,,,,

多线程下载王者农药高清壁纸_第2张图片

你可能感兴趣的:(爬虫,python)