【爬虫】使用selenium爬取网易云音乐热歌榜

本文讲述了使用Selenium库和Edge浏览器驱动抓取网易云热歌榜时遇到的frame问题,通过`switch_to.frame()`方法解决页面嵌套框架导致的数据获取问题,展示了完整的代码和运行结果。
摘要由CSDN通过智能技术生成

网易云热歌榜

在这里插入图片描述

踩坑:frame

F12查看网页源代码发现每一个歌曲都是tr标签包含在唯一的tbody标签内,那我们只要获取到所有的br标签就能得到想要的数据,但测试发现爬取后的数据为空或者找不到元素,最后发现是因为页面中嵌套了frame从而导致定位不到元素。
在这里插入图片描述在这里插入图片描述

switch_to.frame()

需要使用switch_to.frame()方法来切换页面Frame

driver = webdriver.Edge()
driver.get("https://music.163.com/#/discover/toplist?id=3778678")
driver.switch_to.frame('g_iframe')

在这里插入图片描述

完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By

# Edge驱动
driver = webdriver.Edge()

# 访问网易云热歌榜
driver.get("https://music.163.com/#/discover/toplist?id=3778678")

# switch_to.frame() 方法切换到 iframe 中
driver.implicitly_wait(5)  # 隐性等待
driver.switch_to.frame('g_iframe')

# 解析网页源代码获取所有 tr 标签
driver.implicitly_wait(3)
tr_list = driver.find_elements(By.XPATH, "//table[@class='m-table m-table-rank']/tbody/tr")

# 遍历 tr 标签获取需要的数据
for tr in tr_list:
    try:
        num = tr.find_element(By.XPATH, "td/div/span").text
        title = tr.find_element(By.XPATH, "td[2]/div/div/div/span/a/b").get_attribute("title")
        time = tr.find_element(By.XPATH, "td[3]/span").text
        name = tr.find_element(By.XPATH, "td[4]/div").get_attribute("title")
    except Exception as e:
        print(e)
    else:
        # print(num, title, time, name)
        data = f"{num},{title},{time},{name}\n"
        # 持久化存储
        with open("music_top200.csv", "a", encoding="utf-8") as fp:
            fp.write(data)

运行结果

在这里插入图片描述

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用Selenium爬取网易云音乐评论的步骤: 1. 安装Selenium和Chrome浏览器驱动。 ```python !pip install selenium ``` Chrome浏览器驱动下载地址:http://chromedriver.chromium.org/downloads 2. 导入必要的库和设置浏览器驱动路径。 ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 设置浏览器驱动路径 driver_path = 'chromedriver的路径' ``` 3. 打开网易云音乐网站并搜索指定的歌曲。 ```python # 打开网易云音乐网站 driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://music.163.com/') # 切换到iframe中 driver.switch_to.frame("contentFrame") # 搜索指定的歌曲 search = driver.find_element_by_xpath('//*[@id="m-search-input"]') search.send_keys('告白气球') search.send_keys(Keys.RETURN) # 等待页面加载完成 time.sleep(3) ``` 4. 打开歌曲的评论页面并切换到最新评论。 ```python # 打开歌曲详情页 song_link = driver.find_element_by_xpath('//*[@id="song-0"]/div[2]/div/div[1]/div[1]/a') song_link.click() # 点击展开评论 comment_button = driver.find_element_by_xpath('//*[@id="cnt_comment_count"]') comment_button.click() # 切换到最新评论 comment_tab = driver.find_element_by_xpath('//*[@id="comment-box"]/div[1]/div[1]/ul/li[2]/a') comment_tab.click() # 等待页面加载完成 time.sleep(3) ``` 5. 模拟滚动鼠标操作,加载更多评论。 ```python # 模拟滚动鼠标操作,加载更多评论 for i in range(10): driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') time.sleep(2) ``` 6. 获取所有评论的用户名和内容。 ```python # 获取所有评论的用户名和内容 comment_list = driver.find_elements_by_xpath('//*[@id="comment-box"]/div[1]/div[3]/div') for comment in comment_list: username = comment.find_element_by_xpath('./div[2]/a').text content = comment.find_element_by_xpath('./div[1]/div[1]').text print(username, content) ``` 7. 关闭浏览器。 ```python # 关闭浏览器 driver.quit() ``` 完整代码如下: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 设置浏览器驱动路径 driver_path = 'chromedriver的路径' # 打开网易云音乐网站 driver = webdriver.Chrome(executable_path=driver_path) driver.get('https://music.163.com/') # 切换到iframe中 driver.switch_to.frame("contentFrame") # 搜索指定的歌曲 search = driver.find_element_by_xpath('//*[@id="m-search-input"]') search.send_keys('告白气球') search.send_keys(Keys.RETURN) # 等待页面加载完成 time.sleep(3) # 打开歌曲详情页 song_link = driver.find_element_by_xpath('//*[@id="song-0"]/div[2]/div/div[1]/div[1]/a') song_link.click() # 点击展开评论 comment_button = driver.find_element_by_xpath('//*[@id="cnt_comment_count"]') comment_button.click() # 切换到最新评论 comment_tab = driver.find_element_by_xpath('//*[@id="comment-box"]/div[1]/div[1]/ul/li[2]/a') comment_tab.click() # 等待页面加载完成 time.sleep(3) # 模拟滚动鼠标操作,加载更多评论 for i in range(10): driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') time.sleep(2) # 获取所有评论的用户名和内容 comment_list = driver.find_elements_by_xpath('//*[@id="comment-box"]/div[1]/div[3]/div') for comment in comment_list: username = comment.find_element_by_xpath('./div[2]/a').text content = comment.find_element_by_xpath('./div[1]/div[1]').text print(username, content) # 关闭浏览器 driver.quit() ``` 注意:爬虫行为容易引起网站的反爬虫机制,使用时请注意合理使用,避免对网站造成影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值