[python] 1、python鼠标点击、移动事件应用——写一个自动下载百度音乐的程序
1、问题描述:
最近百度总爱做一些破坏用户信任度的事——文库金币变券、网盘限速,吓得我赶紧想办法把存在百度云音乐中的歌曲下载到本地。
http://yinyueyun.baidu.com/

可问题是云音乐中并没有批量下载,而上面我总共存了700多首音乐!
因此:有必要写一个脚本自动下载这些音乐了!!!
2、解决问题
自动下载歌曲有两种方法:
- JS法
- 模拟鼠标点击法
由于考虑到JS法需要分析网页结构、寻找下载链接,工作量有点大,于是选择用模拟鼠标点击法!
在linux上我首先想到用python来做这件事。
用python使用鼠标点击事件比较简单,在github上有人开源了一个PyMouse模块,简单几行代码就能模拟鼠标!
https://github.com/pepijndevos/PyMouse/wiki/Documentation
该PyMouse有个简单的DEMO:
# import the module
from pymouse import PyMouse # instantiate an mouse object
m = PyMouse() # move the mouse to int x and int y (these are absolute positions)
m.move(200, 200) # click works about the same, except for int button possible values are 1: left, 2: right, 3: middle
m.click(500, 300, 1) # get the screen size
m.screen_size()
# (1024, 768) # get the mouse position
m.position()
# (500, 300)
因此,编写一个可以自动下载一页歌曲(20首)的脚本如下:
该代码所做的主要任务是点击下载,然后再点击确定:

