用python批量下载网络图片,python程序图片

  用python批量下载网络图片,python程序图片

  本文主要介绍用Python多线程制作图像下载器的相关代码。文中展示的示例代码讲解的很详细,对我们学习Python很有帮助。有需要的可以参考一下。

  00-1010介绍开发工具的环境构建原理及效果展示

  

目录

  之前有很多朋友说想学习多线程图片下载器。虽然好像过了很久,但还是上来安排一波吧。至于为什么题目是建立一个小数据集,应该是在微信官方账号后面的文章中用来建立一些简单的图像分类数据集。也就是说,在接下来的时间里,微信官方账号主要会写一些深度学习机器学习的相关文章,下一篇文章会透露具体内容。

  事不宜迟,让我们愉快地开始近期最后一篇爬虫文章吧~

  

导语

  Python版本:3.7.8

  相关模块:

  请求模块;

  活动进程模块;

  Pyfreeproxy模块;

  User_agent模块;

  Beautifulsoup4模块;

  Lxml模块;

  以及python自带的一些模块。

  

开发工具

  安装Python并将其添加到环境变量中。pip可以安装所需的相关模块。

  

环境搭建

  看了之后发现大家基本上都是根据给定的关键词从百度、必应、谷歌下载相关图片数据,所以我们也选择这三个数据源。具体来说,百度的图片搜索界面如下:

  https://image.baidu.com/search/acjson? TN=result JSON _ com IPN=rjct=201326592 lm=7fp=resultie=utf-8oe=utf-8st=-1 word={ } query word={ } face=0pn={ } rn={ }

  为了用多线程搜索图像,我们首先根据我们要下载的图像的数量来构造所有请求页面的链接,如下所示:

  search_urls,pagesize=[],30

  对于范围内的pn(math . ceil(search _ limits * 1.2/pagesize)):

  search _ URL=base _ URL . format(quote(关键字),quote(关键字),pn * pagesize,pagesize

  search_urls.append(search_url)

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

  #获取所有图片链接的多线程请求

  def searchapi(self,search_urls,image_urls,bar):

  而len(search_urls) 0:

  search_url=search_urls.pop(0)

  response=self.get(search_url)

  如果响应为无:

  酒吧()

  继续

  response.encoding=utf-8

  response _ JSON=JSON . loads(response . text . replace(r \ ,),encoding=utf-8 ,strict=False)

  对于response_json[data]:中的项目

  如果item.keys()中的“objURL”为:

  image _ URLs . add(self . parse URL(item[ objURL ]))

  elif replaceUrl in item.keys()和len(item[ replace URL ])==2:

  image _ URLs . add(item[ replace URL ][1][ ObjURL ])

  酒吧()

  task_pool,image _ URL=[],set()

  用alive_bar(min(len(sea

  rch_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(fStart to search images from {self.source_name})

   image_urls = self.search(keyword, search_limits, num_threadings)

   # 多线程下载图片

   self.logging(fStart 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 = fimage_{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图片下载内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: