网络爬虫学习:借助DeepSeek完善爬虫软件,实现模拟鼠标右键点击,将链接另存为本地文件

一、前言

最近几个月里,我一直在学习网络爬虫方面的知识,每有收获都会将所得整理成文发布,不知不觉已经发了7篇日志了:

网络爬虫学习:从百度搜索结果抓取标题、链接、内容,并保存到xlsx文件中

网络爬虫学习:从新浪新闻搜索抓取所有新闻结果的标题、链接、内容、来源、时间

网络爬虫学习:POST方式从腾*新闻搜索结果获取标题、链接、内容、来源、时间

网络爬虫学习:多线程爬取,并将结果更新到主线程UI上

网络爬虫学习:应用selenium从搜*狐搜索爬取新闻结果的数据

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

这两天,我又解决了模拟鼠标右键点击的问题,特记录以备忘。

二、问题描述

在完成第一个爬虫软件之后,我又开始制作第二个爬虫软件,这个软件是为我自己准备的一个专用工具,目的是从特定的web应用中导出查询到的数据。在这个应用查询数据后,要点击页面中的导出按钮才能将数据导出。点击按钮后在页面上会展示一个超链接,需要点击这个超链接后才能将数据文件保存到本地电脑中。

这个链接既可以用鼠标左键点击弹出浏览器的下载框进行下载,也可以用鼠标右键点击后选择“将链接另存为”菜单项,弹出Windows系统的“另存为”窗口,进行下载。

由于我还不会模拟鼠标右键点击,于是决定选择往这个方向研究。

注意:我开发的爬虫软件调用的Edge浏览器,鼠标右键点击弹出的菜单中,显示的是“将链接另存为”,在其它的浏览器(如360浏览器),显示的菜单名有所不同。

三、借助DeepSeek获取解决办法

我之前已经尝试过借助DeepSeek来解决问题了,效果还不错,这次也一样,将问题抛给DeepSeek,让它帮我想办法。这次我同样是问了3次,就解决了问题。

第1问:“我正在尝试用selenium做一个登录网页并进行自动操作的小软件,软件需要实现模拟鼠标右键点击,并选中菜单中的“将链接另存为”菜单项,请问我该怎么实现此功能。”

稍候数秒,DeepSeek给出了答案,建议我使用SeleniumActionChains模拟右键点击,然后使用PyAutoGUIAutoIt等工具选择“将链接另存为”菜单项。DeepSeek给出的示例用的PyAutoGUI库,这个库刚好我的电脑里也装了,只是我对这个库不了解一直没用过,这次我便用照着示例修改了我的软件,确实实现了模拟右键点击功能。

右键点击是实现了,菜单也出现了,但是示例中出现的 pyautogui.press('down')  要根据需要按多次的操作,这种死板的操作我不喜欢,因为右键菜单可能会因为安装了一些插件后发生变化,如果在不同的电脑上,因为安装的插件不同,“将链接另存为”菜单项的位置也不同,那该怎么办呢?

于是我提出第2问:“此方法经过测试有用,不过我有一个新的问题。就是这个方法只适用于菜单项目固定的情况,如果因为安装了新的插件导致“将链接另存为”菜单项位置发生变化,又该怎么办?

DeepSeek提供了3个方案,其中有两个方案都使用到了PyAutoGUI库,我选择了方案1。

使用方案1,需要手工将浏览器右键菜单项截图,然后从中剪裁出“将链接另存为”菜单项并保存为png文件(文件名save_link_as.png)。

实现点击“将链接另存为”菜单项后就弹出Windows系统的“另存为”窗口了。但接下来怎么做呢,可能DeepSeek不清楚点击“将链接另存为”菜单项,会出现怎样的情形,因此它没有猜到我接着要干啥。

无奈,我只得提出第3问:“感谢你的答案,我已经能够实现模拟右键并点击“将链接另存为”菜单项了,不过接下来我又遇到了一个新问题。点击“将链接另存为”菜单项后,会弹出“另存为”窗口,需要用户在这个窗口中选择文件保存的路径,并命名文件名称。这些操作我都希望通过软件自动进行。我想在软件中设置好文件路径和文件名,当弹出“另存为”窗口后,通过软件将文件路径和文件名填到窗口对应位置,然后点击“保存”按钮,完成文件的保存操作。

DeepSeek又给了3个方法,方法1又用到了PyAutoGUI库,当然选它啦,。

四、功能实现

