我想大家都听过音乐《惊雷》吧,这是最近很火的一首歌,听说拿下了60亿的流量。杨坤在直播中怼《惊雷》,所以我就想看看网络上是怎么样评论这首歌的。开始今天的爬虫之旅吧!!
一
第一步,我们先分析网页。网页的地址为:
https://music.163.com/#/song?id=1431580747
首先还是需要打开开发者工具,找到API接口。
API的接口位置
数据信息
一般来说,接口的信息都是在XHR这个类目中。所以当你爬多了,自然就有经验了。但是这里出现了一个问题:这个接口是需要传递两个参数的,但是这两个参数都被加密了,这就很麻烦了,如下图所示:
加密参数
那么就需要解密了,当然我已经解密成功了,在这里我就不说了,因为不是很难,主要用的是js的加密技巧。只要大家熟悉js,那就问题不是很大。
但是对于不会解密的小伙伴来说,这怎么办呢?
没事,下面我们就使用selenium来完成。
二
在上一步,我们基本上把 网站分析完毕,现在要做的就是发起请求,获取响应了。今天使用的是selenium。selenium是自动化测试的一个工具,模拟人的行为。
首先,需要安装selenium库,并下载驱动。
安装:pip install selenium
驱动下载地址:
https://chromedriver.chromium.org/downloads
当然你也可以公众号回复:谷歌驱动
即可获取驱动,下载你对应的版本
谷歌浏览器驱动
你可以根据自己浏览器的版本,下载对应的驱动。我在这里使用的是谷歌浏览器的驱动。那么如何查看浏览器的版本号呢?如下图所示:
点击设置,按图所示点击
将下载好的谷歌驱动,放至Python的目录下,即可。
驱动所在的位置
至此,selenium环境配置成功。
三
现在就开始来写代码了,首先要将驱动导入进来
from selenium import webdriver
接下来创建一个类:初始化url和驱动对象
class WangYiYun(object): def __init__(self, url): self.url = url self.driver = webdriver.Chrome()
四
接下来要做的就是获取数据了,在这一步,我创建了一个getConten这个方法
def getContent(self): self.driver.get(self.url) js = 'window.scrollBy(0,8000)' # self.driver.execute_async_script(js) self.driver.switch_to.frame(0) self.driver.execute_script(js) for page in range(413): selectors = self.driver.find_elements_by_xpath('//div[@class="cmmts j-flag"]/div') # print(selectors.find_element_by_xpath('')) for selector in selectors: text = selector.find_element_by_xpath('.//div[@class="cnt f-brk"]').text list_text = text.split(':') text = list_text[1] WangYiYun.save_text(text) next_page = self.driver.find_element_by_partial_link_text('下一页') next_page.click() time.sleep(5)
在这一步,要做的是访问url地址,通过js代码将滚动条下拉,因为网易云音乐是属于一个网页嵌套另外一个网页,所以这里要做的就是获取到第一个iframe。如下图所示:
iframe位置
接下来就是下拉之后通过xpath提取到每一个评论和下一页的按钮,并点击和保存数据。
五
接下来要做的就是保存数据了,这个比较简单,我就不做过多的叙述了,直接上代码
def save_text(item): with open('content.txt', 'a', encoding='utf-8') as f: f.write(str(item) + '\n')
六
数据保存完毕之后,那么肯定要做一个可视化操作吧,假如你在公司工作,那么老板喜欢看到的不是这些密密麻麻的文字评论,而是要看报表对吧,那我就做一个词云方便大家观看。
这里使用了中文分词库jieba和词云库wordcloud
import wordcloudimport jiebaf = open('content.txt', encoding='utf-8')txt = f.read()txt_list = jieba.lcut(txt) # 分词# print(txt_list)string = ''.join(txt_list)# print(string)w = wordcloud.WordCloud(width=1000, height=1000, background_color='white', font_path='msyh.ttc', scale=15, stopwords={' '})w.generate(string)w.to_file('content1.png')
词云效果
—— E N D ——
好了,到这里又要跟大家说再见的时候了。希望我的文章能带给您知识,带给您帮助!同时也谢谢您能抽出宝贵的时间阅读,创作不易,如果您喜欢的话,点个关注再走吧。您的支持是我创作的动力,希望今后能带给大家更多优质的文章。
源码获取加群哦:850591259