iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python多线程实现图片下载器
  • 624
分享到

利用Python多线程实现图片下载器

2024-04-02 19:04:59 624人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录导语开发工具环境搭建原理简介效果展示导语 之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧。至于题目为什么说是构建一个小型数据集,因为

导语

之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧。至于题目为什么说是构建一个小型数据集,因为公众号之后的文章应该还会用到它来构建一些简单的图像分类数据集,换句话说,后续一段时间,公众号会主要写一些深度学习机器学习相关的文章,下期文章揭晓具体内容。

废话不多说,让我们愉快地开始近期最后一篇爬虫文章~

开发工具

python版本:3.7.8

相关模块:

requests模块;

alive-progress模块;

pyfreeproxy模块;

user_agent模块;

beautifulsoup4模块;

lxml模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

我看了下,发现大家基本都是从百度,必应和谷歌来根据给定的关键字下载相关的图片数据的,所以我们也选用这三个数据源。具体而言,百度的图片搜索接口如下:

'https://image.baidu.com/search/acJSON?tn=resultjson_com&ipn=rj&ct=201326592&lm=7&fp=result&ie=utf-8&oe=utf-8&st=-1&Word={}&queryWord={}&face=0&pn={}&rn={}'

为了可以多线程地进行图片搜索,我们先根据想要下载的图片数量来构造所有请求页的链接如下:

search_urls, pagesize = [], 30
for pn in range(math.ceil(search_limits * 1.2 / pagesize)):
    search_url = base_url.fORMat(quote(keyword), quote(keyword), pn * pagesize, pagesize)
    search_urls.append(search_url)

然后再多线程请求所有构造好的搜索链接:

# 多线程请求获取所有图片链接
def searchapi(self, search_urls, image_urls, bar):
    while len(search_urls) > 0:
        search_url = search_urls.pop(0)
        response = self.get(search_url)
        if response is None: 
            bar()
            continue
        response.encoding = 'utf-8'
        response_json = json.loads(response.text.replace(r"\'", ""), encoding='utf-8', strict=False)
        for item in response_json['data']:
            if 'objURL' in item.keys():
                image_urls.add(self.parseurl(item['objURL']))
            elif 'replaceUrl' in item.keys() and len(item['replaceUrl']) == 2:
                image_urls.add(item['replaceUrl'][1]['ObjURL'])
        bar()
task_pool, image_urls = [], set()
with alive_bar(min(len(search_urls), search_limits)) as bar:
    for idx in range(num_threadings):
        task = threading.Thread(
            target=searchapi,
            args=(self, search_urls, image_urls, bar)
        )
        task_pool.append(task)
        task.start()
    for task in task_pool: task.join()

线程结束的条件为我们构造的所有请求页链接search_urls全部被用完。这里我们用的最基本的python的threading库,感觉python应该还有很多更加好用的多线程库,感兴趣的小伙伴可以自己查查资料,不必拘泥于我写的内容。threading库的话调用方便,只需要target指定目标函数,args指定目标函数输入的参数,然后start一下就行,所以我图省事就直接用它了。

类似地,我们也可以根据得到的image_urls写个多线程的图片下载器:

'''下载'''
def download(self, keyword, search_limits=1000, num_threadings=5, savedir='outputs'):
    touchdir(savedir)
    # 获得image_urls
    self.logging(f'Start to search images from {self.source_name}')
    image_urls = self.search(keyword, search_limits, num_threadings)
    # 多线程下载图片
    self.logging(f'Start to download images from {self.source_name}')
    def downloadapi(self, savepaths, image_urls, bar):
        assert len(savepaths) == len(image_urls)
        while len(image_urls) > 0:
            savepath, image_url = savepaths.pop(0), image_urls.pop(0)
            response = self.get(image_url)
            if response is None: 
                bar()
                continue
            with open(savepath, 'wb') as fp: fp.write(response.content)
            filetype = imghdr.what(savepath)
            if filetype in ['jpg', 'jpeg', 'png', 'bmp', 'gif']:
                savepath_correct = f'{savepath}.{filetype}'
                shutil.move(savepath, savepath_correct)
            else:
                os.remove(savepath)
            bar()
    task_pool, savepaths = [], []
    for idx in range(len(image_urls)):
        savename = f'image_{str(idx).zfill(8)}'
        savepaths.append(os.path.join(savedir, savename))
    with alive_bar(len(image_urls)) as bar:
        for idx in range(num_threadings):
            task = threading.Thread(
                target=downloadapi,
                args=(self, savepaths, image_urls, bar)
            )
            task_pool.append(task)
            task.start()
        for task in task_pool: task.join()

