zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    pandas Dataframe filter
    process xlsx with pandas
    data manipulate in excel with easyExcel class
    modify registry in user environment
    add number line in vim
    java import webservice
    ctypes MessageBoxA
    music 163 lyrics
    【python实例】自动贩卖机
    【python基础】sys模块(库)方法汇总
  • 原文地址:https://www.cnblogs.com/wilson403/p/11141707.html
Copyright © 2011-2022 走看看