更新日期: 2021.04.03

本节内容

给自己布置个小作业:找到一个没有反扒措施的音乐网站,下载陈奕迅所有的歌曲歌词,筛选出其中的粤语歌,然后制作词云图~~

目录

  • 1. 爬取歌曲信息
  • 2. 根据歌词制作词云图
  • 3. Eason 歌词词云图
  • 4. 总结

1. 爬取歌曲信息

爬取九库音乐网上 Eason 的歌曲清单,含歌曲名字和歌词。

这个网站没有任何反扒措施,可是…网页代码好乱…soup也没用的…

为了拿到清单,不断的忍让和屈服…

  • 除了歌名,链接和歌词,本来计划中还要爬取作词,作曲,年份等信息,可是… 有的页面到了目标信息应该出现的位置,不仅目标没有,连整个位置都没有了,或者关键词也不在了…算了,不要了
  • 歌词: 一共309首,其中19首,有的网页代码结构不同,有的页面上根本就没有歌词!
  • 本来,打算Excel中一个单元格存放一首歌词,结果有的一个标签的字符串就是歌词,有的前面包含了作词作曲,有的还包含了别的信息。不是一般的乱, 如下…(国语版叫<十年>啊!)

既然这个网站这个么乱,为什么不去别的网站呢?看了几个别的网站,有动态网页的,有需要登录的,关键是,这个网站这么乱,是我后来才知道的…

好吧,先这样吧。

import requests
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
import re
import time
import random
import xlwings as xw# 获取一个网页的代码
def get_one_page(url):try:response = requests.get(url, headers = my headers)if response.status_code == 200: # 检查状态是否正常,只有"200"代码表示正常状态html = response.textreturn htmlexcept RequestException:print("****************** Exception found when get website codes")# 打开清单页面,获取每首歌曲的名字和链接
url = 'https://www.9ku.com/geshou/40.htm'
song_names, song_links = [], []html = get_one_page(url)
soup = BeautifulSoup(html, "lxml")
tags = soup.find_all("div", class_="songName")
for tag in tags:song_names.append(tag.string)song_links.append("https://www.9ku.com" + tag.next_sibling.next_sibling["href"])# 将歌曲名字和链接存入文件
wb = xw.Book()
sheet = wb.sheets.active
sheet.range("A1").options(transpose=True).value = song_names
sheet.range("B1").options(transpose=True).value = song_links
print("Completed ---" + str(len(song_names)) + " songs' names & links saved into 'a20210402_Eason_songs.xlsx'.")# 通过获取到的链接,依次打开每个页面获取歌词
failed_time = 0
for i in range(1, (len(song_links))+1):time.sleep(random.uniform(1.0, 1.1))html = get_one_page(sheet.range("B"+str(i)).value)pattern = re.compile(r"点击这里试听歌曲.*?<br/>(.*?)</div>",re.S)try:lyric = str(pattern.search(html).groups(0))lyric = lyric.replace(r"\r<br/>", " ")sheet.range("C" + str(i)).value = lyricexcept Exception as a:print("****************** Exception found when parse page " + str(i) + " : " + str(a))sheet.range("C"+str(i)).value = "failed to get lyric"failed_time = failed_time + 1if i % 5 == 0:print("Saved " + str(i) + " records into file 'a20210402_Eason_songs.xlsx'")print("Completed --- " + str(len(song_links)-failed_time) + " records saved into file 'a20210402_Eason_songs.xlsx'.")
print(str(failed_time) + " songs' lyric not available...")wb.save("a20210402_Eason_songs.xlsx")
wb.close()

2. 根据歌词制作词云图

拿到的歌词比较凌乱,先用正则去除英文和特殊字符,再用 jieba 分词。

做词云图~~

  • 处理不希望出现的词 - 先使用 wordcloud_name.words_查看词频,然后把需要禁用的高频词放在 stopwords 里
  • 尽量选择使用背景为白色的图
  • 分析中文,需要指定字体文件,否则结果都是彩色小方框(如下)
import xlwings as xw
import re
import jieba
import numpy as np
from wordcloud import WordCloud
import PIL.Image as image# 将文字信息从Excel转入Text文件中
wb = xw.Book('a20210402_Eason_songs_local.xlsx')
sheet = wb.sheets.active
with open('a20210402_Eason_songs_local.txt', 'w', encoding ="utf-8") as file:for i in range(1, 281):file.write('' + sheet.range("D"+str(i)).value)
wb.close()# 使用正则去除文件中的英文和一些特殊字符,然后使用jieba分词
with open('a20210402_Eason_songs_local.txt', 'r', encoding ="utf-8") as file:text = file.read()
text_clean = re.sub("[a-zA-Z0-9()<br/>':]", " ", text)
word_list = jieba.cut(text_clean, cut_all=True)
result = " ".join(word_list)# 把分词结果存入新文件,便于查看分词效果(也可以不存入文件,直接使用)
with open('a20210402_Eason_songs_local_sep.txt', 'w', encoding ="utf-8") as file:file.write(result)# 制作词云图~~~
# 选择背景图
mask = np.array(image.open("Eason_pic_20210403_2.jpeg"))
# 先试做一次,查看词频,把频次较高但没有意义的词放在stopwords里,禁止出现在词云中
# 指定中文字体,否则都是方框
Eason_wordc = WordCloud(mask=mask, background_color="#FFFFFF",stopwords={'的','了','在','有','不需','也','都','是','这','再','要','就','奕迅'},font_path=r'C:\Windows\Fonts\simkai.ttf').generate(result)
Eason_wordc.to_file("new_wordcloud_5.jpg")

