python爬虫:通过selenium+requests爬取各类音乐的详细信息
完整代码如下:

from selenium import webdriver
from lxml import etree
import requests
import timeclass MusicSpider(object):def __init__(self):self.driver = webdriver.Chrome("D:\pythonSpider\soft\chromedriver.exe")self.start_url = "https://music.163.com/#/discover/playlist/"self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}def get_sort_list(self):sort_list = self.driver.find_elements_by_xpath("//div[@id='cateListBox']/div/dl/dd/a")print(sort_list)return sort_listdef get_music_list(self):music_list = self.driver.find_elements_by_css_selector(".msk")return music_listdef get_content_dic(self,href,cookies):response = requests.get(href, headers=self.headers, cookies=cookies)html_str = response.content.decode()html = etree.HTML(html_str)item = {}item["music_name"] = html.xpath("//h2[@class='f-ff2 f-brk']/text()")[0]item["music_data_count"] = html.xpath("//a[@class='u-btni u-btni-fav ']/@data-count")[0]item["music_comment_count"] = html.xpath("//span[@id='cnt_comment_count']/text()")[0]item["music_intr"] = html.xpath("//p[@class='intr f-brk']/text()")[0]intr_list = html.xpath("//p[@class='intr f-brk']/br")for intr in intr_list:item["music_intr"] += intr.tailsong_list = []li_list = html.xpath("//ul[@class='f-hide']/li")for li in li_list:song = {}song["song_title"]= li.xpath("./a/text()")[0]song["song_href"]=li.xpath("./a/@href")[0]# song_list["song_time"] = tr.xpath(".//span[@class='u-dur']/text()")# song_list["song_singer"] = tr.xpath(".//div[@class='text']/@title")# song_list["song_name"] = tr.xpath(".//div[@class='text']/a/@title")song_list.append(song)item["item_song_list"] =song_listprint(item)return item#保存数据def save_content(self,content):with open("music.txt","a",encoding="utf-8") as f:f.write(str(content))f.write("\n")def run(self):# start_url# 发送请求,获取响应self.driver.get(self.start_url)# 获取数据#获取分类self.driver.switch_to.frame("contentFrame")self.driver.find_element_by_xpath("//div[@class='u-title f-cb']//a[@id='cateToggleLink']").click()sort_list= self.get_sort_list()sort_list_len = len(sort_list)for j in range(sort_list_len):sort_list[j].click()time.sleep(3)# 获取音乐列表music_list = self.get_music_list()print(music_list)music_list_len = len(music_list)for i in range(music_list_len):href = music_list[i].get_attribute("href")print(href)music_list[i].click()# 获取音乐内容time.sleep(3)cookies = self.driver.get_cookies()cookies = cookies[-1]cookies ={"domain": cookies["domain"],"name": cookies["name"],"value": cookies["value"],"path": cookies["path"]}time.sleep(3)self.get_content_dic(href,cookies)# 保存self.save_content(content)print('*'*20)self.driver.back()time.sleep(3)self.driver.switch_to.frame("contentFrame")music_list = self.get_music_list()print(music_list)time.sleep(3)self.driver.back()time.sleep(3)self.driver.switch_to.frame("contentFrame")sort_list = self.get_sort_list()time.sleep(3)self.driver.quit()if __name__ == "__main__":music = MusicSpider()music.run()

所遇问题:

  • 批量操作循环点击的时候,返回上一页会报错:elenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document,因为再次返回上一页时,原先列表元素已经过期了,因此需要再次重新刷新列表元素
    参考链接
    改正后:
     for i in range(music_list_len):href = music_list[i].get_attribute("href")print(href)music_list[i].click()# 获取音乐内容time.sleep(3)# 获取cookies值cookies = self.driver.get_cookies()cookies = cookies[-1]cookies ={"domain": cookies["domain"],"name": cookies["name"],"value": cookies["value"],"path": cookies["path"]}time.sleep(3)self.get_content_dic(href,cookies)# 保存self.save_content()print('*'*20)#回到上一页self.driver.back()time.sleep(3)#必须再次定位到frame#self.driver.switch_to.frame("contentFrame")#重新加载循环列表music_list = self.get_music_list()print(music_list)time.sleep(3)

运行后,却发现重新定位列表为空,后来发现重新定位循环列表时,因为是在iframe中,所以必须再次进入iframe中

                 self.driver.back()time.sleep(3)#必须再次定位到frameself.driver.switch_to.frame("contentFrame")#重新加载循环列表music_list = self.get_music_list()
  • 在获取音乐详情时,用了
