欢迎光临UUpython
最大、最新、最全的Python代码收集站

多线程下载故宫壁纸

这段代码是一个简单的爬虫脚本,用于从网页上下载故宫壁纸图片。它使用了多线程池来提高图片下载的效率。

主要功能:

  1. 导入所需的库和模块,包括 timeosrequestslxmlmultiprocessing.dummy(多线程池)。
  2. 定义了一个全局变量 count,用于给下载的图片文件编号。
  3. 创建一个函数 get_img_urls(url),用于从指定的 URL 中获取图片的链接,并创建一个多线程池来并发下载图片。
  • 使用 requests 获取网页内容。
  • 使用 etree 解析 HTML 内容。
  • 从解析后的 HTML 中提取图片的标题和链接。
  • 创建一个多线程池,每个线程调用 down_load 函数进行图片下载。
  1. 创建另一个函数 down_load(name, url),用于实际下载图片文件。
  • 使用 requests 获取图片内容。
  • 在指定的文件夹路径下保存下载的图片,文件名以 count 编号和图片标题命名。
  • 递增全局变量 count
  • 为了避免频繁下载,每下载一个图片后休眠 0.1 秒。
  1. __main__ 部分:
  • 记录开始时间。
  • 循环遍历 1 到 10 页,构建 URL,并调用 get_img_urls 函数下载每页的图片。
  • 输出总下载时间。

这段代码通过多线程池并发下载图片,可以有效地提高下载速度。不过需要注意,多线程下载可能会对网站造成一定程度的压力,需要合理使用。另外,代码中使用了全局变量 count 来为下载的图片编号,这可能在多线程情况下会有竞争条件,你可以考虑使用锁机制来避免可能的问题。

import time
import os
import requests
from lxml import etree
from multiprocessing.dummy import Pool
 
headers = {
    "Accept": "*/*",
    "Referer": "https://www.dpm.org.cn/lights/royal.html",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
}
 
 
def get_img_urls(url):
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'
    # print(response.text)
    html = etree.HTML(response.text)
    imgs = html.xpath('//div[@class="pic"]/a/img')
    multi_pool = Pool(16)  # 创建16个线程池
    for i in imgs:
        title = i.xpath('./@title')[0]
        src = i.xpath('./@src')[0]
        multi_pool.apply_async(down_load, args=(title, src))
    multi_pool.close()
    multi_pool.join()
 
 
def down_load(name, url):
    res = requests.get(url, headers=headers)
    global count
    path = './故宫壁纸'  # 下载路径(当前文件夹下‘故宫壁纸’文件夹)
    if not os.path.exists(path):
        os.mkdir(path)
    print(f'正在下载>>> {count}_{name}.jpg   ...')
    with open(f'{path}/{count}_{name}.jpg','wb') as f:
        f.write(res.content)
        print(f'图_{count} 下载完成!')
        count += 1
        time.sleep(0.1)
 
 
if __name__ == '__main__':
    star_t = time.time()
    count = 1
    url = "https://www.dpm.org.cn/lights/royal/p/{}.html"
    for page in range(1, 11):  # 下载1-10页的图
        get_img_urls(url.format(page))
 
    print(f'All Done in {time.time()-star_t:.3f} seconds')
赞(0) 打赏
未经允许不得转载:UUpython » 多线程下载故宫壁纸
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!