然后必应的图片搜索接口如下:

# 构建所有urls
base_url = 'Https://cn.bing.com/images/async?q={}&first={}&count={}&cw=1536&ch=240&relp={}&tsc=ImageBasicHover&datsrc=I&layout=RowBased&mmasync=1&dgState=x*1063_y*768_h*186_c*5_i*71_r*10&IG=D6A4AD486F3A49F1BE164BC50750D641&SFX=3&iid=images.5555'
search_urls, pagesize = [], 35
for pn in range(math.ceil(search_limits * 1.2 / pagesize)):
    search_url = base_url.format(quote(keyword), pn * pagesize, pagesize, pagesize)
    search_urls.append(search_url)

谷歌的图片搜索接口如下:

# 构建所有urls
base_url = 'https://www.Google.com/search?'
search_urls, pagesize = [], 20
for pn in range(math.ceil(search_limits * 1.2 / pagesize)):
    params = {
        'q': keyword,
        'ijn': pn,
        'start': pn * pagesize,
        'tbs': '',
        'tbm': 'isch',
    }
    search_urls.append(base_url + urlencode(params))

具体的多线程搜索和下载图片的写法和百度的类似,大功告成啦。

效果展示

你只需要pip安装一下,就可以直接在终端运行了。安装命令如下:

pip install pyimagedl

使用方式如下:

Usage: imagedl [OPTioNS]

Options:
  --version                  Show the version and exit.
  -k, --keyword TEXT         想要搜索下载的图片关键字, 若不指定, 则进入imagedl终端版
  -s, --savedir TEXT         下载的图片的保存路径
  -t, --target TEXT          指定图片搜索下载的平台, 例如"baidu"
  -l, --limits INTEGER       下载的图片数量
  -n, --nthreadings INTEGER  使用的线程数量
  --help                     Show this message and exit.

例如,在终端输入:

imagedl -k 狗狗 -s dogs -t baidu -l 1000

到此这篇关于利用Python多线程实现图片下载器的文章就介绍到这了,更多相关Python图片下载内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Python多线程实现图片下载器

