本节所讲内容:
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/
Firefox:https://github.com/mozilla/geckodriver/releases/
Chrome:https://sites.google.com/a/chromium.org/chromedriver/ 或者http://chromedriver.storage.googleapis.com/index.html
IE:http://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/ 进行搜索‘说好不哭’,获取第一首歌曲的链接地址
需要解决的问题:
- 利用Chrome操作的时候 会弹出下载界面
- 在搜索的时候,不使用鼠标悬停会报出错误,说找不到元素
具体解决方案如下:
找到对应元素,并关闭
#找到下载弹窗,关闭
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)
运行结果如下: