Python线程池下载txt、图片

本文分享了使用Python多线程技术从网站批量下载小说TXT文档及从Excel读取URL下载图片的两个实例,详细展示了如何利用threadpool模块提高文件下载效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个例子,从某个网站下载小说txt文档,入参i为url中的id。

# coding=utf-8
import requests
import threadpool

def download_file(i):
    '''下载文件'''
    download_url = f"https://www.txt2016.com/e/DownSys/xiazai/?classid=1&pathid=0&id={i}"
    file = requests.get(download_url)

    try:
        filename = file.headers['Content-Disposition'][21:][:-19].encode('iso8859-1').decode('utf-8') 
        filename = filename.replace('/','-') + '.txt'
        # print(filename)
        with open(f'./txt/{filename}', 'wb') as txt_file:
            txt_file.write(file.content)
        print(i, ': ', filename)
    except KeyError:
        print(file.headers)
        print(file.status_code)
        print("网址不存在")


if __name__ == "__main__":
    ids = [i for i in range(2275, 113642)]  # 把每次任务的入参准备好, 让pool自己去调度
    pool = threadpool.ThreadPool(8) # 线程池设置,最多同时跑8个线程
    tasks = threadpool.makeRequests(download_file, ids)
    # makeRequests构造线程task请求, 第一个参数是线程函数, 第二个是参数数组
    [pool.putRequest(task) for task in tasks]
    # 列表推导式, putRequest向线程池里加task, 让pool自己去调度task
    pool.wait() # 等所有任务结束

第二个例子,从excel中读取图片文件的下载地址,用线程池进行下载,因为需要重命名文件,所以还包含了线程池的多入参操作

download_img函数的入参有两个,所以先用元组组装起来(piclist[0],f"{i}_0")

然后对于线程池threadpool.makeRequests的方法,第二个入参表示被调用任务的所有入参的枚举,而且每个枚举值的下标【0】会解析为list,下标【1】为dic,咱们用的元组,所以第二位用None占位,单个枚举值组装为((piclist[0],f"{i}_0"),None)

最后再把这些枚举值组装成urls

# coding: utf8
import requests
import threadpool
import pandas as pd


def download_img(img_url,filename):
    r = requests.get(img_url, stream=True)
    # print(r.status_code) # 返回状态码
    if r.status_code == 200:
        with open(f'./pics2/{filename}.jpg', 'wb') as f:
            f.write(r.content)   


def pic_downv2():
    df = pd.read_excel("data.xlsx", usecols="I:K").values   # 从excel读取3列数据
    urls = []

    for i in range(1,905):
        print(i)
        piclist = df[int(i)].tolist()
        urls.append(((piclist[0],f"{i}_0"),None))
        urls.append(((piclist[1],f"{i}_1"),None))
        urls.append(((piclist[2],f"{i}_2"),None))  # 组装入参

    pool = threadpool.ThreadPool(8)
    tasks = threadpool.makeRequests(download_img, urls)
    [pool.putRequest(task) for task in tasks]
    pool.wait()

pic_downv2()

代码参考:Python数据抓取——多线程,异步_Young_618-优快云博客_python异步多线程

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值