网络爬虫(第三部)

今天继续网络爬虫的学习,在第二部中我们已经实现了简单的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')等

作业:

定义一个函数,接受两个参数,一个是人名,一个是图片数量,调用时即可完成新建以人名命名的文件夹,并爬取指定数量的图片放置其中 。

相关推荐
Data_agent2 小时前
实战:用Splash搞定JavaScript密集型网页渲染
开发语言·javascript·ecmascript
Shaneyxs2 小时前
从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(13)
前端
半山烟雨半山青2 小时前
微信内容emoji表情包编辑器 + vue3 + ts + WrchatEmogi Editor
前端·javascript·vue.js
码途潇潇2 小时前
Vue 事件机制全面解析:原生事件、自定义事件与 DOM 冒泡完全讲透
前端·javascript
zmirror2 小时前
Monorepo 在 Docker 中的构建方案方案
前端
用户47949283569152 小时前
node_modules 太胖?用 Node.js 原生功能给依赖做一次大扫除
前端·后端·node.js
_Kayo_2 小时前
TypeScript 学习笔记2
前端·javascript·typescript
海纳百川本尊760642 小时前
Flutter框架核心原理深度解析
前端
Shaneyxs2 小时前
从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(12)
前端