当我们制作数据集时,经常会遇到批量下载百度图片的问题,制作一个批量下载器就显得很有必要,用python可以很快实现一个图片下载器
我们的图片下载器要实现以下目标:
- 自动下载某一关键词的(keyword)百度图片
- 可选的下载页范围
- 可选的图片下载路径和图片名
用到的依赖库有
1 2 3 4 5
| import re import requests from tqdm import tqdm import os import argparse
|
我们使用命令行封装我们的图片下载器
1 2 3 4 5 6 7 8 9 10 11
| ''' 输入参数:<keyword> 可选参数:<file_path> <img_name> <start_page> <end_page> ''' parser = argparse.ArgumentParser() parser.add_argument("keyword", type=str, help="search keyword") parser.add_argument("-f", "--file_path", type=str, default="data/", help="path of save file") parser.add_argument("-n", "--img_name", type=str, default="data", help="name of images") parser.add_argument("-s", "--start_page", type=int, default=1, help="index of start page") parser.add_argument("-e", "--end_page", type=int, default=1, help="index of end page") arg = parser.parse_args()
|
通过输入参数,首先确定爬取的图片页数,存取对应图片的url
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| def find_url(start_page, end_page, keyword): url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + keyword + '&pn=' tmp_url_list = [] bar = tqdm(range(start_page - 1, end_page)) bar.set_description("Parsing images url") for cur_page in bar: try: result = requests.get(url + str(cur_page), timeout=10) except BaseException: print("Error in visiting page " + str(cur_page + 1)) continue else: result = result.text tmp_url_list += re.findall('"objURL":"(.*?)",', result, re.S) img_url_list = list(set(tmp_url_list)) img_url_list.sort(key=tmp_url_list.index) return img_url_list
|
接下来完成下载指定图片的下载器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| def download_img(img_url_list, file_path, img_name): index = 1 bar = tqdm(img_url_list) bar.set_description("Downloading") for item in bar: try: if item is not None: img = requests.get(item, timeout=10) else: continue except BaseException: print('Error in downloading image ' + str(index)) continue else: string = file_path + '/' + img_name + '_' + str(index) + '.jpg' fp = open(string, 'wb') fp.write(img.content) fp.close() index += 1 return
|
最后将输入参数、URL爬取器和图片下载器结合,就完成了我们的简易百度图片下载器
完整代码见:https://github.com/cxhZCM123/BaiduImageCrawler