必应搜索国内版 https://cn.bing.com/images ,这里搜索到的图片质量还不错。
程序运行画面
以搜索关键词建立文件夹存放图片
全部代码
from selenium import webdriver
from selenium.webdriver.common import keys
from bs4 import BeautifulSoup
import requests
import os
import re
import time
import threading
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}
keyword = ''
# 获取页面所有的图片地址
def getallurl():
global keyword # 声明全局变量
keyword = input('请输入搜索关键词:')
if len(keyword) > 0:
browser = webdriver.Chrome()
browser.get('https://cn.bing.com/images')
time.sleep(1)
browser.find_element_by_xpath('//*[@id="sb_form_q"]').send_keys(keyword, keys.Keys.ENTER) # 输入关键词
time.sleep(1)
browser.find_element_by_class_name("fltIdtTit").click() # 点击筛选
time.sleep(1)
browser.find_element_by_class_name("ftrLi").click() # 点击图片尺寸
time.sleep(1)
browser.find_element_by_xpath('//*[@id="ftrB"]/ul/li[1]/div/div/a[5]').click() # 选择特大
time.sleep(1)
i = 0
while i <= 2: #滚动页面次数
js = "var q=document.documentElement.scrollTop=10000"
browser.execute_script(js) # 下拉滚动条
i = i + 1
time.sleep(5) # 等待页面加载5秒
allhtml = browser.page_source # 获取页面源代码
browser.quit() # 拿到页面源代码后关闭浏览器
bs = BeautifulSoup(allhtml, 'lxml')
list01 = bs.find_all('a', class_='iusc') # 获取所有class='iusc'的<a>标签
src_list = re.findall(r'\"murl\"\:\"(.*?)\"\,\"', str(list01)) # 正则匹配图片地址
return src_list # 返回函数值
else:
print('我的世界一片空白^_^')
getallurl()
# 下载图片
semaphore = threading.BoundedSemaphore(3) # 最多允许3个线程同时运行(带宽够大的话可以开多几个线程,确保下载成功率)
def saveimg(src, keyword):
semaphore.acquire() # 加锁
savepath = 'd://cnbing//' + keyword # 保存路径,以关键词分类做文件夹名
name = src.split('/')[-1] # 截取图片地址‘/’右边第一段做文件名
filename = savepath + '//' + name # 拼接成保存图片的绝对路径
# print(filename)
try:
if not os.path.exists(savepath):
os.makedirs(savepath) # 创建多级目录 os.makedirs | 创建单个目录 os.mkdir
if not os.path.exists(filename):
r = requests.get(src, headers=headers, timeout=(3, 7)) # timeout(3,7)表示的连接时间是3秒,响应时间是7秒
with open(filename, 'wb') as f: # 保存图片
f.write(r.content)
print(src + ' 下载完成 ')
except:
print('保存出错')
semaphore.release() # 解锁
# 程序入口
def main():
src_list = getallurl() # 获取函数返回的值
start_time = time.time()
# 多线程调用函数saveimg 保存图片
ts = []
for src in src_list:
t = threading.Thread(target=saveimg, args=(src, keyword)) # 创建线程
t.start() # 启动线程
ts.append(t) # 把线程追加到列表
for x in ts: # 等待所有线程结束
x.join()
alltime = time.time()- start_time
print('耗时:',alltime)
'''
#单线程调用函数saveimg 保存图片
for src in src_list:
saveimg(src,keyword) #循环调用保存图片函数
'''
if __name__ == '__main__':
main()