0%

自制百度图片爬虫

当我们制作数据集时,经常会遇到批量下载百度图片的问题,制作一个批量下载器就显得很有必要,用python可以很快实现一个图片下载器

我们的图片下载器要实现以下目标:

  1. 自动下载某一关键词的(keyword)百度图片
  2. 可选的下载页范围
  3. 可选的图片下载路径和图片名

用到的依赖库有

1
2
3
4
5
import re #正则表达式匹配图片url
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='
# 所有图片的url
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
# 正则表达式匹配图片的真实url
tmp_url_list += re.findall('"objURL":"(.*?)",', result, re.S)
# 利用set除重 并用index恢复原顺序 注意list.sort()无返回值
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