如果还希望在每次运行时查看下词云图,可以添加以下语句。

image_produce = Eason_wordc.to_image()
image_produce.show()

3. Eason 歌词词云图

自从第一次听到《明年今日》, 就喜欢上了E神, 直到现在~~~

4. 总结

  • 混乱的网页代码: 有的网站代码比较乱,不方便爬取,或者,数据拿到了也和期望的有差距。只能尽量去找好的数据源, 还有, 有空应该了解下数据清洗。
  • 筛选出粤语歌: 考虑过识别简体和繁体字的方法, 不过, 下载下来的文字都是简体中文(以为粤语歌会是繁体字呢), 识别方法用不上啦~~
  • 学习态度: 之前学习 requests, bs4, re 时, 都是把官网文档从头到尾看一遍, 然后再看看帖子, 现在, 对于结巴, 词云等, 就没有那么积极了, 可能是因为一次接触了几个库, 又急着用, 又或者觉得不需要了解那么多了…

Python爬虫学习笔记 (11) [初级] 小练习 爬取Eason所有歌曲歌词 制作词云图相关推荐

  1. Python爬虫学习笔记 (9) [初级] 小练习 爬取慕课网课程清单

    更新日期: 2021.03.28 本节学习内容 : 练习使用 bs4 和 xlwings - 爬取慕课网免费课程清单并存为 Excel 文件. 目录 1. 目标信息 2. 爬取步骤 3. 代码 5. ...

  2. 【Python爬虫学习笔记12】Ajax数据爬取简介

    有时候在我们设计利用requests抓取网页数据的时候,会发现所获得的结果可能与浏览器显示给我们的不一样:比如说有的信息我们通过浏览器可以显示,但一旦用requests却得不到想要的结果.这种现象是因 ...

  3. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  4. Python3 爬虫学习笔记 C03 【Ajax 数据爬取】

    Python3 爬虫学习笔记第三章 -- [Ajax 数据爬取] 文章目录 [3.1]Ajax 简介 [3.2]解析真实地址提取 [3.1]Ajax 简介 Ajax - Asynchronous Ja ...

  5. python用selenium爬取b站评论并制作词云图

    文章目录 前言 一.爬取b站评论 1.selenium配置 2.代码 二.制作词云图 1.下载停用词 2.代码 3.注意事项 三.制作成品 1.初期成品 2.成品 前言 b站视频下的评论是下拉加载的. ...

  6. Python爬虫学习笔记 (2) [初级] 初识 requests + bs4 + re

    更新日期:2021.03.12 本节学习内容 爬取网页(第一页)的源代码:初步了解 requests 的使用. 解析代码:初步了解 BeautifulSoup (bs4) 和 re 的使用. 保存信息 ...

  7. Python数据爬虫学习笔记(21)Scrapy爬取当当图书数据并存储至SQLite数据库

    一.需求:在当当网的程序设计类图书商品界面中,爬取图书的名称.详情链接以及评论数,并将信息存储至SQLite数据库. 二.URL及网页源码分析: 1.URL分析,注意到商品搜索页的URL具有以下结构: ...

  8. python爬虫学习(三):使用re库爬取淘宝商品,并把结果写进txt文件

    第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字"python",然后搜索,显示如下搜索结果 从url连接中可以得 ...

  9. 爬虫学习笔记(一):爬取书籍信息

    爬取爬虫练习网站的书籍信息 专门供爬虫初学者训练爬虫技术的网站(http://books.toscrape.com) 我使用的浏览器是Google Chrome浏览器 1. 创建项目 首先,我们要创建 ...

  10. 【python爬虫自学笔记】(实战)----爬取猫眼电影榜单Top100

    目的:爬取猫眼电影榜单TOP100的信息并保存在文档中. 查看网站结构,确定思路: 首先请求网页的地址为maoyan.com/board/4,电影信息的内容包含在一个个dd标签之中,分析dd标签中的内 ...

最新文章

  1. dom刷新局部元素_JavaScript中DOM和BOM基础
  2. 用ActivityGroup解决TabHost中多个Activity跳转问题
  3. flutter布局-8-animated_icons动画图片
  4. 一些好用的 资料网站
  5. 系统优化怎么做-Tomcat优化
  6. SOAR SQL进行优化和改写的自动化工具
  7. 计算机基础- -认识磁盘
  8. 关于模板引擎handlebars.js基本用法
  9. cf 621E. Wet Shark and Blocks
  10. 20145309李昊《网络对抗》MSF应用基础
  11. python随机颜色代码_python绘制随机颜色太阳花
  12. 计算机科学导论的学习
  13. win10 SecoClient连接“提示用户与对方建立连接超时,配置错误或网络故障”
  14. 云学算法之Ackerman阿克曼函数的python实现
  15. mysql 执行存储过程
  16. python基础练习题:纳特拼音alaphabeta【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  17. 9.11云和恩墨笔试
  18. NaN在js中的意义
  19. 厦大C在线实验题3 分数约简
  20. 隆重推荐:唐·玄武门

热门文章

  1. btrfs 入门使用
  2. Qt 使用一张图片实现转圈的动画效果
  3. 实现isodd() 参数为整数,如果整数为基数,返回True 否则返回False
  4. Android判断当前使用数据流量的是哪张卡
  5. 基于MVC的简易图形编辑器
  6. 【去广告插件推荐】AdBlock让浏览器清净
  7. Comparator.comparing()比较排序(可以jdk8 Strim()结合) 可以通过这个比较排序
  8. 京东颜色html,京东m.jd站点静态页实现(首页)H5
  9. 京东话费充值,点击出现的css样式
  10. android编译找不到系统so,Android找不到so库解决方法