-无业游民找工作莫得结果的第七天,继续人间小苦瓜和关键词云的爱恨情仇
快速指路:
1.1腾讯视频弹幕提取并制作关键词云1:弹幕在哪里
1.2腾讯视频弹幕提取并制作关键词云2:scrapy弹幕的获取
1.3企鹅弹幕提取并制作关键词云3:自动爬取全集+sql数据库写入
1.4企鹅弹幕提取并制作关键词云4:jieba分词+collections词频统计+wordcloud制作关键词云
1.3 scrapy爬取弹幕
爬取弹幕的部分在这一小节基本可以结束了。主要是对之前的代码进行修正和添加了SQL代码(真的是毕业之后就再也没用过数据库,语法都忘了好多。为了CDA的考试,就链接一下数据库吧。)
1.3.1 连续爬取一个视频的弹幕
如果需要爬取一集内的所有弹幕,就需要对timestamp进行一直叠加,直到返回的信息中“”count=0“”。
使用yield+用真循环。(停止条件需要放在处理response的函数中。自行补充XXXXX中的网址)
while True:
url = "https://XXXXXXXXX×tamp={}".format(timestamp)
yield scrapy.Request(url,callback=self.parse)
timestamp=timestamp+15
yield:生成器
生成器是一个不断产生值的函数;一般和for循环配合使用。生成器每产生一个值(yield),当前函数冻结,值被保留,等待下一次调用之后再产生新的值。
{}.format(timestamp)
用timestamp的值来填充{}内的值。
1.3.2 如何停止爬虫
因为当前爬虫停止的条件是需要根据response的内容来判断的,因此用真的条件中无法有判断停止。
为此我找了很多办法,比如直接退出python程序等,但是效果都不好。在查找了多个资料资料之后,在巨人1的肩膀上发现了停止spider的办法。即在parse()函数中停止spider的代码如下:
from scrapy.exceptions import CloseSpider
def parse(self, response):
if count==0:
raise CloseSpider('close it')
在这里只截取关于本爬虫使用的方法介绍,更多的办法可以查看Reference中巨人1的肩膀。
特点:发送此信号的时候,实际上还有一些在列队中的url,需要完成才会停止。类似当运行的时候,使用ctrl c停止一样。
1.3.3 写入数据库
连接的数据库:sqlserver
python连接数据库使用的库为:pymssql
我目前为止直接去了四个值存入数据库:commentid,content,opername,uservip_degree
import pymssql #导入库
connect = pymssql.connect('localhost', 'sa', '**', 'danmu') # 服务器名,账户,密码,数据库名
cs1=connect.cursor() #获取cursor对象
#因为需要根据response的内容进行补全valuse中的值,需要使用%s
query='INSERT INTO danmu_IF (commentid,content,opername,uservip_degree) VALUES(%s,%s,%s,%s)'
接下来的我们需要对json文件进行逐行读取,然后再加入数据库中,因此真正构建sql的insert语句需要放在json的for循环中。
1.3.4 json类型循环逐行读取
for danmu_1 in danmu["comments"]:
commentid=danmu_1["commentid"]
content=danmu_1["content"]
opername=danmu_1["opername"]
#valus值构成
values=(commentid,content,opername,uservip_degree)
#生成sql语句
cs1.execute(query,values)
#提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
connect.commit()
1.3.5 关闭sql语句
# 关闭cursor对象
cs1.close()
# 关闭connection对象
conn.close()
结果展示:
一共是截取到了33517个弹幕,出现的情况:
1.运行过程中有发现sql数据库的报错,怀疑可能的原因是因为弹幕中存在着不可识别的字符。
2.发现关闭spider的时间会稍稍比yield生成器生成的慢一些些。怀疑是因为线程的原因。
不过,不论如何,企鹅弹幕爬取就先告一段落啦。接下来就是弹幕云的制作了,继续摸索吧。革命尚未成功,同志仍需努力啊哭唧唧。
备注一下今天用到的sql语句,真的是本科毕业之后就再也没用过sql了,研究生的论文为了少配置环境直接用了文本存储信息,为了CDA拼了老命害。
/*删除表中的所有信息,且不做单独操作*/
TRUNCATE TABLE danmu_IF
/*返回top100的内容*/
SELECT TOP (100) [commentid]
,[content]
,[opername]
,[uservip_degree]
FROM [danmu].[dbo].[danmu_IF]
Reference:
巨人1的肩膀