基于Selenium实现网易云音乐的登录

您所在的位置:网站首页 网易云音乐设备登录不了 基于Selenium实现网易云音乐的登录

基于Selenium实现网易云音乐的登录

2024-07-05 11:57| 来源: 网络整理| 查看: 265

基于Selenium实现网易云音乐的登录 前言一、准备工作1.环境配置2.确定页面的操作步骤①进入官网②点击登录③选择登录方式进行登录 二、代码实现1.公共方法的封装2.登录操作 总结

前言

最近在学习Selenium,由于没有项目练手,就拿网易云做了一个简单的练手项目。

一、准备工作 1.环境配置

这里是我的环境, 编程语言:python 3.9 使用的库:selenium 4.1.3 浏览器:Chrome

2.确定页面的操作步骤

首先就要先确定,页面的操作步骤:

①进入官网

网易云音乐的官网链接是 https://music.163.com/,打开页面是这样的 在这里插入图片描述

②点击登录

见上图可知,登录按键有两个,这里我就叫上面的登录按键叫登录1,下面的叫登录2。我这里定位的是登录1,不懂是不是我电脑屏幕太小了,我打开浏览器的尺寸不够,打开网页之后登录1看不到,就没办法定位,于是我就加了全屏的操作,这样就能定位到登录1。如果用登录2的话,就要注意登录2是包在iframe里面的,如果要点击登录2就要切换frame,切换完才能做点击操作。 在这里插入图片描述

③选择登录方式进行登录

点击登录后,会出现一个弹窗,这个弹窗最开始是扫码登录,扫码登录Selenium应该是实现不了的,起码我这个菜鸡是没办法实现自动化,所以我们要点击 选择其他登录模式 ,这里有5种登录方式,分别是手机号、微信、QQ、微博、网易邮箱,选择登录方式之前注意要先勾选用户协议。 这里简单分析一下,这5种登录方式的难易程度,这里微信和微博登录,我直接pass掉了,一打开就是扫码登录,我是菜鸡我不会扫码,我要是能扫码就不会选择其他登录方式了;接下来我选择网易邮箱登录,不得不说,网易邮箱看起来真的很方便,但是我没账号(pass);接下来就是手机号登录,手机号登录有两种方法,一个是验证码登录(pass),另一个是账号密码登录,当我成功输入账号密码点击登录之后,蹦出来一个滑块验证!!!(我怀疑网易邮箱登录可能也会有这个验证)而且网易云的滑块验证,滑动距离是会变化的,每次都不一样,导致我这个菜鸡没办法跳过这个验证。 最后我只能选择QQ登录,当我选择QQ登录时,我发现qq登录真是诸多登录方式中的一股清流,QQ登录有三种方法:第一种,扫码(直接pass);第二种,账号密码;第三种,如果有登录的话,就可以直接点击头像进行登录。无论是账号密码登录还是点击头像登录,都没有其他多余的验证(简直是业界良心有木有)。 但是qq登录需要注意的是,点击QQ登录,是跳转到新的页面的,我们就需要做handles的切换,登录完之后,qq登录的页面会自动去掉,但是我们还是要手动切换回网易云的页面。还有一个就是qq登录要先切换iframe,才能做元素定位。

二、代码实现

因为我不只是要做登录操作,后面还要做签到、刷用户等级等功能,所以我就没有写线性代码,我将一些经常用的方法做了封装,比如打开网页、元素定位、元素操作等。

1.公共方法的封装

我创建一个类WebKeys,在初始化函数里面,先创建一个driver对象,设置这个driver对象的屏幕最大化,再设置隐式等待10s,代码如下:

class WebKeys: def __init__(self): options = webdriver.ChromeOptions() options.add_argument('start-maximized') self.driver = webdriver.Chrome(options=options) self.driver.implicitly_wait(10)

屏幕最大化,有两种方法,一种是通过ChromeOptions这个类,为chrome配置参数,另一种方法就是创建driver对象之后,使用maximize_window方法。这里建议使用第一种方法,maximize_window方法在selenium 2之后就有一个bug,有可能会无故报错,虽然我没碰见过。 接下来我将打开链接的也做了封装,这个没什么好说的,见代码:

def open(self, url): self.driver.get(url)

接下来就是元素定位了,为了方便我们运行的时候看到页面操作了什么元素,所以我先做了元素的框选,只要我定位了什么元素,这个元素就会被描上红线,见代码:

# 实现元素定位的框选 def locator_station(self, element): self.driver.execute_script( "arguments[0].setAttribute('style',arguments[1]);", element, 'border: 2px solid red' # 边框颜色 )

框选功能做了,元素定位就要跟上:

def locator(self, name, value): """ :param name: 元素定位方式 :param value: 元素定位路径 :return: """ el = self.driver.find_element(name, value) self.locator_station(el) return el

接着我又在locator方法的基础之下又封装了两个元素操作的方法,一个是点击click,一个是输入inputs,见代码:

# 点击 def click(self, name, value): self.locator(name, value).click() # 输入 def inputs(self, name, value, text): self.locator(name, value).send_keys(text)

前面不是提了一个iframe的切换,我就一起做了封装,见代码:

# 切换frame def change_frame(self, a): self.driver.switch_to.frame(a) # 切换回主框架 def change_defaultFrame(self): self.driver.switch_to.default_content()

再加一个窗口切换:

# 窗口切换 def change_window(self, n): # 获取句柄 handles = self.driver.window_handles # 切换到原始页面,n = 0 # 切换句柄到第二个页面,n = 1 ,以此类推 self.driver.switch_to.window(handles[n]) 2.登录操作

前面将会常用的方法做了封装之后,我要开始做登录操作了,首先我先创建页面类MusicLogin,让它继承WebKeys,为了方便看代码,我在每行都加了备注,对了,如果要用点击头像登录的话,就要先登录qq,然后 xpath 后面的参数要改成自己的,接下来就是代码:

class MusicLogin(WebKeys): # 登录 def login_music(self): self.open('https://music.163.com/') self.click('xpath', '//*[contains(text(), "登录")]') self.click('link text', '选择其他登录模式') # 勾选用户协议 self.click('css selector', '#j-official-terms') time.sleep(0.5) # 点击QQ登录 self.click('xpath', '//body[1]/div[7]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/ul[1]/li[2]') # 等待句柄 time.sleep(3) # 切换句柄 self.change_window(1) # 切换iframe iframe = self.locator('xpath', '//*[@id="ptlogin_iframe"]') self.change_frame(iframe) # 点击头像进行登录,xpath记得修改 self.click('xpath', '改这里') # 切换回网易云主页 self.change_window(0) 总结

结果展示: https://www.bilibili.com/video/BV1MZ4y1t747?spm_id_from=333.999.0.0 注意:不要玩的太频繁,我的账号就被玩封号了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3