跳到主要内容 Python Selenium 浏览器自动化基础与实战教程 | 极客日志
Python
Python Selenium 浏览器自动化基础与实战教程 介绍 Python Selenium 库的安装与环境搭建,涵盖浏览器基本操作、8 种元素定位方式(ID、XPath、CSS 等)、网页交互(输入、点击、下拉框)、等待机制及综合实战案例。通过 Bing 图片爬虫示例,演示如何自动搜索、滚动加载、解析数据并保存为 JSON/CSV 格式,适合初学者快速上手浏览器自动化任务。
不知所云 发布于 2026/3/30 更新于 2026/4/13 1 浏览一、写给新手的话
如果你是第一次接触 Selenium,可能会觉得有些复杂。别担心!这篇教程将从最基础的安装开始,一步步带你掌握 Selenium 的每个细节。我会用最简单的语言和大量示例代码,让你快速上手。
二、准备工作:环境搭建
2.1 安装 Python(如果你还没有)
首先确认你安装了 Python。打开命令行(Windows 按 Win+R,输入 cmd;Mac 打开终端),输入:
python --version
如果看到类似 Python 3.12.7 这样的版本号,说明已安装。如果没有,去 Python 官网 下载安装。
2.2 安装 Selenium 库 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2.3 安装浏览器驱动管理工具 传统方式需要手动下载浏览器驱动,但现在有更简单的方法:
pip install webdriver-manager
三、第一个 Selenium 程序:打开百度
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("https://www.baidu.com" )
import time
time.sleep(5 )
driver.quit()
自动打开 Chrome 浏览器
自动访问百度首页
5 秒后自动关闭
四、Selenium 基础操作详解
4.1 常用操作汇总表 操作 方法 示例 打开网页 driver.get(url)driver.get("https://www.baidu.com")获取页面标题 driver.titletitle = driver.title获取当前 URL driver.current_urlurl = driver.current_url前进 driver.forward()driver.forward()后退 driver.back()driver.back()刷新 driver.refresh()driver.refresh()关闭当前窗口 driver.close()driver.close()关闭所有窗口 driver.quit()driver.quit()最大化窗口 driver.maximize_window()driver.maximize_window()设置窗口大小 driver.set_window_size(width, height)driver.set_window_size(800, 600)
4.2 详细操作示例
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
print (f"当前页面标题:{driver.title} " )
print (f"当前页面 URL:{driver.current_url} " )
time.sleep(2 )
driver.get("https://www.taobao.com" )
print (f"新页面标题:{driver.title} " )
time.sleep(2 )
driver.back()
print (f"后退后页面:{driver.title} " )
time.sleep(2 )
driver.forward()
print (f"前进后页面:{driver.title} " )
driver.refresh()
driver.maximize_window()
driver.set_window_size(800 , 600 )
finally :
time.sleep(3 )
driver.quit()
print ("浏览器已关闭" )
五、元素定位:找到网页上的内容
这是 Selenium 最重要的部分!就像在网页上找东西一样,我们需要告诉 Selenium'我要找什么'。
5.1 8 种定位方式(从易到难)
方式 1:通过 ID 定位(最简单) <input name ="wd" maxlength ="255" autocomplete ="off" >
search_input = driver.find_element(By.ID, "kw" )
方式 2:通过 NAME 定位
search_input = driver.find_element(By.NAME, "wd" )
方式 3:通过 CLASS_NAME 定位
search_input = driver.find_element(By.CLASS_NAME, "s_ipt" )
方式 4:通过 TAG_NAME 定位
divs = driver.find_elements(By.TAG_NAME, "div" )
inputs = driver.find_elements(By.TAG_NAME, "input" )
links = driver.find_elements(By.TAG_NAME, "a" )
方式 5:通过 LINK_TEXT 定位
news_link = driver.find_element(By.LINK_TEXT, "新闻" )
hao123_link = driver.find_element(By.LINK_TEXT, "hao123" )
方式 6:通过 PARTIAL_LINK_TEXT 定位
baidu_link = driver.find_element(By.PARTIAL_LINK_TEXT, "百度" )
hao123_link = driver.find_element(By.PARTIAL_LINK_TEXT, "hao123" )
方式 7:通过 CSS_SELECTOR 定位(推荐) CSS 选择器功能强大,类似于 CSS 样式选择元素:
element = driver.find_element(By.CSS_SELECTOR, "#kw" )
element = driver.find_element(By.CSS_SELECTOR, ".s_ipt" )
element = driver.find_element(By.CSS_SELECTOR, "input.s_ipt" )
element = driver.find_element(By.CSS_SELECTOR, "[name='wd']" )
element = driver.find_element(By.CSS_SELECTOR, "input#kw.s_ipt[name='wd']" )
方式 8:通过 XPATH 定位(最强大)
element = driver.find_element(By.XPATH, "/html/body/div/div[2]/div/div/div/form/span/input" )
element = driver.find_element(By.XPATH, "//input" )
element = driver.find_element(By.XPATH, "//input[@id='kw']" )
element = driver.find_element(By.XPATH, "//input[@name='wd']" )
element = driver.find_element(By.XPATH, "//input[@id='kw' and @name='wd']" )
element = driver.find_element(By.XPATH, "//a[text()='新闻']" )
element = driver.find_element(By.XPATH, "//a[contains(text(),'新闻')]" )
5.2 元素定位完整示例 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
search_box = driver.find_element(By.ID, "kw" )
search_box = driver.find_element(By.NAME, "wd" )
search_box = driver.find_element(By.CLASS_NAME, "s_ipt" )
inputs = driver.find_elements(By.TAG_NAME, "input" )
print (f"找到 {len (inputs)} 个 input 元素" )
news_link = driver.find_element(By.LINK_TEXT, "新闻" )
news_links = driver.find_elements(By.PARTIAL_LINK_TEXT, "新" )
print (f"找到 {len (news_links)} 个包含'新'的链接" )
search_box = driver.find_element(By.CSS_SELECTOR, "#kw" )
search_box = driver.find_element(By.CSS_SELECTOR, ".s_ipt" )
search_box = driver.find_element(By.CSS_SELECTOR, "input#kw" )
search_box = driver.find_element(By.XPATH, "//input[@id='kw']" )
search_box = driver.find_element(By.XPATH, "//*[@id='kw']" )
print ("所有定位方式测试成功!" )
finally :
driver.quit()
5.3 元素定位选择建议 场景 推荐方式 原因 元素有 id By.ID 最简单、最快、唯一 元素有 name By.NAME 简单常用 元素有 class By.CLASS_NAME 简单,但 class 可能重复 查找多个同类元素 By.TAG_NAME 查找所有同类元素 精确文本链接 By.LINK_TEXT 链接文本不变时使用 模糊文本链接 By.PARTIAL_LINK_TEXT 链接文本部分匹配 复杂选择 By.CSS_SELECTOR 功能强大,语法简洁 最复杂情况 By.XPATH 功能最强大,但稍慢
六、元素操作:与网页交互
6.1 输入文本 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
search_box = driver.find_element(By.ID, "kw" )
search_box.send_keys("Python 教程" )
time.sleep(2 )
search_box.clear()
search_box.send_keys("Selenium 教程" )
time.sleep(2 )
from selenium.webdriver.common.keys import Keys
search_box.clear()
search_box.send_keys("自动化测试" )
search_box.send_keys(Keys.ENTER)
time.sleep(2 )
finally :
driver.quit()
6.2 点击操作 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
search_box = driver.find_element(By.ID, "kw" )
search_box.send_keys("Python" )
search_button = driver.find_element(By.ID, "su" )
search_button.click()
time.sleep(2 )
driver.back()
time.sleep(1 )
search_box = driver.find_element(By.ID, "kw" )
search_box.clear()
search_box.send_keys("Selenium" )
search_box.submit()
time.sleep(2 )
finally :
driver.quit()
6.3 获取元素信息 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
search_box = driver.find_element(By.ID, "kw" )
print (f"元素标签名:{search_box.tag_name} " )
print (f"元素 ID: {search_box.get_attribute('id' )} " )
print (f"元素 name: {search_box.get_attribute('name' )} " )
print (f"元素 class: {search_box.get_attribute('class' )} " )
print (f"元素类型:{search_box.get_attribute('type' )} " )
print (f"元素值:{search_box.get_attribute('value' )} " )
print (f"元素是否可见:{search_box.is_displayed()} " )
print (f"元素是否可用:{search_box.is_enabled()} " )
print (f"元素是否被选中:{search_box.is_selected()} " )
location = search_box.location
size = search_box.size
print (f"元素位置:x={location['x' ]} , y={location['y' ]} " )
print (f"元素大小:宽={size['width' ]} , 高={size['height' ]} " )
baidu_link = driver.find_element(By.LINK_TEXT, "百度首页" )
print (f"链接文本:{baidu_link.text} " )
finally :
driver.quit()
6.4 处理下拉框 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_select" )
driver.switch_to.frame("iframeResult" )
cars_select = driver.find_element(By.ID, "cars" )
select = Select(cars_select)
select.select_by_visible_text("Audi" )
time.sleep(1 )
select.select_by_value("opel" )
time.sleep(1 )
select.select_by_index(0 )
time.sleep(1 )
all_options = select.options
print ("所有选项:" )
for option in all_options:
print (f" {option.text} (value: {option.get_attribute('value' )} )" )
selected_option = select.first_selected_option
print (f"当前选中:{selected_option.text} " )
finally :
driver.quit()
6.5 处理复选框和单选框 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_input_type_checkbox" )
driver.switch_to.frame("iframeResult" )
vehicle1 = driver.find_element(By.ID, "vehicle1" )
vehicle2 = driver.find_element(By.ID, "vehicle2" )
vehicle3 = driver.find_element(By.ID, "vehicle3" )
print (f"自行车是否选中:{vehicle1.is_selected()} " )
print (f"汽车是否选中:{vehicle2.is_selected()} " )
print (f"船是否选中:{vehicle3.is_selected()} " )
if not vehicle1.is_selected():
vehicle1.click()
time.sleep(1 )
if not vehicle2.is_selected():
vehicle2.click()
time.sleep(1 )
if vehicle3.is_selected():
vehicle3.click()
time.sleep(1 )
print (f"自行车是否选中:{vehicle1.is_selected()} " )
print (f"汽车是否选中:{vehicle2.is_selected()} " )
print (f"船是否选中:{vehicle3.is_selected()} " )
finally :
driver.quit()
七、等待机制:让程序"等一等"
7.1 强制等待(不推荐) import time
time.sleep(5 )
缺点 :如果元素提前加载完成,也要等;如果超时未加载,会报错。
7.2 隐式等待(全局等待) from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(10 )
driver.get("https://www.baidu.com" )
element = driver.find_element("id" , "kw" )
7.3 显式等待(推荐) from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.get("https://www.baidu.com" )
wait = WebDriverWait(driver, 10 , 0.5 )
search_box = wait.until(EC.presence_of_element_located((By.ID, "kw" )))
print ("搜索框已出现" )
search_button = wait.until(EC.element_to_be_clickable((By.ID, "su" )))
print ("搜索按钮可点击" )
logo = wait.until(EC.visibility_of_element_located((By.ID, "lg" )))
print ("百度 logo 可见" )
news_link = wait.until(EC.text_to_be_present_in_element((By.LINK_TEXT, "新闻" ), "新闻" ))
print ("新闻链接文本正确" )
finally :
driver.quit()
7.4 常用等待条件 条件 说明 presence_of_element_located元素出现在 DOM 中(不一定可见) visibility_of_element_located元素可见(有宽高,非隐藏) element_to_be_clickable元素可点击 text_to_be_present_in_element元素包含特定文本 title_contains页面标题包含特定文本 alert_is_present出现警告框
7.5 等待机制完整示例 from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try :
driver.implicitly_wait(5 )
driver.get("https://the-internet.herokuapp.com/dynamic_loading/2" )
start_button = driver.find_element(By.XPATH, "//button[text()='Start']" )
start_button.click()
wait = WebDriverWait(driver, 10 )
finish_text = wait.until(EC.visibility_of_element_located((By.ID, "finish" )))
print (f"加载完成,文字内容:{finish_text.text} " )
wait.until(EC.text_to_be_present_in_element((By.ID, "finish" ), "Hello World!" ))
print ("成功等到'Hello World!'文本" )
finally :
time.sleep(2 )
driver.quit()
八、综合实战:自动化登录并爬取数据
现在我们来完成一个完整的实战案例:登录并爬取 Bing 图片的描述信息。
8.1 项目目标
访问 Bing 图片搜索
搜索"小黑子"图片
滚动加载更多图片
获取每张图片的标题和描述
保存数据到文件
8.2 完整代码(带详细注释) """ Bing 图片爬虫 - Selenium 新手实战教程
功能:自动搜索并获取 Bing 图片信息
"""
import os
import time
import json
import csv
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
class BingImageCrawler :
"""Bing 图片爬虫类"""
def __init__ (self, headless=False ):
"""
初始化爬虫
参数:
headless: 是否使用无头模式(不显示浏览器窗口)
默认 False 显示窗口,适合新手调试
"""
print ("=" * 50 )
print ("Bing 图片爬虫 - 初始化中..." )
print ("=" * 50 )
self .data_dir = "bing_images_data"
if not os.path.exists(self .data_dir):
os.makedirs(self .data_dir)
print (f"创建文件夹:{self.data_dir} " )
options = webdriver.ChromeOptions()
if headless:
options.add_argument('--headless' )
print ("启用无头模式(不显示浏览器窗口)" )
options.add_argument('--no-sandbox' )
options.add_argument('--disable-dev-shm-usage' )
options.add_argument('--disable-gpu' )
options.add_argument('--window-size=1920,580' )
print ("正在下载/配置 Chrome 浏览器驱动..." )
service = Service(ChromeDriverManager().install())
self .driver = webdriver.Chrome(service=service, options=options)
self .wait = WebDriverWait(self .driver, 5 )
print ("浏览器启动成功!" )
def search_images (self, keyword, max_images=10 ):
"""
搜索图片
参数:
keyword: 搜索关键词,如"小黑子"
max_images: 最大图片数量
返回:
图片数据列表
"""
print (f"\n开始搜索:{keyword} " )
try :
search_url = f"https://cn.bing.com/images/search?q={keyword} "
self .driver.get(search_url)
print (f"访问 URL: {search_url} " )
time.sleep(2 )
try :
search_box = self .wait.until(
EC.presence_of_element_located((By.ID, "sb_form_q" ))
)
print ("页面加载完成" )
except :
print ("页面加载异常,但继续执行..." )
print ("开始滚动加载图片..." )
loaded_count = self ._scroll_to_load_images(max_images)
print ("开始解析图片信息..." )
images_data = self ._parse_images(loaded_count)
if images_data:
print (f"成功获取 {len (images_data)} 张图片信息" )
else :
print ("未找到图片数据" )
return images_data
except Exception as e:
print (f"搜索过程中发生错误:{str (e)} " )
return []
def _scroll_to_load_images (self, max_images ):
"""
滚动页面加载更多图片
返回:
加载的图片数量
"""
images_count = 0
scroll_count = 0
max_scroll = 1
while images_count < max_images and scroll_count < max_scroll:
current_images = self .driver.find_elements(
By.CSS_SELECTOR, '.imgpt .iusc'
)
images_count = len (current_images)
print (f" 已加载 {images_count} 张图片" )
if images_count >= max_images:
break
self .driver.execute_script(
"window.scrollTo(0, document.body.scrollHeight);"
)
time.sleep(1.5 )
scroll_count += 1
try :
load_more = self .driver.find_element(By.CLASS_NAME, 'btn_seemore' )
if load_more.is_displayed():
load_more.click()
print (" 点击'加载更多'按钮" )
time.sleep(2 )
except :
pass
print (f"滚动完成,共加载 {images_count} 张图片" )
return images_count
def _parse_images (self, max_count ):
"""
解析图片信息
返回:
图片数据列表
"""
images_data = []
seen_urls = set ()
image_elements = self .driver.find_elements(
By.CSS_SELECTOR, '.imgpt .iusc'
)[:max_count]
for idx, img_element in enumerate (image_elements):
try :
m_value = img_element.get_attribute('m' )
if m_value:
img_info = json.loads(m_value)
image_url = img_info.get('murl' , '' )
if image_url in seen_urls:
continue
seen_urls.add(image_url)
image_data = {
'序号' : len (images_data) + 1 ,
'标题' : img_info.get('t' , '无标题' ),
'描述' : img_info.get('desc' , '无描述' ),
'图片 URL' : image_url,
'缩略图 URL' : img_info.get('turl' , '' ),
'宽度' : img_info.get('w' , '未知' ),
'高度' : img_info.get('h' , '未知' ),
'文件类型' : img_info.get('ity' , '未知' ),
'来源网站' : img_info.get('purl' , '' ),
'域名' : img_info.get('p' , '' ),
'采集时间' : datetime.now().strftime('%Y-%m-%d %H:%M:%S' )
}
images_data.append(image_data)
if len (images_data) % 10 == 0 :
print (f" 已解析 {len (images_data)} 张图片..." )
except Exception as e:
print (f" 解析第 {idx + 1 } 张图片时出错:{str (e)} " )
continue
return images_data
def save_data (self, images_data, keyword ):
"""
保存数据到文件
参数:
images_data: 图片数据列表
keyword: 搜索关键词(用于命名文件)
"""
if not images_data:
print ("没有数据可保存" )
return
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S' )
base_filename = f"{keyword} _{timestamp} "
json_file = os.path.join(self .data_dir, f"{base_filename} .json" )
with open (json_file, 'w' , encoding='utf-8' ) as f:
json.dump(images_data, f, ensure_ascii=False , indent=2 )
csv_file = os.path.join(self .data_dir, f"{base_filename} .csv" )
with open (csv_file, 'w' , encoding='utf-8' ) as f:
fieldnames = images_data[0 ].keys()
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for img in images_data:
writer.writerow(img)
txt_file = os.path.join(self .data_dir, f"{base_filename} .txt" )
with open (txt_file, 'w' , encoding='utf-8' ) as f:
f.write(f"搜索关键词:{keyword} \n" )
f.write(f"采集时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S' )} \n" )
f.write(f"图片数量:{len (images_data)} \n" )
f.write("=" * 50 + "\n\n" )
for img in images_data:
f.write(f"图片 {img['序号' ]} :\n" )
f.write(f" 标题:{img['标题' ]} \n" )
f.write(f" 描述:{img['描述' ]} \n" )
f.write(f" 尺寸:{img['宽度' ]} x{img['高度' ]} \n" )
f.write(f" 类型:{img['文件类型' ]} \n" )
f.write(f" 图片 URL: {img['图片 URL' ][:80 ]} ...\n" )
f.write("-" * 30 + "\n" )
print (f"\n数据已保存到:" )
print (f" JSON 文件:{json_file} " )
print (f" CSV 文件:{csv_file} " )
print (f" 文本文件:{txt_file} " )
def display_sample_data (self, images_data, count=10 ):
"""
显示示例数据
参数:
images_data: 图片数据列表
count: 显示前几条数据
"""
if not images_data:
print ("没有数据可显示" )
return
print (f"\n前 {min (count, len (images_data))} 条数据示例:" )
print ("=" * 60 )
for i, img in enumerate (images_data[:count]):
print (f"{img['序号' ]} . {img['标题' ]} " )
desc = img['描述' ][:80 ] + "..." if len (img['描述' ]) > 80 else img['描述' ]
print (f" 描述:{desc} " )
print (f" 尺寸:{img['宽度' ]} x{img['高度' ]} " )
print (f" 类型:{img['文件类型' ]} " )
print ()
def close (self ):
"""关闭浏览器"""
self .driver.quit()
print ("浏览器已关闭" )
def main ():
"""主程序"""
print ("=" * 50 )
print ("Bing 图片爬虫 - 新手实战教程" )
print ("=" * 50 )
keyword = "小黑子"
max_images = 10
headless = False
crawler = BingImageCrawler(headless=headless)
try :
images_data = crawler.search_images(keyword, max_images)
if images_data:
crawler.display_sample_data(images_data, count=3 )
crawler.save_data(images_data, keyword)
print ("\n" + "=" * 50 )
choice = input ("是否查看所有图片标题?(y/n): " ).lower()
if choice == 'y' :
print ("\n所有图片标题:" )
for img in images_data:
print (f" {img['序号' ]:2d} . {img['标题' ]} " )
else :
print ("未能获取图片数据,请检查网络或重试" )
except KeyboardInterrupt:
print ("\n用户中断操作" )
except Exception as e:
print (f"\n程序运行出错:{str (e)} " )
print ("可能的原因:" )
print (" 1. 网络连接问题" )
print (" 2. 浏览器驱动问题,请重新运行程序" )
print (" 3. 网页结构已变化,需要更新代码" )
finally :
input ("\n按回车键退出程序..." )
crawler.close()
if __name__ == "__main__" :
main()
8.3 代码分步解析
第一步:导入库 import os
import time
import json
import csv
from datetime import datetime
第二步:创建爬虫类 class BingImageCrawler :
def __init__ (self, headless=False ):
第三步:搜索图片 def search_images (self, keyword, max_images=10 ):
第四步:滚动加载 def _scroll_to_load_images (self, max_images ):
第五步:解析数据 def _parse_images (self, max_count ):
第六步:保存数据 def save_data (self, images_data, keyword ):
8.4 如何运行程序
保存代码 :将上面的完整代码保存为 bing_crawler.py
运行程序 :
你会看到 :
自动打开 Chrome 浏览器
访问 Bing 图片搜索
搜索"小黑子"图片
自动滚动加载更多图片
获取图片信息
保存到文件
在控制台显示结果
查看结果 :
在程序所在目录会创建 bing_images_data 文件夹
里面包含 3 个文件:
小黑子_时间戳.json:完整 JSON 数据
小黑子_时间戳.csv:Excel 可打开的表格
小黑子_时间戳.txt:易读的文本格式
8.5 修改配置尝试
keyword = "动物"
max_images = 20
headless = True
九、常见问题与解决方法
问题 1:找不到元素(NoSuchElementException) selenium.common.exceptions.NoSuchElementException: Message: no such element
元素还没加载出来
元素 ID/名称已改变
页面有 iframe 框架
element = WebDriverWait(driver, 10 ).until(
EC.presence_of_element_located((By.ID, "element_id" ))
)
driver.switch_to.frame("iframe_name_or_id" )
driver.switch_to.default_content()
问题 2:元素不可点击(ElementNotInteractableException) ElementNotInteractableException: element not interactable
元素被其他元素遮挡
元素不可见(display: none)
元素还没加载完成
element = WebDriverWait(driver, 10 ).until(
EC.element_to_be_clickable((By.ID, "element_id" ))
)
driver.execute_script("arguments[0].click();" , element)
driver.execute_script("arguments[0].scrollIntoView();" , element)
element.click()
问题 3:超时错误(TimeoutException) TimeoutException: Message: timeout waiting for element
wait = WebDriverWait(driver, 20 )
wait = WebDriverWait(driver, 10 , 0.1 )
问题 4:浏览器驱动问题 WebDriverException: Message: 'chromedriver' executable needs to be in PATH
解决方法 :
确保安装了 webdriver-manager 并正确使用:
from webdriver_manager.chrome import ChromeDriverManager
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
十、学习建议与下一步
10.1 给新手的建议
从简单开始 :先运行示例代码,理解每行代码的作用
多练习 :修改代码中的参数,观察变化
善用打印 :使用 print() 输出中间结果,方便调试
分步调试 :不要一次性写太多代码,写完一小段就测试
10.2 练习题目
基础练习 :修改代码,爬取"动物"或"汽车"图片
进阶练习 :添加功能,自动下载前 5 张图片到本地
挑战练习 :爬取其他网站,如豆瓣电影、知乎热点等
10.3 下一步学习方向
处理复杂网站 :学习处理登录、验证码、Ajax 加载
提高效率 :学习多线程、分布式爬虫
避免被封 :学习使用代理、随机延迟、伪装浏览器
数据存储 :学习使用数据库(MySQL、MongoDB)
十一、总结 ✅ Selenium 基础 :安装、启动浏览器、基本操作
✅ 元素定位 :8 种定位方式,找到网页上的任何元素
✅ 元素操作 :点击、输入、获取信息、处理表单
✅ 等待机制 :显式等待、隐式等待,处理动态加载
✅ 实战项目 :完整的 Bing 图片爬虫,包含数据保存
Selenium 是一个强大的工具,不仅可以用于爬虫,还可以用于自动化测试、自动化办公等。现在你已经有了坚实的基础,可以继续探索更多高级功能了!
记住 :学习编程最好的方式就是动手实践。复制代码运行一次,然后尝试修改它,最后尝试自己从头写一个类似的项目。
祝你学习顺利!如果有问题,可以随时查阅 Selenium 官方文档或在线搜索解决方案。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown 转 HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
HTML 转 Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online