借助DeepSeek的答案,我实现了模拟右键点击,将链接指向的文件保存到了本地,这里以右键点击百度首页中的logo图标,将其指向的htm文件保存到本地为示例,说明功能的实现(完整代码见本文第五部分):

1.设置文件将要保存的路径及文件名。

htm文件将要保存在当前工作目录下的results子目录中,事先将路径和文件名设置好。

# 获取当前工作路径
work_path = os.getcwd()
print(work_path)
# 检查当前工作路径下是否有results子目录,如没有就创建
subdirectory_name = os.path.join(work_path, "results")
if not os.path.exists(subdirectory_name):os.makedirs(subdirectory_name)
# 生成文件路径
file_path = os.path.join(subdirectory_name, "baidu_logo.htm")
print(file_path)

2.配置浏览器

我选择的系统自带的Edge浏览器,同时提前下载了对应版本的驱动文件并保存在了工作目录下的drivers子目录中。

# 配置 Selenium 浏览器驱动
path_to_executable = os.path.abspath("drivers/msedgedriver.exe")  # 指定驱动路径(驱动已提前下载到当前工作路径子目录drivers下)
service = Service(executable_path=path_to_executable)
driver = webdriver.Edge(service=service)
# driver.maximize_window()  # 全屏
driver.set_window_size(1200, 800)  # 指定分辨率

关于如何下载驱动文件msedgedriver.exe,详见我的另外一篇日志。

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开

3.打开百度首页,并选中logo图片

# 在浏览器中打开百度首页
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
time.sleep(3)# 选中百度首页中的logo图片
element = driver.find_element(By.XPATH, "//*[@id='lg']/img")

4.通过selenium库的ActionChains类模拟鼠标右键点击

注意:由于软件运行速度很快,而浏览网页响应较慢,因此在代码的多个地方插入了time.sleep方法,进行延迟,以免页面还没有显示,就执行了相关的点击之类的代码。延迟的时间需要根据网络情况进行调整。

# 创建ActionChains对象
action = ActionChains(driver)
# 模拟鼠标右键点击
action.context_click(element).perform()
# 等待菜单弹出
time.sleep(1)

5.将百度logo图片链接的htm文件保存到本地

# 指定“将链接另存为”菜单项的图片文件
template_image = 'save_link_as.png'  # 此图片文件需要手工截取Edge浏览器右键菜单中的“将链接另存为”菜单项,保存为图片文件
# 使用图像识别查找菜单项,查找图片在屏幕上的位置
location = pyautogui.locateCenterOnScreen(template_image, confidence=0.8)  # 需要OpenCV支持
if location:print(f"找到菜单项,位置为: {location}")time.sleep(3)# 点击菜单项pyautogui.click(location)# 等待“另存为”窗口弹出time.sleep(1)# 模拟按键 Shift + Home(选中所有文本)pyautogui.hotkey('shift', 'home')# 模拟按键 Delete(删除选中的文本)pyautogui.press('delete')# 定位“文件名”输入框并填写文件路径和文件名pyautogui.write(file_path)time.sleep(3)# 按下回车键确认保存pyautogui.press('enter')time.sleep(1)# 点击“保存”按钮,使用图像识别定位按钮位置save_button_location = pyautogui.locateCenterOnScreen('save_button.png')  # 此图片文件需要手工截取“另存为”窗口中的“保存”按钮,保存为图片文件if save_button_location:pyautogui.click(save_button_location)
else:print("未找到菜单项")

这部分的代码中有两个png文件,都是需要提前准备的。

save_link_as.png:需要手工将浏览器右键菜单项截图,然后从中剪裁出“将链接另存为”菜单项并保存为png文件。

save_button.png:需要手工将“另存为”窗口截图,然后从中剪裁出“保存”按钮并保存为png文件。

最终的实现效果如下:

1.打开百度首页模拟鼠标右键点击logo图片。

2.点击“将链接另存为”菜单项,弹出“另存为”窗口,将事先设置好的路径和文件名填入窗口的文件名文本框中。

3.htm已保存到本地

五、代码展示

