程序介绍  

我们有时由于工作原因,需要在网上下载大量的图片,下载图片一般是在百度里面下载,先在搜索文本框里面输入图片的关键字,然后点击百度一下,网站会列出大量相关的图片,如果一张一张的下载,非常耗时,现在用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()