def get_content_dic(self,href,cookies):response = requests.get(href, headers=self.headers, cookies=cookies)html_str = response.content.decode()html = etree.HTML(html_str)item = {}item["music_name"] = html.xpath("//h2[@class='f-ff2 f-brk']/text()")[0]item["music_data_count"] = html.xpath("//a[@class='u-btni u-btni-fav ']/@data-count")[0]item["music_comment_count"] = html.xpath("//span[@id='cnt_comment_count']/text()")[0]item["music_intr"] = html.xpath("//p[@class='intr f-brk']/text()")[0]intr_list = html.xpath("//p[@class='intr f-brk']/br")for intr in intr_list:item["music_intr"] += intr.tailsong_list = []li_list = html.xpath("//ul[@class='f-hide']/li")for li in li_list:song = {}song["song_title"]= li.xpath("./a/text()")[0]song["song_href"]=li.xpath("./a/@href")[0]# song_list["song_time"] = tr.xpath(".//span[@class='u-dur']/text()")# song_list["song_singer"] = tr.xpath(".//div[@class='text']/@title")# song_list["song_name"] = tr.xpath(".//div[@class='text']/a/@title")song_list.append(song)item["item_song_list"] =song_listprint(item)return item

在用xpath定位元素时,总是出错,后来发现Element和Network中response返回的页面是不同的,故应该以response中为准,定位元素

Python爬取网易云各类音乐的详细信息相关推荐

  1. Python爬取网易云音乐所有歌手的名称和链接

    一.需求 Python爬取网易云音乐所有歌手的名称和链接 二.代码实现 import requests from lxml import etree from urllib import reques ...

  2. Python爬取网易云热歌榜所有音乐及其热评

    获取特定歌曲热评: 首先,我们打开网易云网页版,击排行榜,然后点击左侧云音乐热歌榜,如图: 关于如何抓取指定的歌曲的热评,参考这篇文章,很详细,对小白很友好: 手把手教你用Python爬取网易云40万 ...

  3. python爬取网易云音乐热评_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  4. python爬取网易云评论最多的歌_python爬取网易云音乐评论

    本文实例为大家分享了python爬取网易云音乐评论的具体代码,供大家参考,具体内容如下 import requests import bs4 import json def get_hot_comme ...

  5. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  6. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  7. Python爬取网易云音乐热歌榜(爬虫)

    Python爬取网易云音乐热歌榜歌曲,并下载到本地 找到要下载歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更 ...

  8. python爬取网易云音乐生成王力宏歌曲词云

    python爬取网易云音乐生成王力宏歌曲词云 # -*- coding:utf-8 -*- # 网易云音乐,通过歌手id生成词云 import requests import sys,re,os fr ...

  9. python爬取网易云音乐排行榜数据

    python爬取网易云音乐排行榜歌曲及评论 网易云音乐排行榜歌曲及评论爬取 主要注意问题:selenium 模拟登录.iframe标签定位.页面元素提取. 在利用selenium定位元素并取值的过程中 ...

最新文章

  1. 非线性规划-三种常见参数估计算法及联系
  2. oracle密码文件认证,Oracle OS认证与口令文件认证详解
  3. Python中装饰器的理解和实现
  4. 转 Django+Bootstrap练习--我的类博客系统开发
  5. 乾坤大挪移:SAP CRM WebClient UI 和 SAP Fiori UI 混搭并存
  6. [react] 有在项目中使用过Antd吗?说说它的好处
  7. python的错误处理——try语句
  8. Android APP开发需求文档范本
  9. The app references non-public selectors in payload With Xcode6.1
  10. (博主可帮找错)Servlet.service() for servlet [dispatcherServlet] path [] threw exception feign.Feig,可截图私聊博主
  11. 多线程有几种实现方法_Java多线程实现有哪几种方法?
  12. (小例子)点击图标/链接发起QQ临时会话
  13. 100道接口测试面试题收好了!【建议收藏】
  14. 普林斯顿微积分读本02第一章--函数的复合、奇偶函数、函数图像
  15. 利用图神经网络进行社交机器人检测
  16. 11位大咖集结!和最专业的人,探讨“由内及外”的未来趋势 | 生辉 · 生命科学大会-1
  17. LQ0143 砍竹子【序列处理】
  18. docker搭建snipe-it
  19. Unity 事件中心
  20. 愚人节老板发话了,免费送书 + 免费入驻Java知识星球!!

热门文章

  1. 【GIS教程】在谷歌地图中快速导出区域地形图
  2. activiti-explorer stencilset.json 国际化文件
  3. Android 系统属性读取和设置详解
  4. 利用python进行电脑性能排行榜的爬取【个人学习】
  5. 穿山甲成长中心——人能尽其才则百事兴
  6. chm、html文件转换为PDF文件(已解决)
  7. 解读 | 经典实验介绍之小心视崖,等你来了解哦
  8. 朴素贝叶斯法 - 垃圾邮件分类
  9. vue项目中element-ui全局引入按需引入按需引入报错解决
  10. 用HOSTS文件屏蔽网站