最后放上示例代码供参考,可以直接运行。

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.action_chains import ActionChains
import pyautogui
import os# 获取当前工作路径
work_path = os.getcwd()
print(work_path)
# 检查当前工作路径下是否有results子目录,如没有就创建
subdirectory_name = os.path.join(work_path, "results")
if not os.path.exists(subdirectory_name):os.makedirs(subdirectory_name)
# 生成文件路径
file_path = os.path.join(subdirectory_name, "baidu_logo.htm")
print(file_path)# 配置 Selenium 浏览器驱动
path_to_executable = os.path.abspath("drivers/msedgedriver.exe")  # 指定驱动路径(驱动已提前下载到当前工作路径子目录drivers下,相关方法见我的另外一篇日志)
service = Service(executable_path=path_to_executable)
driver = webdriver.Edge(service=service)
# driver.maximize_window()  # 全屏
driver.set_window_size(1200, 800)  # 指定分辨率# 在浏览器中打开百度首页
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")
time.sleep(3)# 选中百度首页中的logo图片
element = driver.find_element(By.XPATH, "//*[@id='lg']/img")
# 创建ActionChains对象
action = ActionChains(driver)
# 模拟鼠标右键点击
action.context_click(element).perform()
# 等待菜单弹出
time.sleep(1)# 使用PyAutoGUI模拟右键点击,弹出菜单后,选择“将链接另存为”菜单项
# 注意:PyAutoGUI的坐标和操作依赖于屏幕分辨率
# 指定“将链接另存为”菜单项的图片文件
template_image = 'save_link_as.png'  # 此图片文件需要手工截取Edge浏览器右键菜单中的“将链接另存为”菜单项,保存为图片文件
# 使用图像识别查找菜单项,查找图片在屏幕上的位置
location = pyautogui.locateCenterOnScreen(template_image, confidence=0.8)
if location:print(f"找到菜单项,位置为: {location}")time.sleep(3)# 点击菜单项pyautogui.click(location)# 等待“另存为”窗口弹出time.sleep(1)# 模拟按键 Shift + Home(选中所有文本)pyautogui.hotkey('shift', 'home')# 模拟按键 Delete(删除选中的文本)pyautogui.press('delete')# 定位“文件名”输入框并填写文件路径和文件名pyautogui.write(file_path)time.sleep(3)# 按下回车键确认保存pyautogui.press('enter')time.sleep(1)# 点击“保存”按钮,使用图像识别定位按钮位置save_button_location = pyautogui.locateCenterOnScreen('save_button.png')  # 此图片文件需要手工截取“另存为”窗口中的“保存”按钮,保存为图片文件if save_button_location:pyautogui.click(save_button_location)
else:print("未找到菜单项")time.sleep(2)
driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章:PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中,传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR(被动红外)传感器。PIR 传感器能够检测人体发出的红外线,常用于安防系统、自动…

CV -- YOLOv8 图像分割(GPU环境)

目录 参考视频: 标注 JSON转为TXT 训练 验证 参考视频: 使用 Yolov8 自定义数据集进行图像分割_哔哩哔哩_bilibili 标注 数据集: 我使用的是一些苹果数据集,可以在我的csdn资源中下载: https://download.csdn.net/do…

深入理解 lua_KFunction 和 lua_CFunction

在 Lua C API 中,lua_KFunction 和 lua_CFunction 是两个核心概念,尤其在处理协程和 C 函数扩展时扮演着至关重要的角色。lua_CFunction 作为一种 C 函数类型,允许开发者将 C 函数注册到 Lua 环境中,使得这些 C 函数可以在 Lua 脚本中被调用,进而实现 Lua 的功能扩展。而 …

基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频

本系统包含用户、管理员两个角色。 用户角色:注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色:登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)

🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 ​ Linux网络编程笔记: https://blog.cs…

Vue3 打造 Windows 桌面个性高效组件工具

软件介绍 Widgets 这款基于 Vue3 构建的开源 Windows 桌面小部件工具超实用。 其多样化组件库涵盖超 20 种,从倒计时、打工进度等实用工具,到抖音热榜等实时资讯组件应有尽有,各组件独立运行,满足多场景需求。 高度自定义布局支持…

Tailwind CSS 和 UnoCSS简单比较

一、Tailwind CSS 和 UnoCSS简介 Tailwind CSS 和 UnoCSS 都是流行的原子化 CSS 框架,它们有很多相似之处,但也存在一些明显的区别,以下从多个方面对它们进行比较: 1. 基本概念和原理 Tailwind CSS 是最早提出并推动原子化 CSS…

什么是语料清洗、预训练、指令微调、强化学习、内容安全; 什么是megatron,deepspeed,vllm推理加速框架

什么是语料清洗、预训练、指令微调、强化学习、内容安全 目录 什么是语料清洗、预训练、指令微调、强化学习、内容安全语料清洗预训练指令微调强化学习内容安全什么是megatron,deepspeed,vllm推理加速框架语料清洗 语料清洗是对原始文本数据进行处理的过程,旨在去除数据中的…

