参考文章:http://blog.csdn.net/fontthrone/article/details/72775865
requests库的学习:https://zhuanlan.zhihu.com/p/20410446
爬虫原理介绍:http://www.cnblogs.com/zhaof/p/6898138.html
干货走起!
import requests
import re
from bs4 import BeautifulSoup
#反爬虫 动态设置user-Agent 参见http://www.cnblogs.com/rwxwsblog/p/4575894.html
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/50.0.2661.102'}
# payload = {'wd': 'GitHub'} # 搜索的关键字是GitHub
url = 'http://bd.kuwo.cn/mingxing/%E6%AF%9B%E4%B8%8D%E6%98%93.htm' #毛不易主页
res = requests.get(url, headers=headers)
# print(res.text) #获得网页源码
#第1节:爬取所有毛不易歌词
website1 = 'http://bd.kuwo.cn' #主网页
url = 'http://bd.kuwo.cn/mingxing/%E6%AF%9B%E4%B8%8D%E6%98%93.htm ' #毛不易主页
page = requests.get(url) #get方式发送请求
# print(page.text) #得到响应文本(html文档)
repr1 = r'/yinyue/\d+' #正则表达式 匹配文本中所有“/yinyue/数字” 的字符串
LaternUrls = re.findall(repr1,res.text)[2:] #列表切片,截取列表中第二个以及之后的字符串
# print(LaternUrls) #输出['/yinyue/27101590', '/yinyue/27101590',。。。],
repr2 = r'lId\d+' #用正则匹配 网页中
....等等
singText = '' #所有歌词合并后的文本
singList = [] #歌词列表
for url in LaternUrls:
url = website1 + url #组合出歌词所在的网页url
page = requests.get(url)
page.encoding = 'utf-8'
bs = BeautifulSoup(page.text,'html.parser') #URL的解析方式
id1 = re.findall(repr2,page.text) #所有的lId(数字) 的id列表
# print(id1,'ididiididididiididid') #["lId1","lId2","lId3","lId4".......]
for i in id1:
ciju = bs.find(id="%s"%i).get_text() # 网页中id属性 注意这里占位符的使用
singText +=ciju
singList.append(ciju)
print(singText)
print(len(singList))
#第二节 去除特殊的符号,是文本更简洁
import jieba # 中文分词模块
ExceptChars = ['\n','\r\n',', ','(',')'] # 文本中无关的符号
L = [x for x in jieba.cut(singText) if x not in ExceptChars] # 按照字典中词语 分词
print(L)
words_split_space = ' '.join(L) #列表解析
print(words_split_space,len(words_split_space),'wwww')
#第三节生成词云图
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator
import numpy as np
import PIL.Image as Image
imgShape = 'SmallCat.jpg' # 读入背景图片 利用背景图片生成词云
img = Image.open(imgShape)
w,h = img.size #获取背景图片的宽高
coloring = np.array(Image.open(imgShape)) #背景图片的颜色
my_wordcloud = WordCloud(background_color="white", max_words=2000, mask=coloring,max_font_size=40, random_state=42,font_path="C:/Windows/Fonts/simkai.ttf")
my_wordcloud.generate(words_split_space)
image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.figure()
plt.imshow(my_wordcloud.recolor(color_func=image_colors),interpolation="bilinear",cmap=plt.cm.ocean) #cmap绘图时的样式,这里选择的是ocean主题。
plt.axis("off")
plt.figure()
#显示原图形
plt.imshow(coloring, cmap=plt.cm.gray,interpolation="bilinear") #interpolation插值方式
plt.axis("off")
plt.show()
最终生成如下词云图: