程序介绍
我们有时由于工作原因,需要在网上下载大量的图片,下载图片一般是在百度里面下载,先在搜索文本框里面输入图片的关键字,然后点击百度一下,网站会列出大量相关的图片,如果一张一张的下载,非常耗时,现在用Python爬虫批量下载图片。
实现方法
本脚本主要是利用selenium库模拟人工操作,并且通过BeautifulSoup库解析Javascript动态加载的图片列表,再对获取的图片地址进行下载。
程序代码
from selenium import webdriver
from bs4 import BeautifulSoup
import urllib.request
import os
import time
# 设置搜索关键字和保存路径
keyword = "风景"
save_path = f'D:/图片/{keyword}/'
os.path.exists(save_path) or os.makedirs(save_path)
#设置获取图片的数量
limit = 100
num = 0
# 设置浏览器
options = webdriver.ChromeOptions()
options.add_argument('headless')
browser = webdriver.Chrome(options=options)
# 打开百度图片搜索页面
url = 'https://image.baidu.com/'
browser.get(url)
# 根据关键字搜索图片
search_box = browser.find_element_by_css_selector('#kw')
search_box.send_keys(keyword)
submit_button = browser.find_element_by_css_selector(
'#homeSearchForm > span.s_btn_wr > input.s_newBtn')
submit_button.click()
# 循环加载图片列表并下载图片
scroll_pause_time = 1
last_height = browser.execute_script("return document.body.scrollHeight")
while True:
if num > limit:
break
# 模拟滚动操作
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(scroll_pause_time)
new_height = browser.execute_script("return document.body.scrollHeight")
if new_height == last_height:
# 如果没有加载更多的图片,则退出循环
break
last_height = new_height
# 解析网页并下载图片
soup = BeautifulSoup(browser.page_source, 'html.parser')
img_list = soup.select('img.main_img')
for img in img_list:
src = img['src']
if src.startswith('data'):
# 跳过base64编码的图片
continue
num = num +1
if num>limit:
break
filename = os.path.join(save_path, keyword+str(num)+'.jpg')
try:
urllib.request.urlretrieve(src, filename)
print("成功下载: " + filename)
except:
print("下载失败: " + filename)
# 关闭浏览器
browser.quit()