• 欢迎访问佰阅部落
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

TED-WordCloud: 4000+视频标题词云分析(含源码及结果)

数据可视化 佰阅 3年前 (2020-01-07) 2985次浏览 0个评论

本脚本是在最近复习python程序时,做的一次尝试,涵盖TED到目前位置共40000+视频标题的提取,结果以文本格式存储,然后使用wordcloud词云库,生成可视化的云图。

TED-WordCloud: 4000+视频标题词云分析(含源码及结果)

0. TED演讲是啥?

官网地址:https://www.ted.com/

TED(指technology, entertainment, design在英语中的缩写,即技术、娱乐、设计)是美国的一家私有非营利机构,该机构以它组织的TED大会著称,这个会议的宗旨是“值得传播的创意”。

这个演讲主要集中在用思想的力量来改变世界。如今已经累积有4000多条视频,每位讲述者或令人印象深刻、或激情拍好、或感人心灵。算是当下世界共享mooc学习的先锋,视频一般都会带上多国翻译字幕,既可以学习,又可以感知内容。

1. 为啥爬这个?

仅仅是复习python时,自我构想的一个实践过程。想了解下当今世界最值得传播的思想究竟有哪些关键词。已爬取结果存放至云盘了,有兴趣二次分析的,可以去看看。【云盘跳转】

2.具体实现步骤

第一步:爬取整站点视频标题,使用多线程,耗时5s即可完成

import requests
import re
import time
#import random
import threading #多进程


headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}

def tedspider(i):
    #base_url = 'https://www.ted.com'
    url = f'https://www.ted.com/talks?page={i}' #传入页数
    try:
        r = requests.get(url,headers=headers)
        if r.status_code == 200:
            # 获取每一页视频的所有名称
            video_names = re.findall(r'>\n(\w+.*?)\n</a>\n</h4>',r.text)
            return video_names
            #print(video_names)
        return None
    except:
        return None


def get_pages_num():
    base_rul = 'https://www.ted.com/talks'
    try:
        r = requests.get(base_rul,headers=headers)
        if r.status_code == 200:
            # 获取每一页视频的所有名称
            total = re.findall(r'>(\d+)</a>.*?>(\d+)</a>.*?>(\d+)</a>.*?>(\d+)</a>.*?>(\d+)</a>.*?>Next',r.text)    #结果以list [('2', '3', '4', '5', '118')]
            total_pages = int(total[0][-1])
            return total_pages
            #print(video_names)
        return None
    except:
        return None
    
    
def run(i):
    video_names = tedspider(i)   #启动爬虫获取单页所有视频标题。加repleace过滤&#39;为正常的标点符号[`]
    #print(type(video_names))
    for name in video_names:
        namerg = name.replace('&#39;','\'')  #加repleace过滤&#39;为正常的标点符号[`]
        save(namerg)    
    

def save(txtname):
    with open('ted.txt','a',encoding='utf8') as f:     #a 为追加写入;b为二进制模式; 
        f.write(txtname +'\n')
        f.close()
        print(f'{txtname}保存成功')

def main():
    total_page = get_pages_num()
    print(f'总共有{total_page} 页')
    threads = []    #444创建进程列表
    for i in range(1,total_page + 1):
        print(f'正在爬取第 {i} 页面,还剩 {total_page - i} 页')
        t = threading.Thread(target=run,args=(i,))  #增加进程
        threads.append(t)
        
    for t in threads:
        t.start()   #依次启动所有进程
        
    for t in threads:
        t.join()

if __name__ == '__main__':
    start = time.time()
    main()
    end = time.time()
    print(f'总共耗时:%d' %(end - start))

运行后,同级目录下生成ted.txt

第二步:词云生成

from wordcloud import WordCloud

f = open(u'ted.txt','r').read()
wordcloud = WordCloud(background_color="white",width=1000, height=860, margin=2).generate(f)

# width,height,margin可以设置图片属性

# generate 可以对全部文本进行自动分词,但是他对中文支持不好,对中文的分词处理请看我的下一篇文章
#wordcloud = WordCloud(font_path = r'D:\Fonts\simkai.ttf').generate(f)
# 你可以通过font_path参数来设置字体集

#background_color参数为设置背景颜色,默认颜色为黑色

import matplotlib.pyplot as plt
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

wordcloud.to_file('ted.png')

运行后,在同级目录生成ted.png

3.总结

从写脚本的角度而言,这次编写让我完整熟悉了正则表达式的用法、多线程,但是由于之前复习了一些类编成方法,写代码时会有一些混淆。从任务角度而言,也逐渐熟悉了步骤的拆分设计和独立运行。本次案例将所有的118页面做成独立的进程,因此采集数据就非常快了,如果单线程运行,我测试一分钟大概几十条记录,而多线程下只需5s就完成了4千多条记录。词云部分,由于暂不熟悉,因此采用默认的样式,实际上还可以生成图片背景的云图,这个后期再做尝试。

 


佰阅部落 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:TED-WordCloud: 4000+视频标题词云分析(含源码及结果)
喜欢 (0)

您必须 登录 才能发表评论!