爬虫实战 -- 批量获取百度图片
法式介绍
我们有时因为工做原因,需要在网上下载大量的图片,下载图片一般是在百度里面下载,先在搜刮文本框里面输进图片的关键字,然后点击百度一下,网站会列出大量相关的图片,假设一张一张的下载,十分耗时,如今用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 = '/'
展开全文
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")
whileTrue:
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'):
# 跳过编码的图片
continue
num = num +1
if numlimit:
break
filename = os.path.join(save_path, keyword+str(num)+'.jpg')
try:
urllib.request.urlretrieve(src, filename)
print("胜利下载: " + filename)
except:
print("下载失败: " + filename)
# 封闭阅读器
browser.quit()