今天继续网络爬虫的学习,在第二部中我们已经实现了简单的selenium方法自动化下载网页图片并且翻页。下面进一步掌握selenium库的常见操作。
.find_element()方法
1、介绍
在 Selenium 中,find_element() 是用于定位单个网页元素 的核心方法,与之对应的 find_elements() 用于定位多个元素(返回列表)。
2、基本语法
find_element() 接收两个参数:定位策略(By) 和 定位表达式,语法如下:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
# 初始化浏览器驱动(以Chrome为例)
driver = webdriver.Chrome()
driver.get("https://example.com")
# 核心用法:find_element(定位策略, 定位表达式)
element = driver.find_element(By.ID, "element-id")
3、常用定位策略(By 类的常量)
Selenium 提供了 8 种主流定位策略,优先级和适用场景不同(从精准到粗糙排序):

补充:find_element()方法是可以嵌套的。
小技巧:检查页面,双击选择的属性,ctrl+f,搜索选择的属性是否唯一,以此判断是否以这个属性来定位元素。
案例
我们直接在案例中来介绍selenium具体实现的功能。
案例一:向网页中输入文字并搜索
网站搜索框源码: 
代码思路:
定位搜索框,输入内容,模拟回车
代码:
python
'''向网页中输入文字并开始搜索'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
#以上代码用来导入相关库,并初始化配置并船舰启动浏览器
driver.get('http://www.bilibili.com')
search=driver.find_element(by=By.TAG_NAME,value="input")#定位搜索框,赋值给search
search.send_Key("雷兹")#调用方法,在搜索框中输入内容
search.send_Key(RETURN)#模拟按下回车键
input("dd")#保持浏览器窗口,否则进程结束浏览器自动关闭
#下面是简化的写法
driver.get('http://www.bilibili.com')
driver.find_element(by=By.TAG_NAME,value="input").send_keys("雷兹"+ Keys.RETURN)
# Keys.RETURN 用于模拟按下回车键
input('dd')
补充注释:
1、这里使用by.tag_name通过标签名来定位搜索框。
2、driver = webdriver.Edge(options=edge_options):
- 创建并启动 Edge 浏览器的自动化驱动实例(
driver是行业通用的变量名),并将之前配置的edge_options传入,使浏览器按照指定配置启动。 - 执行这行代码后,会弹出一个新的 Edge 浏览器窗口 ,该窗口由 Selenium 控制,后续可通过
driver调用各种方法操作网页(如driver.get("https://www.baidu.com")访问百度、driver.find_element(By.ID, "kw")定位搜索框等)。
执行结果: 
案例二:在百度识图中上传图片完成识别
网页上传图片元素源代码:
识别结果元素源代码:
代码思路:
by.name定位图片上传元素,send_Keys方法传入图片 ,by.class_name定位识别结果,.text方法输出识别结果
代码:
python
'''在百度识图中上传图片,实现对图片的识别(进阶版)'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
edge_options = Options()
# 将 --headLess 参数添加到 WebDriver 的配置中时,它告诉浏览器在"无头"模式下运行。
# 无头模式意味着浏览器在没有图形界面的情况下运行。这对于执行自动化测试或者在服务器上运行爬虫时非常有用,因为它节省了资源,并且运行速度可能更快。
# edge_options.add_argument('--headless')
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get('https://graph.baidu.com/pcpage/index?tpl_from=pc')
# driver.find_elements(by=By.TAG_NAME,value="input")[1].send_keys(r"E:\爬虫\Picture2\3.jpg")
# 或
input_element = driver.find_element(by=By.NAME,value="file")#定位标签
input_element.send_keys(r"D:\无畏时刻\python爬虫\selunium操作\雷兹\4.png")
time.sleep(5)
elment = driver.find_element(by=By.CLASS_NAME,value="graph-guess-word") #elements是获取所有标签
print(elment.text)
input("dd")
将 --headLess 参数添加到 WebDriver 的配置中时,它告诉浏览器在"无头"模式下运行。
无头模式意味着浏览器在没有图形界面的情况下运行。这对于执行自动化测试或者在服务器上运行爬虫时非常有用,因为它节省了资源,并且运行速度可能更快。
edge_options.add_argument('--headless')
执行结果:
案例三:网页前进后退刷新
通过对实例化对象调用.forward(),.back(),.refresh()实现
代码:
python
'''前进后退刷新'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
import time
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get('http://www.taobao.com') # 请求网页http://www.taobao.com
driver.get('http://www.baidu.com')
driver.get('http://www.bilibili.com')
driver.back() # 网页返回到上一步
time.sleep(8) #
driver.forward() # 网页返回到下一步
time.sleep(8)
driver.refresh() # 刷新
time.sleep(8)
# driver.quit()#关闭浏览器
driver.close() # 关闭当前窗口 T、B、bi、B、8、bi、8、刷新、关闭
执行后依次打开网页,退后,前进,刷新。
案例四:搜索图片批量下载
代码:
python
'''爬取图片(find_element)2.0'''
import requests
import os
import time
if not os.path.exists("./雷兹"):
os.mkdir("./雷兹")
#批量化下载网页资源
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver=webdriver.Edge(options=edge_options)
driver.get('https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=雷兹')
#执行JavaScript滚动操作
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
img_list=driver.find_elements(By.XPATH, value="//img[@class='img_7rRSL']")
# print(img_list)
i=1
for img in img_list:
# 获取图片的src属性
img_url = img.get_attribute("src")
img_data = requests.get(img_url)
# 保存图片到文件
with open(f"./雷兹/{i}.png", 'wb') as f:
f.write(img_data.content)
i += 1
代码中我们进行了一个滑动滚轮的操作,可以使得页面加载更多的图片。然后使用find_elements返回图片网址的列表,借助content循环写入到文件夹。
执行结果:
案例五:模拟点击click
网页源代码:
代码:
python
'''模拟点击click方法'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options) #①
driver.get('https://www.bilibili.com/')
elements = driver.find_elements(by= By.TAG_NAME,value="a") #elements是获取所有标签
...
for elment in elements:
print(elment.text) #获取标签的内容。当标签比较多的时候
if elment.text == '电影': #if条件判断,找到你需要的内容
elment.click() #执行对应的操作,这里执行点击,click()
input('dd')
运行结果:
案例六:爬取苏宁易购的好评差评
网页源代码:
每一页有十条评论。
代码:
python
'''爬取苏宁手机的评论并保存'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" #Edge浏览器的路径
driver = webdriver.Edge(options=edge_options)
# 爬取好评
driver.get("https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166")
hp_file = open("好评1.txt", "w", encoding='utf8')
def get_py_content(file):
pj_elements = driver.find_elements(By.CLASS_NAME, value="body-content") # 寻找所有的class为body-content的标签
for element in pj_elements:
file.write(element.text + '\n')
get_py_content(hp_file)
next_elements = driver.find_elements(By.XPATH, value='//a[@class="next rv-maidian "]')
print(next_elements)
while next_elements != []: # 判断是否有下一页的按钮
next_element = next_elements[0]
time.sleep(1)
next_element.click() # 点击下一页按钮
get_py_content(hp_file)
next_elements = driver.find_elements(By.XPATH, value='//a[@class="next rv-maidian "]')
# '''爬取差评'''
# driver.get("https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166")
# cpj_file = open("差评.txt", "w", encoding='utf8')
#
# def get_py_content(file):
# pj_elements = driver.find_elements(By.CLASS_NAME, value="body-content")
# for element in pj_elements:
# file.write(element.text + '\n')
#
# get_py_content(cpj_file)
# next_elements =driver.find_elements(by= By.XPATH,value='//*[@class="next rv-maidian "]')
# print(next_elements)
# while next_elements != []:
# next_element = next_elements[0]
# time.sleep(2)
# next_element.click()
# get_py_content(cpj_file)
# next_elements =driver.find_elements(by= By.XPATH,value='//*[@class="next rv-maidian "]')
由于爬取过程需要反复翻页,这段代码我们写一个函数用来将每一页的图片写入文件,然后通过循环结构实现翻页。
执行结果:
案例七:爬取苏宁口罩信息
代码:
python
'''项目实现: 苏宁易购网站获取医用口罩信息(包含价格、名称、评价数、店铺名称)'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# chrome_options.add_argument('--headless') #无浏览器界面模式
driver = webdriver.Edge(options = edge_options)
driver.get("http://www.suning.com")
element = driver.find_element(by=By.ID,value="searchKeywords")
element.send_keys("医用口罩" + Keys.RETURN)
time.sleep(10)
#执行JavaScript代码,将页面滚动到底部。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(10)
price_elements = driver.find_elements(by=By.CLASS_NAME,value='def-price')
title_elements = driver.find_elements(by=By.CLASS_NAME,value='title-selling-point')
evaluate_elements = driver.find_elements(by=By.CLASS_NAME,value='info-evaluate')
store_elements = driver.find_elements(by=By.CLASS_NAME,value='store-stock')
a = time.strftime('%Y-%m-%d')
f = open(a+'医用口罩.txt','w',encoding='utf-8')
for i in range(len(price_elements)):
f.write(price_elements[i].text + '\t')
f.write(title_elements[i].text + '\t')
f.write(evaluate_elements[i].text + '\t')
f.write(store_elements[i].text + '\n')
f.close()
执行结果:
实现案例用到的操作:
滑动滚轮driver.execute_script(执行JavaScript代码)、.click()模拟单机元素、.text()获取文本、.content()获取图片、send_Keys方法传入图片、send_Keys(Keys.RETURN)模拟回车、设置无头模式edge_options.add_argument('--headless')等
作业:
定义一个函数,接受两个参数,一个是人名,一个是图片数量,调用时即可完成新建以人名命名的文件夹,并爬取指定数量的图片放置其中 。