0x00 写在前面
这次的网易云音乐评论爬取跟ctfhub登录+签到一样,算是一次实战吧,也算是把这几天学习到的给真正拿来运用了,在这期间呢也确实又学到了新的知识,也对之前学的selenium的知识做了巩固。
0x01 iframe处理
先来看网页源码
这里采用了iframe来构造页面,当我们单纯显示网站源码时,iframe里的东西我们时看不到的,所以我这里采用了selenium的switch_to.frame来切换到iframe页面进行元素的定位和信息的填写
url = "https://music.163.com/#/search/m/"
driver.get(url)
driver.switch_to.frame('g_iframe')#切换到iframe部分
sleep(1)
driver.find_element_by_id('m-search-input').send_keys(user)#找到输入框并输入信息
driver.find_element_by_id('m-search-input').send_keys(Keys.ENTER)
回到网站,我是想搜索用户并访问其主页,再获取用户自己创建的歌单列表和歌单网址的列表,所以我们先去获得用户主页的网址,还是先去看看网页
显然我们可以通过id搜索来确定输入框,接着我偷了个懒没有管搜索的按钮,而是直接在输入框输入enter来达到目的。最后,我们还要点击用户按钮来使得我们的搜索显示的是用户以及用户主页,最后获得table元素即可
从而,getUser函数完整代码如下:
def getUser(user, driver):#user是要搜索的用户名,driver是我们的浏览器驱动
url = "https://music.163.com/#/search/m/"
driver.get(url)
driver.switch_to.frame('g_iframe')#根据iframe的id切换到iframe部分
sleep(1)
driver.find_element_by_id('m-search-input').send_keys(user)#向搜索框中输入用户名
driver.find_element_by_id('m-search-input').send_keys(Keys.ENTER)#输入enter,代表开始搜索
driver.find_element_by_xpath('//*[@class="m-tabs m-tabs-srch f-cb ztag"]/li[8]').click()#点击网页中的用户按钮,改变table的值
sleep(1)
tab = driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div[2]/div/table/tbody')#获得table内的元素
users = tab.find_elements_by_tag_name('a')#从table中分离出包含有用数据的所有标签
list = []
for i, n in enumerate(users):
if (i - 1) % 3 == 0:
tu = (n.get_attribute('title'), n.get_attribute('href'))
list.append(tu)#通过循环把所有的用户id和对应主页url成对放在列表list里
for i, n in enumerate(list):
print('[' + str(i) + ']\t' + n[0] + '\t' + n[1])#打印list
num = input('请输入用户对应序号:')#输入对应想要查看的用户
return list[int(num)]#返回该用户的url以及用户id,即(id,url)元组
0x02 获取歌单
获取到了用户的url,接下来我们就要获取对应用户的歌单列表,这里我偷了个懒,只获得用户自己创建的歌单,先来看看网页
又是一个iframe,其中,用户自己创建的歌单在id为cbox的ul里,这里就跟搜索用户一样,直接上代码
def getSongs(user, driver):
driver.get(user[1])#打开对应网页
sleep(1)
driver.switch_to.frame('g_iframe')#移动到iframe里
box = driver.find_element_by_xpath('//*[@id="cBox"]')#找到歌单所在位置
li = box.find_elements_by_tag_name('a')#找到里面包含歌单名和url的标签
list = []
for i, n in enumerate(li):
if i % 3 == 0:
tu = (n.get_attribute('title'), n.get_attribute('href'))
list.append(tu)#循环写把歌单和url成对写入列表里
print(user[0] + '创建的歌单如下:')
for i, n in enumerate(list):
print('[' + str(i) + ']\t' + n[0] + '\t' + n[1])#打印列表
num = input('请选择对应歌单:')#输入序号选择
return list[int(num)]
0x03 获取歌曲
打开了歌单网页,接下来就是获取歌曲名和对应url了,代码写到这里的时候我才发现网页上只能显示前20首歌,自己登陆了看自己的歌单能看前1000首…所以我在这里又多写了一个登陆的代码块
登陆按钮位置:
对登录弹框的处理(这里我选的是手机登录):
别忘了要先勾选同意条款:
接着输入账号密码:
就能登录成功了,其实这一步可以省略,因为这步只是让我们爬取自己的歌单的时候可以爬到更多的信息…
接下来是歌曲的获取部分,位置如图(这里图方便我就只获得了歌曲名,没有去多获取歌手名,其实影响不大):
ok,位置都找到了,接下来就是写代码了
def getSong(driver, songsname):
sleep(3)#sleep都是为了等待网页加载...
driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]').click()#点击登录按钮
sleep(1)
driver.find_element_by_xpath('/html/body/div[3]/div[2]/div/div[2]/div/div[3]').click()#点击[其他登录方式]
sleep(1)
driver.find_element_by_xpath('/html/body/div[3]