Selenium 全自动化下载QQ付费音乐-说好不哭MV

本节所讲内容:

1.Selenium+Python环境搭建及配置

2.自动化获取歌曲url地址

3.多窗口下载歌曲

注意:如果想直接运转代码请转到文章的末尾

本节知识点:selenium+智能等待+显式等待+鼠标悬停事件+多窗口切换+数据下载

整体项目思路:

1.  获取QQ音乐官网的歌曲地址

2.  拿到歌曲地址之后利用免费的接口地址(毕竟没有付费),进行获取资源

3、下载免费资源提供的数据

1、Selenium+Python环境搭建及配置

1.  selenium 介绍

selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选selenium:

1.2  selenium+Python环境配置

前提条件:已安装好Python开发环境(python3.7.2)

安装步骤:

1.安装selenium

Win:pip install selenium

2.  安装webdriver

各大浏览器webdriver地址可参见:https://docs.seleniumhq.org/download/
Firefoxhttps://github.com/mozilla/geckodriver/releases/
Chromehttps://sites.google.com/a/chromium.org/chromedriver/ 或者
http://chromedriver.storage.googleapis.com/index.html
IEhttp://selenium-release.storage.googleapis.com/index.html
:webdriver需要和对应的浏览器版本以及selenium版本对应

Webdriver版本

支持的Chrome版本

v2.41

v67-69

v2.40

v66-68

v2.39

v66-68

v2.38

v65-67

v2.37

v64-66

v2.36

v63-65

v2.35

v62-64

v2.34

v61-63

3.  webdriver安装路径

Win:复制webdriver到Python安装目录下或者在path中配置下路径(方便python能快速寻找)

 

2.  自动化获取歌曲url地址

         登录网址为:https://y.qq.com/ 进行搜索‘说好不哭’,获取第一首歌曲的链接地址

         

 

需要解决的问题:

  1.   利用Chrome操作的时候 会弹出下载界面
  2.   在搜索的时候,不使用鼠标悬停会报出错误,说找不到元素

具体解决方案如下:

 

找到对应元素,并关闭

#找到下载弹窗,关闭
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CLASS_NAME,'popup__hd')))
driver.find_element_by_class_name('popup__icon_close').click()

#鼠标动作链
#move_to_element:鼠标悬停
#perform:执行所有的ActionChains中的存储行为

from selenium.webdriver.common.action_chains import ActionChains
#鼠标悬停事件
above = driver.find_element_by_class_name('search_input__btn')
ActionChains(driver).move_to_element(above).perform()

完整代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
from selenium.webdriver.common.action_chains import ActionChains
qq_url = 'https://y.qq.com/'
driver = webdriver.Chrome()
driver.get(qq_url)
driver.implicitly_wait(10)
time.sleep(10)
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CLASS_NAME,'popup__hd')))
driver.find_element_by_class_name('popup__icon_close').click()
time.sleep(2)
above = driver.find_element_by_class_name('search_input__btn')
ActionChains(driver).move_to_element(above).perform()
driver.find_element_by_class_name('search_input__input').send_keys('说好不哭')
driver.find_element_by_xpath('//button[@class="search_input__btn"]').click()
song_url = driver.find_element_by_class_name('songlist__songname_txt').find_element_by_tag_name('a').get_attribute('href')
print('你要下载的歌曲url地址为:',song_url)
运行结果如下:

3.多窗口下载歌曲

免费下载数据的地址: http://www.douqq.com/qqmusic/,主要通过这个地址,该歌曲资源

主要用到代码如下:
# 新开一个窗口,通过执行js来新开一个窗口
js = 'window.open("http://www.douqq.com/qqmusic/");'
driver.execute_script(js)

# 输出当前窗口句柄(百度)
QQ_handle = driver.current_window_handle

# 获取当前窗口句柄集合(列表类型)
handles = driver.window_handles
print('该浏览器所有的句柄为:',handles)  # 输出句柄集合

# 获取新窗口句柄
API_handle = None
for handle in handles:
    if handle != QQ_handle:
        API_handle = handle

# 输出当前窗口句柄(搜狗)
print('进行切换新窗口:', handle)

driver.switch_to.window(API_handle)

实现效果如下

完整代码如下:

#!/usr/bin/python

# -*- coding: utf-8 -*-

# @Time    : 2019/9/26 10:22

# @Author  : Xuegod Teacher For

# @File    : QQ音乐自动化测试.py

# @Software: PyCharm

from urllib.request import urlretrieve
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#鼠标动作链
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()

def get_song_url():

    qq_url = 'https://y.qq.com/'
    driver.get(qq_url)
    driver.implicitly_wait(10)
    time.sleep(2)
    #找到下载弹窗,关闭    WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CLASS_NAME,'popup__hd')))

    driver.find_element_by_class_name('popup__icon_close').click()

    time.sleep(2)

    #鼠标悬停事件
    above = driver.find_element_by_class_name('search_input__btn')
    ActionChains(driver).move_to_element(above).perform()

    driver.find_element_by_class_name('search_input__input').send_keys('说好不哭')
    driver.find_element_by_xpath('//button[@class="search_input__btn"]').click()
    song_url = driver.find_element_by_class_name('songlist__songname_txt').find_element_by_tag_name('a').get_attribute('href')

    print('你要下载的歌曲url地址为:',song_url)
    return song_url

def down_song_mv(song_url):

    # 新开一个窗口,通过执行js来新开一个窗口
    js = 'window.open("http://www.douqq.com/qqmusic/");'

    driver.execute_script(js)

    # 输出当前窗口句柄(百度)
    QQ_handle = driver.current_window_handle

    # 获取当前窗口句柄集合(列表类型)
    handles = driver.window_handles

    print('该浏览器所有的句柄为:',handles)  # 输出句柄集合

    # 获取新窗口句柄
    API_handle = None

    for handle in handles:
        if handle != QQ_handle:
            API_handle = handle

    # 输出当前窗口句柄(搜狗)
    print('进行切换新窗口:', handle)

    driver.switch_to.window(API_handle)
    print('切换成功,可发送请求地址')
    driver.find_element_by_id('mid').send_keys(song_url)
    driver.find_element_by_id('sub').click()

    time.sleep(2)

    # WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.ID,'mv')))

    print('获取到mv地址')
    mv_url = driver.find_element_by_id('mv').text

    import requests
    if mv_url:

        #文件下载
        print('正在下载……这个过程有点慢')
        urlretrieve(mv_url,'说好.mp4')

    else:
        print('没有获取视频地址,需要重新运行')
    print('下载完毕,退出浏览器')
    driver.quit()

if __name__ == '__main__':
    song_url = get_song_url()
    down_song_mv(song_url)

运行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值