zoukankan      html  css  js  c++  java
  • TED-WordCloud: 4000+视频标题词云分析

    这是一次爬虫尝试,涵盖TED到目前为止共4000+视频标题的提取,结果以文本格式存储,然后使用wordcloud词云库,生成可视化的云图。

    TED演讲是啥?

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

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

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

    具体实现步骤

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

    from requests_html import HTMLSession
    import threading #多进程
    import time
    import _thread
    
    base_url = 'https://www.ted.com/talks?page='
    session = HTMLSession()
    
    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 page_num():
        url = 'https://www.ted.com/talks'
        r = session.get(url, headers=headers)
        res = r.html.find('a.pagination__item.pagination__link')
        num = []
        for x in res:
            num.append(x.text)
        return num[-1]
    
    
    def get_title(i):
        global id #在函数内部修改全局变量的值,要先用global声明全局变量。
        url = base_url + str(i)
        #print(url)
        r = session.get(url, headers=headers)
        #r.html.render(scrolldown=3, sleep=0.01)  #下拉3次,这里函数不能用在多线程中
        titles = r.html.find('h4 a.ga-link')
        with open('titles.txt', 'a', encoding="utf-8") as f:  #使用utf-8编码
            for title in enumerate(titles):
                s = f'{title.text}'
                print(s)
                f.write(s + '
    ')
    
    
    def main():
        total_page = int(page_num())
        print(f'总共有{total_page} 页')
        threads = []    #进程列表
        for i in range(1, total_page+1):
            #get_title(str(i))
            t = threading.Thread(target=get_title,args=(i,))  #每个页面启动一个新的线程
            #t.start()   #也可以在这里直接start
            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))

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

    第二步:词云生成

    from wordcloud import WordCloud
    
    f = open(u'titles.txt','r', encoding="utf-8").read()
    wordcloud = WordCloud(background_color="white",width=1000, height=860, margin=2).generate(f)
    wordcloud.to_file('titles.png')

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

    总结

    虽然完整的完成了功能,但是没有使用正则查找(借助了requests_html库),也没能实现进度条。

    参考链接:https://baiyue.one/archives/1526.html

  • 相关阅读:
    数据库索引学习
    JavaScript提高:002:ASP.NET使用easy UI实现tab效果
    jQuery效果之显示与隐藏
    leetcode
    走进Struts2(五)— 值栈和OGNL
    Html中的超链接
    再理解 as3.0接口
    easyui combobox 三级级联 input 两种实现
    三层登录实例VB.NET版具体解释---理论加实战篇
    如何用Delphi开发网游外挂
  • 原文地址:https://www.cnblogs.com/lfri/p/12199901.html
Copyright © 2011-2022 走看看