• [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:

    复制代码
     1 # import the module
     2 from pymouse import PyMouse
     3 
     4 # instantiate an mouse object
     5 m = PyMouse()
     6 
     7 # move the mouse to int x and int y (these are absolute positions)
     8 m.move(200, 200)
     9 
    10 # click works about the same, except for int button possible values are 1: left, 2: right, 3: middle
    11 m.click(500, 300, 1)
    12 
    13 # get the screen size
    14 m.screen_size()
    15 # (1024, 768)
    16 
    17 # get the mouse position
    18 m.position()
    19 # (500, 300)
    复制代码

    因此,编写一个可以自动下载一页歌曲(20首)的脚本如下:

    该代码所做的主要任务是点击下载,然后再点击确定:

    注:如果只是两次点击如何解释21、22行代码?

    因为点击下载之后,会有个选择下载音质的弹框,音质有高、中、低三种,但是有些歌曲只有一种或两种音质可以选择。这导致弹框的位置有所不同(确定按钮的位置也随之不同),解决此问题一个“笨”方法是将可能区域都点一遍!

    复制代码
     1 # import the module
     2 from pymouse import PyMouse
     3 from time import sleep
     4 
     5 # instantiate an mouse object
     6 m = PyMouse()
     7 
     8 pos_x = 1120
     9 pos_y = 302
    10 pos_y_add = 38
    11 one_page_lines = 20
    12 
    13 select_button_x = 984
    14 select_button_y = 550
    15 
    16 sleep(2)
    17 
    18 for i in range(0,one_page_lines):
    19     m.click(pos_x,pos_y+i*38,1)
    20     sleep(2)
    21     for j in range(0,30):
    22         m.click(select_button_x,select_button_y+j*5,1)
    23     sleep(3)
    24     print(i)
    复制代码

    3、遗留问题

    上面脚本能在网速良好情况下将一页的歌曲下载到本地,接下来自然想到的是模拟鼠标拖动(拖动slide bar,切换至下一页20首歌曲)。

    于是我尝试写一个模拟鼠标拖动的脚本做个测试:

    复制代码
     1 # import the module
     2 from pymouse import PyMouse
     3 from time import sleep
     4 
     5 # instantiate an mouse object
     6 m = PyMouse()
     7 
     8 pos_x = 1120
     9 pos_y = 302
    10 pos_y_add = 38
    11 one_page_lines = 20
    12 
    13 select_button_x = 984
    14 select_button_y = 550
    15 
    16 slide_x = 1915
    17 slide_y = 312
    18 slide_dis = 1
    19 
    20 sleep(5)
    21 for page in range(1,40):
    22     m.press(slide_x,slide_y)
    23     slide_y = slide_y + slide_dis
    24     m.move(slide_x,slide_y)
    25     m.release(slide_x,slide_y)
    26     sleep(10)
    27 
    复制代码

    理论上每次滑动slide bar歌曲list移动的距离是相同的,而实测发现存在没有规律的误差!

    由于第二节中下载歌曲的脚本鼠标点击的start位置是固定的,因此一旦不能利用slide bar移动使歌曲列表恰好切到下一页,就会导致下载脚本点击事件点错地方。

    后续优化方向可以利用图像识别对slide bar移动进行校准~

    https://www.cnblogs.com/zjutlitao/p/6942729.html

  • 相关阅读:
    [那些你所不知道的鬼畜写法]数据结构小探
    索引
    数据类型
    存储引擎
    事务
    视图、触发器、存储过程、自定义函数
    约束
    数据库介绍
    线程基础、线程池
    操作系统基础
  • 原文地址:https://www.cnblogs.com/wilson403/p/11141707.html
Copyright © 2020-2023  润新知