C++(23):lambda可以省略()

C越来越多的使用了lambda&#xff0c;C23也进一步的放宽了对lambda的限制&#xff0c;这一次&#xff0c;如果lambda没有参数列表&#xff0c;那么可以直接省略掉()&#xff1a; #include <iostream> using namespace std;void func() {auto f []{cout<<"in…

自制操作系统分享第四天

今天要做什么&#xff1f; &#xff08;1&#xff09;分享 我们上面已经说过INT 0x13这种指令&#xff08;调用BIOS的INT指令&#xff09;&#xff0c;我们知道这是调用BIOS的0x13函数&#xff0c;但还不明白它到底是干什么用的&#xff1a; AH 0x02;# 读盘 AH 0x03;# 写…

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…

Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位

需求如下&#xff1a; 项目 测试demo 有多个渠道&#xff0c;部分渠道包含支付功能&#xff0c;在主测试代码外&#xff0c;需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule&#xff0c;因此…

FRRouting配置与OSPF介绍,配置,命令,bfd算法:

文章目录 1、frrouting的配置&#xff1a;2、ospf2.1、检测和维护邻居关系2.2、ospfDR和BDR2.3、odpf邻居表2.4、ospf常用命令2.5、bfd配置 1、frrouting的配置&#xff1a; sudo service zebra start sudo service ospfd start telnet localhost 2604 en configure termina…

Perplexity 开源DeepSeek-R1 模型新版本 R1-1776

引言 在人工智能领域&#xff0c;模型的更新迭代如同科技界的时尚潮流&#xff0c;不断推陈出新。今天&#xff0c;我们要介绍的是Perplexity AI开源的新版推理模型——DeepSeek-R1 1776。这个版本不仅继承了前代的强大性能&#xff0c;还在公正性和准确性上进行了显著提升。那…

关系中出现这10个信号,离分手就不远了(爱情友情都适用)

亲密关系的隐形裂痕 在一个阳光明媚却略显萧瑟的午后&#xff0c;咖啡杯里的咖啡已经凉透。小李盯着手机屏幕&#xff0c;那些曾经热烈的对话记录现在看起来如此陌生&#xff0c;仿佛隔着一层薄薄的雾。她终于意识到&#xff0c;这段关系已经悄然走向尽头。 亲密关系是一场精心…

马斯克Grok3使用入口和订阅教程(白嫖150刀API额度)

文章目录 马斯克Grok3使用入口和订阅教程(白嫖150刀API额度)前言介绍如何订阅X上Premium服务国内订阅X的Premium教程 白嫖教程小结 马斯克Grok3使用入口和订阅教程(白嫖150刀API额度) 前言介绍 重点&#xff1a;Grok 3仅对X上的Premium用户开放。你需要订阅X的Premium服务才能…

相机开发调中广角和焦距有什么不一样

在相机中,调整广角和调整焦距是两个不同的概念,它们的作用和实现方式也不同。以下是两者的详细对比和解释: 1. 调整广角 定义 广角是指相机的视野范围(Field of View, FOV)。调整广角实际上是调整相机的视野范围。更广的视野意味着可以捕捉到更多的场景内容(更宽的画面)…

让大模型帮我设计crnn网络及可运行demo,gpt4o豆包qwendeepseek-r1

prompt 使用 crnn 提取图像特征&#xff0c;给出图像好坏的二分类结果&#xff0c;写清楚代码备注&#xff0c;注释清楚向量维度大小&#xff0c;并给出一个可运行的 demo1、GPT-4o 以下是一个使用 CRNN&#xff08;Convolutional Recurrent Neural Network&#xff09;提取图…

DeepBI助力跨境电商打破流量垄断:AI驱动的亚马逊广告投放新打法

#亚马逊广告优化# 亲爱的亚马逊跨境电商卖家们&#xff0c;是否曾因亚马逊的广告打法不清晰&#xff0c;或是纠结于亚马逊广告费用过高&#xff0c;或是为亚马逊电商广告怎么投放合适的问题而苦恼&#xff1f;在竞争激烈的亚马逊市场中&#xff0c;广告投放效果平平&#xff0…

前端基础入门:HTML、CSS 和 JavaScript

在现代网页开发中,前端技术扮演着至关重要的角色。无论是个人网站、企业官网,还是复杂的 Web 应用程序,前端开发的基础技术 HTML、CSS 和 JavaScript 都是每个开发者必须掌握的核心技能。本文将详细介绍这三者的基本概念及其应用 一、HTML——网页的骨架 HTML(HyperText …