【Python】UPUPOO壁纸

简介


这款壁纸软件的质量还是很不错的,也是我目前一直使用的,我个人是不太愿意使用动态壁纸的,一直是下载对应的图片自己设置为背景。

其实这个软件在我学习爬虫时有试着去爬,只是当时还不太熟悉,而且那个fiddler工具也不太会用,就放弃了。刚好跨年守舍,找到了之前的项目,于是开始重写也就有了这篇。WODE

我的代码


# -*- coding: utf-8 -*-
"""
@ 😀Author     : 🎈
@ ⏲️Time       : 2024年01月01
@ 📄File       : t.py
@ ℹ️Description:

采集 UPUPOO 的壁纸

使用工具:
  Progress Telerik Fiddler Classic
  pycharm

"""
import requests
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor

FOLDER = 'wallpaper'
TAG_ID = 2
TOTAL_PAGE = 1  # 总页数

folder_path = Path(FOLDER)
# 创建目录(如果不存在)parents: 允许父目录,exist_ok: 如果存在也不发生报错
Path.mkdir(folder_path, exist_ok=True)

def get_page(method, url, headers=None, **kwargs):
    """
    发送HTTP请求获取网页内容。

    Args:
        method (str): HTTP方法,如'GET'、'POST'等。
        url (str): 要请求的URL。
        headers (dict, optional): 用于请求的HTTP头。默认为None。
        **kwargs: request支持的所有参数。

    Returns:
        requests.Response: HTTP响应对象。如果出错,返回None。
    """
    default_headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) upupoo-wallpaper-shop/0.0.1 Chrome/80.0.3987.165 Electron/8.2.5 Safari/537.36',
    }
    headers = headers or default_headers

    try:
        resp = requests.request(method, url, headers=headers, timeout=10, **kwargs)
        resp.raise_for_status()
        return resp
    except requests.exceptions.RequestException as e:
        print(f"Error making {method} request to {url}: {e}")
        return None

def get_index_page(page):
    url = 'https://pcwallpaper.upupoo.com/wallpaper/lists'
    data = {"current": page, "size": 28, "total": 239311, "type": 0, "tagId": TAG_ID, "sort": 0, "resolution": 0, "hairtail": 0}
    return get_page('POST', url, json=data)

def parse(json_data):
    cards = json_data['data']['records']  # 字典数据列表:
    for info in cards:
        paper_id = info['paper_id']
        img_url = info['img_url']
        # print(img_url)
        # https://pcsource.upupoo.com/theme/2001206385/listCover.jpg
        # 这个链接是小图,大图需要把listCover换为previewFix
        new_filename = 'previewFix.jpg'
        parts = img_url.split('/')
        # 替换文件名
        parts[-1] = new_filename
        new_img_url = '/'.join(parts)
        # print(new_img_url)
        yield paper_id, new_img_url

def download(data):
    # data 是一个生成器 里面是元组 (id, url)
    name, url = data  # 使用解包是很好的选择,如果使用循环会导致多进程不能成功工作
    response = get_page('GET', url)
    # 这里使用一个判断是很好的选择,以免错误的返回None,导致使用response.content报错
    if response:
        img_content = response.content
        file_path = folder_path / f'{name}.jpg'  # 确保文件名的正确性
        with open(file_path, mode='wb') as f:
            f.write(img_content)
            print(f'Successful -> {url}')
    else:
        print('Response has no content.')

def start_process_pool(func, iterable):
    # 建议不要将max_workers设置太大,应避免给对方服务器造成压力,尤其是请求页数多的时候
    with ProcessPoolExecutor(max_workers=5) as p:
        p.map(func, iterable)

if __name__ == '__main__':
    for i in range(1, TOTAL_PAGE + 1):
        html = get_index_page(i)
        parse(html.json())
        g_data = parse(html.json())
        # 启动进程池
        start_process_pool(download, g_data)

【Python】UPUPOO壁纸

完整的项目我也上传到Gitee了,里面也有我之前写的爬虫项目。

Gitee项目地址:UPUPOO壁纸软件采集

 

给TA打赏
共{{data.count}}人
人已打赏
教程

用certbot申请免费的域名证书 比acme还好用!

2024-4-25 12:00:55

教程

禁止WP站点wp-content文件夹生成temp-write-test临时文件

2024-5-5 17:43:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索