本文链接: https://www.lsjlt.com/news/143954.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Python多线程实现图片下载器
    目录导语开发工具环境搭建原理简介效果展示导语 之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧。至于题目为什么说是构建一个小型数据集,因为...
    99+
    2024-04-02
  • python多线程下载图片
    功能:从p_w_picpath.baidu.com自动翻页下载图片的python程序 用法:运行程序后,输入关键字即可 #!/usr/bin/python # filename: getbaidupic.py&...
    99+
    2023-01-31
    多线程 下载图片 python
  • Python 多线程并发下载图片 保姆级教程
    有时候,下载大量图像需要几个小时——让我们来解决这个问题我明白了——你已经厌倦了等待你的程序下载图像。有时我必须下载数千张图像需要几个小时,而且你不可能一直等待你的程序完成下载这些愚蠢的图像。你有很多重要的事情要做。让我们构建一个简单的图像...
    99+
    2023-05-17
    多线程并发 下载图片 高效
  • 如何使用Python进行多线程并发下载图片
    这篇文章主要介绍“如何使用Python进行多线程并发下载图片”,在日常操作中,相信很多人在如何使用Python进行多线程并发下载图片问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Python进行多线程...
    99+
    2023-07-04
  • Python 实现多线程文件下载
    #!/root/.pyenv/shims/python # -*- coding: UTF-8 -*- import sys import requests import threading import datetime #传入的命令行参...
    99+
    2023-01-31
    多线程 文件 Python
  • 利用Python制作百度图片下载器
    前段时间写了一个百度图片下载器,结果发现有很多人需要使用。说实话之前写的那一款百度图片下载器比较LOW,今天刚好有时间就做了一下升级。 更新了两个BUG,一个是图片下载达到几千张的时...
    99+
    2024-04-02
  • Java commons io包实现多线程同步图片下载入门教程
    目的: 实现多线程同时下载网络图片,入门级。 多线程入门 commons io: 是针对开发IO流功能的工具类库,其中包含了许多可调用的函数。 1.commons io 可直接百度,...
    99+
    2024-04-02
  • android中的多线程下载怎么利用AsyncTask实现
    android中的多线程下载怎么利用AsyncTask实现?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。01 效果图02 核心类 - DownloadTask.classp...
    99+
    2023-05-31
    android asynctask 多线程
  • 基于Qt实现离线瓦片地图下载器
    目录一、前言二、功能特点三、体验地址四、效果图五、相关代码一、前言 写这个离线地图下载器的初衷,就是为了方便自己的几个需要离线地图的程序,客户需求,既然地图程序已经可以支持离线地图,...
    99+
    2024-04-02
  • vue下如何利用canvas实现在线图片标注
    目录组件代码如下在开发过程中遇到的问题web端实现在线图片标注在此做下记录,功能类似微信截图时的标注,包含画线、框、箭头和文字输入,思路是利用canvas画布,先把要标注的图片使用d...
    99+
    2024-04-02
  • Android实现多线程断点下载
    目录QDownload1、如何使用1.1、导入依赖1.2、初始化下载组件1.3、核心控制器DownloadManager1.4、监听下载进度1.5、下载相关的操作1.6、应用市场ap...
    99+
    2024-04-02
  • Android 实现单线程轮循机制批量下载图片
    Android 实现单线程轮循机制批量下载图片listview 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需要new一个Thread去下载图片,listview长时间滑动时会产生大量线程。用单线程轮循机制则可...
    99+
    2023-05-30
    android 单线程 下载图片
  • 使用 go 实现多线程下载器的方法
    目录1.多线程下载原理2.构造一个下载器2.1 为下载器提供初始化方法3.实现下载综合调度逻辑3.1 下载文件分段3.2 子线程下载函数4. 保存下载文件函数5.完整代码本篇文章我们...
    99+
    2024-04-02
  • SimpleCommand实现图片下载(二)
    使用simplecommand下载网络图片,并显示到ImageView控件上。1 在app module的build.gradle将simplecommand框架进行导入,具体请看第1节的步骤1和22 设置网络图片的Url地址:这里以请求百...
    99+
    2023-05-30
    simplecommand 图片下载 %d
  • python编程scrapy简单代码实现搜狗图片下载器
    学习任何编程技术,都要有紧有送,今天这篇博客就到了放松的时候了,我们学习一下如何用 scrapy 下载图片吧。 目标站点说明 这次要采集的站点为搜狗图片频道,该频道数据由接口直接返回...
    99+
    2024-04-02
  • php如何实现下载图片
    这篇文章主要介绍了php如何实现下载图片,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php实现下载图片的方法:1、使用“file_get_contents”实现下载图片;2...
    99+
    2023-06-08
  • 怎么利用nodejs​爬取并下载一万多张图片
    这篇文章主要为大家展示了“怎么利用nodejs爬取并下载一万多张图片”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么利用nodejs爬取并下载一万多张图片”这...
    99+
    2024-04-02
  • Golang多线程下载器实现高效快速地下载大文件
    目录前言请求资源http1.1协议Range\Content-RangeLast-Modified\If-Modified-SinceNewRequest()http.Default...
    99+
    2023-05-19
    Golang多线程下载器 Golang下载文件
  • 如何使用Python爬虫实现自动下载图片
    小编给大家分享一下如何使用Python爬虫实现自动下载图片,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float...
    99+
    2023-06-14
  • 在Java项目中如何利用多线程实现文件下载功能
    这篇文章将为大家详细讲解有关在Java项目中如何利用多线程实现文件下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体内容如下import java.io.File; import j...
    99+
    2023-05-31
    java 多线程 文件下载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作