上一份的推送是关于QQ音乐全部评论的获取,这一次讲讲QQ音乐精彩评论的获取。翻了一下QQ音乐热歌排行榜上的歌,发现QQ音乐热评多的歌很少,全部评论和网易云音乐比起来也挺寒碜的,只能说网易云不愧是文艺小青年的汇集地。不过不能由于评论少就不爬了,见面就是莽,不虚。html
经过本次爬取,学习了非关系型数据库,文档型数据库MongoDB。另外公众号的排版也变的更加美观了,尤为是底部多了推荐阅读和扫码关注。在借鉴其余公众号的排版以后,用本身半吊子的PPT水平作了底部的照片,喜欢的能够点个赞呀!mongodb
就目前的了解,MongoDB的优势:无需设置固定结构(嵌套),也没必要考虑数据类型匹不匹配,对数据的可操做性也更大。这回也是同样在Mac上操做,在Mac上安装了MongoDB以及MongoDB的可视化工具Robo 3T,Robo 3T做为一款免费轻量级GUI,简单且易上手。数据库
建立数据库,表格及插入数据。json
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) db = client.QQ_Music collection = db.comments comments = { "nike": "꧁༺詩光༻꧂", "comment": "释迦摩尼说 :不管你碰见谁, 他都是你生命中该出现的人 ,绝非偶然。", "praisenum": "7817", "comment_id": "song_7072290_1772758010_1486708168", "time": "2017-02-10 14:29:28" } result = collection.insert(comments) print(result)
针对QQ音乐中平凡之路的网页进行分析,经过不断点击加载更多,发现了请求网址的变化参数:pagenum、jsoncallback。经过上期的爬取,咱们知道jsoncallback对于请求是没有影响的,因此这回更简单,只需改变页码便可。而lasthotcommentid则是第一页精彩评论的最后一个ID,短期内基本不变。dom
平凡之路精彩评论一共有624条。每个请求页10条数据,第一页例外,有15个,可是最后却只获取了595条,这是由于评论中有追评的,没有原创评论,因此直接剔除,固然还有评论已经删除的,直接就没有评论信息了。ide
爬取代码以下:工具
import re import json import time import pymongo import requests client = pymongo.MongoClient(host='localhost', port=27017) db = client.QQ_Music collection = db.comments def get_html(url, headers): try: response = requests.get(url=url, headers=headers) response.raise_for_status() response.encoding = 'utf-8' except requests.HTTPError: print("connect failed") return response def parse_html(html): data = {} content = json.loads(html[30:-3]) for item in content['comment']['commentlist']: if item.get("rootcommentcontent"): data["nike"] = item.get("nick") data["comment"] = re.sub(r"\\n", " ", item.get("rootcommentcontent")) data["_id"] = (re.sub(r"\n", " ", data["comment"])) data["comment"] = (re.sub(r"\n", " ", data["comment"])) data["praisenum"] = item.get("praisenum") data["commentid"] = item.get("commentid") data["time"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(item.get("time")))) yield data def to_mongodb(data): try: collection.insert(data) print("Insert the data successfully", data) except: pass def main(): for i in range(63): url = 'https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=5381&jsonpCallback=jsoncallback05763744516059277&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=GB2312¬ice=0&platform=yqq&needNewCode=0&cid=205360772&reqtype=2&biztype=1&topid=7072290&cmd=6&needmusiccrit=0&pagenum=%s&pagesize=10&lasthotcommentid=song_7072290_2856798698_1489491834&callback=jsoncallback05763744516059277&domain=qq.com&ct=24&cv=101010' %i headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'} time.sleep(2) response = get_html(url, headers) for item in parse_html(response.text): to_mongodb(item) if __name__ == '__main__': main() print("Finish The Work")
最后成功获取评论信息学习
读取MongoDB中评论数据,生成词云jsonp
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator import matplotlib.pyplot as plt import pandas as pd import pymongo import jieba import re client = pymongo.MongoClient('localhost', 27017) db = client.QQ_Music table = db.comments data = pd.DataFrame(list(table.find())) data = data[['comment']] text = '' for line in data['comment']: r = '[a-zA-Z0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+' line = re.sub(r, '', line) text += ' '.join(jieba.cut(line, cut_all=False)) backgroud_Image = plt.imread('luck.jpg') wc = WordCloud( background_color='white', mask=backgroud_Image, font_path='msyh.ttf', max_words=2000, stopwords=STOPWORDS, max_font_size=130, random_state=30 ) wc.generate_from_text(text) img_colors = ImageColorGenerator(backgroud_Image) wc.recolor(color_func=img_colors) plt.imshow(wc) plt.axis('off') wc.to_file("幸运.jpg") print("生成词云成功")
幸运.jpgurl
··· END ···