[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移動進行校准~

 

:: 如果您覺得不錯,請推薦給更多人,幫助他們更快地解決實際問題中的坑~


@beautifulzzzz
智能硬件、物聯網,熱愛技術,關注產品
博客:http://blog.beautifulzzzz.com
園友交流群:414948975


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM