Python爬虫-MongoDB
时间:2022-07-26
本文章向大家介绍Python爬虫-MongoDB,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有态度地学习
上一份的推送是关于QQ音乐所有评论的获取,这一次讲讲QQ音乐精彩评论的获取。翻了一下QQ音乐热歌排行榜上的歌,发现QQ音乐热评多的歌不多,所有评论和网易云音乐比起来也挺寒碜的,只能说网易云不愧是文艺小青年的聚集地。不过不能因为评论少就不爬了,见面就是莽,不虚。
通过本次爬取,学习了非关系型数据库,文档型数据库MongoDB。另外公众号的排版也变的更加美观了,尤其是底部多了推荐阅读和扫码关注。在借鉴其他公众号的排版之后,用自己半吊子的PPT水平做了底部的照片,喜欢的可以点个赞呀!
就目前的了解,MongoDB的优点:无需设置固定结构(嵌套),也不必考虑数据类型匹不匹配,对数据的可操作性也更大。这回也是一样在Mac上操作,在Mac上安装了MongoDB以及MongoDB的可视化工具Robo 3T,Robo 3T作为一款免费轻量级GUI,简单且易上手。
创建数据库,表格及插入数据。
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,短时间内基本不变。
平凡之路精彩评论一共有624条。每一个请求页10条数据,第一页例外,有15个,但是最后却只获取了595条,这是因为评论中有追评的,没有原创评论,所以直接剔除,当然还有评论已经删除的,直接就没有评论信息了。
爬取代码如下:
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中评论数据,生成词云
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("生成词云成功")
幸运.jpg
- ZooKeeper 笔记(1) 安装部署及hello world
- mybatis 使用经验小结
- ZooKeeper 笔记(2) 监听数据变化
- 使用C# 和Consul进行分布式系统协调
- 设置 java -jar 的进程显示名称
- 爱浪携手豆瓣内容、腾讯共同发布AI语音耳机
- Win.ini和注册表的读取写入
- ZooKeeper 笔记(4) 实战应用之【消除单点故障】
- 64位centos 下编译 hadoop 2.6.0 源码
- Python基础原理:FP-growth算法的构建
- MFC中如何画带实心箭头的直线
- 非域环境下使用证书设置数据库镜像
- velocity模板引擎学习(3)-异常处理
- Oracle Coherence应用部署到Jboss EAP 6.x 时 NoClassDefFoundError: sun/rmi/server/MarshalOutputStream 的解决办法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel如何实现自动加载类
- 在Laravel中实现使用AJAX动态刷新部分页面
- laravel 自定义常量的两种方案
- Thinkphp页面跳转设置跳转等待时间的操作
- Laravel 创建可以传递参数 Console服务的例子
- laravel实现查询最后执行的一条sql语句的方法
- 解决laravel groupBy 对查询结果进行分组出现的问题
- laravel批量生成假数据的方法
- 对laravel in 查询的使用方法详解
- PHP使用redis位图bitMap 实现签到功能
- thinkphp5+layui实现的分页样式示例
- Laravel实现搜索的时候分页并携带参数
- PHP7.3.10编译安装教程
- Laravel-添加后台模板AdminLte的实现方法
- PHP7 安装event扩展的实现方法