使用Python的requests库和正则表达式实现图片下载功能。
通过百度图片搜索,根据用户输入的关键词搜索相关图片,
并提供下载选项。
import requests
import re
import os
Urls_list=[]
keyword=''
def imagesTotal(urls):
print('正在检测图片数量,请稍等.......')
pages=0 #记录翻页
count=0 #有多少关联图片
while pages<100: #总共5页
try:
ssrq=session_Request()
except BaseException:
continue
else:
res= ssrq.get(urls,timeout=7,allow_redirects=False)
pic_url=re.findall('"objURL":"(.*?)",', res.text, re.S)
count += len(pic_url)
if len(pic_url)==0:
break
else:
Urls_list.append(pic_url)
pages+=20
return count
def session_Request():
headers={
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0',
'Upgrade-Insecure-Requests': '1'
}
ssrq=requests.session()#构造session保持回话
ssrq.headers=headers
return ssrq
def downset(keyword,count):
print('经过检测%s类图片共有%d张' % (keyword, count))
numPic = int(input('请输入想要下载的图片数量 '))
file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')
istrue = os.path.exists(file)
if istrue == 1:
print('该文件已存在,请重新输入')
file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')
os.mkdir(file)
else:
os.mkdir(file)
print('找到关键词:' + keyword + '的图片,即将开始下载图片...')
startdownload(numPic,file)
def startdownload(num,file):
numPic=num
count=0
for item in Urls_list:
if len(item)==0:
break
else:
for items in item:
# print(items)
if count < numPic:
print('正在下载第' + str(count+1) + '张图片.....')
string = file + r'\\' + keyword + '_' + str(count) + '.jpg'
try:
if items is not None:
piccontent=requests.get(items,timeout=7)
else:
continue
except:
print('错误,当前图片无法下载')
continue
else:
fp = open(string, 'wb')
fp.write(piccontent.content)
fp.close()
count += 1
def run():
keyword=input('请输入需要下载图片的主题')
urls = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + keyword + '&pn='
count=imagesTotal(urls)
downset(keyword,count)
if __name__ == '__main__':
run()
- `import requests`: 导入requests库,用于发送HTTP请求。
- `import re`: 导入re模块,用于正则表达式匹配。
- `import os`: 导入os模块,用于文件操作。
`Urls_list=[]`: 定义一个空列表`Urls_list`,用于存储图片的URL链接。
`keyword=''`:定义一个空字符串`keyword`,用于存储用户输入的关键词。
`imagesTotal(urls)`: 定义一个函数`imagesTotal`,用于获取图片总数。接受一个参数`urls`,表示图片搜索的URL链接。
1. 使用`print()`函数打印提示信息"正在检测图片数量,请稍等......."。
2. 初始化变量`pages`为0,用于记录翻页的次数。
3. 初始化变量`count`为0,用于记录关联图片的数量。
4. 在循环中,当`pages`小于100时(最多5页)执行以下操作:
- 构建会话请求对象并赋值给变量`ssrq`,调用`session_Request()`函数。
- 发送GET请求到指定的URL链接`urls`,设置超时时间为7秒,禁止重定向。
- 使用正则表达式`re.findall()`从响应的文本内容中提取所有图片URL,并将结果赋值给变量`pic_url`。
- 将提取到的图片URL列表添加到`Urls_list`中。
- 将提取到的图片URL数量累加到`count`中。
- 如果提取到的图片URL数量为0,则跳出循环。
- 否则,`pages`增加20,用于翻页。
5. 返回关联图片的数量`count`。
`session_Request()`: 定义一个函数`session_Request`,用于构建会话请求对象。无参数。
1. 定义请求头`headers`,包含一些浏览器标识的信息。
2. 创建一个会话请求对象`ssrq`,使用`requests.session()`方法。
3. 设置会话请求对象的请求头`ssrq.headers`为上面定义的请求头。
4. 返回会话请求对象`ssrq`。
`downset(keyword,count)`: 定义一个函数`downset`,用于设置下载参数,包括下载数量和存储文件夹。接受两个参数`keyword`和`count`,分别表示关键词和关联图片的数量。
1. 使用`print()`函数打印提示信息"经过检测%s类图片共有%d张" % (keyword, count)。
2. 使用`int(input())`函数获取用户输入的下载数量,并将其转换为整数赋值给变量`numPic`。
3. 使用`input()`函数获取用户输入的存储图片的文件夹名称,并将其赋值给变量`file`。
4. 使用`os.path.exists()`函数判断文件夹是否已存在,将返回的布尔值赋值给变量`istrue`。
5. 如果`istrue`为1(即文件夹已存在),使用`print()`函数打印提示信息"该文件已存在,请重新输入",然后再次使用`input()`函数获取用户输入的存储图片的文件夹名称,并将其赋值给变量`file`。
6. 否则,使用`os.mkdir()`函数创建一个新的文件夹。
7. 使用`print()`函数打印提示信息"找到关键词:' + keyword + '的图片,即将开始下载图片..."。
8. 调用`startdownload(numPic,file)`函数开始下载图片。
`startdownload(num,file)`: 定义一个函数`startdownload`,用于开始下载图片。接受两个参数`num`和`file`,分别表示下载数量和存储文件夹名称。
1. 将参数`num`赋值给变量`numPic`,用于记录下载的图片数量。
2. 初始化变量`count`为0,用于记录下载的图片数量。
3. 在遍历`Urls_list`中的每个元素(图片URL列表)时执行以下操作:
- 如果当前元素为空列表,则跳出当前循环。
- 否则,在遍历当前元素中的每个URL时执行以下操作:
- 如果`count`小于`numPic`,执行以下操作:
- 使用`print()`函数打印提示信息"正在下载第' + str(count+1) + '张图片....."。
- 构建图片保存路径字符串`string`,包括文件夹名称、关键词和图片编号。
- 使用`requests.get()`方法发送HTTP请求,获取图片的二进制内容,并将其赋值给变量`piccontent`。
- 创建一个以二进制写入模式打开的文件对象`fp`,使用`open()`函数。
- 将图片的二进制内容写入到文件中,使用`fp.write()`方法。
- 关闭文件对象,使用`fp.close()`方法。
- 将`count`累加1,用于统计下载数量。
4. `run()`: 定义一个函数`run`,用于控制整个程序的执行过程。
(1) 使用`input()`函数获取用户输入的关键词,并将其赋值给变量`keyword`。
(2) 构建图片搜索的URL链接`urls`,包括百度图片搜索的固定部分和用户输入的关键词。
(3) 调用`imagesTotal(urls)`函数获取关联图片的总数,并将返回的结果赋值给变量`count`。
(4)调用`downset(keyword,count)`函数设置下载参数并开始下载。