注:如果只是两次点击如何解释21、22行代码?
因为点击下载之后,会有个选择下载音质的弹框,音质有高、中、低三种,但是有些歌曲只有一种或两种音质可以选择。这导致弹框的位置有所不同(确定按钮的位置也随之不同),解决此问题一个“笨”方法是将可能区域都点一遍!
# import the module
from pymouse import PyMouse
from time import sleep # instantiate an mouse object
m = PyMouse() pos_x = 1120
pos_y = 302
pos_y_add = 38
one_page_lines = 20 select_button_x = 984
select_button_y = 550 sleep(2) for i in range(0,one_page_lines):
m.click(pos_x,pos_y+i*38,1)
sleep(2)
for j in range(0,30):
m.click(select_button_x,select_button_y+j*5,1)
sleep(3)
print(i)
3、遗留问题
上面脚本能在网速良好情况下将一页的歌曲下载到本地,接下来自然想到的是模拟鼠标拖动(拖动slide bar,切换至下一页20首歌曲)。
于是我尝试写一个模拟鼠标拖动的脚本做个测试:
# import the module
from pymouse import PyMouse
from time import sleep # instantiate an mouse object
m = PyMouse() pos_x = 1120
pos_y = 302
pos_y_add = 38
one_page_lines = 20 select_button_x = 984
select_button_y = 550 slide_x = 1915
slide_y = 312
slide_dis = 1 sleep(5)
for page in range(1,40):
m.press(slide_x,slide_y)
slide_y = slide_y + slide_dis
m.move(slide_x,slide_y)
m.release(slide_x,slide_y)
sleep(10)
理论上每次滑动slide bar歌曲list移动的距离是相同的,而实测发现存在没有规律的误差!
由于第二节中下载歌曲的脚本鼠标点击的start位置是固定的,因此一旦不能利用slide bar移动使歌曲列表恰好切到下一页,就会导致下载脚本点击事件点错地方。
后续优化方向可以利用图像识别对slide bar移动进行校准~
:: 如果您觉得不错,请推荐给更多人,帮助他们更快地解决实际问题中的坑~
@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975
[python] 1、python鼠标点击、移动事件应用——写一个自动下载百度音乐的程序的更多相关文章
- 【Python】控制鼠标点击
from pymouse import PyMouse m = PyMouse() a = m.position() #获取当前坐标的位置 print(a) m.move(50, 500) #鼠标移动 ...
- python 3 - 写一个自动生成密码文件的程序
1.你输入几,文件里面就给你产生多少条密码 2.密码必须包括,大写字母.小写字母.数字.特殊字符 3.密码不能重复 4.密码都是随机产生的 5.密码长度6-11 import string,rando ...
- 使用JS或jQuery模拟鼠标点击a标签事件代码
原文 使用JS或jQuery模拟鼠标点击a标签事件代码 这篇文章主要介绍了使用JS或jQuery模拟鼠标点击a标签事件代码,需要的朋友可以参考下 <a id="alink" ...
- 鼠标点击input时,placeholder中的提示信息消失
html代码: <input type="text" placeholder="多个关键词空格隔开"> 鼠标点击input时,placeholder ...
- (转载)Unity UGUI鼠标点击UI不受影响方法IsPointerOverGameObject
这几天在做捕鱼达人游戏时发现,当鼠标点击UI时,炮台的子弹也会发射子弹,这样会影响用户体验. 然后网上百度了一波,发现在UGUI系统上,EventSystem提供了一些方法.那就是EventSyste ...
- Teamviewer 远程控制时 无法正常操作鼠标点击
其中一种可能: 本机开启了360的64位Intel-VT核晶防护后,用Teamviewer远程到本机,远程电脑无法操作本机的鼠标点击(左右键都不行),查看日志显示拦截了模拟按键.关闭核晶防护就可以正常 ...
- 当鼠标点击input框时,想让全选input框的所有内容只需要加“onfocus="this.select();”就可以了
当鼠标点击input框时,想让全选input框的所有内容只需要加“onfocus="this.select();”就可以了
- 鼠标点击input框后里面的内容就消失
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python使用selenium,webdriver自动下载百度网盘内容
想实现一个自动下载微信公众号分享百度网盘图片链接的爬虫,使用selenium和火狐的webdriver进行完成 1.首先根据自己的浏览器下载相应的webdriver驱动器,python中导入selen ...
随机推荐
- 关于ajax post请求,参数过大产生的问题解决 Java
之前做了一个图片上传的功能,前端是把图片编码成BASE64,但是图片一大了,后台用request.getParameter("前端参数");来接收参数打印不出来,没有值,这就很尴尬 ...
- MongDB系列(一):使用node.js连接数据库
1.首先启动mongodb数据库服务器 2.创建app.js,代码如下: /** * Created by byzy on 2016/8/18. * node.js 连接 mongodb实例 */ / ...
- JS的内置对象以及JQuery中的部分内容
[js中的数组] 1 数组的概念:可以再内存中连续存储的多个有序元素的结构 元素的顺序:称为下标,通过下标查找对应元素. ...
- PROFINET有什么用
“工业4.0”是当前制造业最热门的话题,所以不谈这个话题都不好意思跟同行们打招呼.“工业4.0”里面的一个重要内容是智慧工厂,工厂流水线设备之间通信,无论是传统的有线连接还是先进的无线连接与分布式控制 ...
- CSS空白符处理!
在CSS中有一个非常重要但对于初学者又非常容易忽略的属性: white-space:nowrap; //文本不换行属性 这里附带说一下W3Cschool中对white-space的解释: white- ...
- List<Object>对象集合一些扩展方法
// 商品集合信息 List<Product> list = new List<Product>() { ...
- javascript原生方法实现extend
var extend = (function () { for(var p in {toString:null}){ //检查当前浏览器是否支持forin循环去遍历出一个不可枚举的属性,比如toStr ...
- 不同浏览器的margin值与padding值
IE-7: 有默认外边距margin样式的元素: dd,menu, ol, ul, blockquote, body, dd, dl, form, h1-6, ul 有默认内边距padding样式的元 ...
- iOS APP开发设置启动图片 Launch Image
一.添加启动图片 点击Assets.xcassets进入图片管理,右击,弹出"New Launch Image"或点下面的+号创建Launch Image: 这里首先说明一下尺寸: ...
- Bootstrap Flat UI的select下拉框显示不出来 问题解决
Bootstrap Flat UI的select下拉框显示不出来?看这里,恰巧今天我也遇到了这个问题: 点击Messages后并没有出现下拉列表,然而官网的index.html却能显示出来. 经过一番 ...