这是一次爬虫尝试,涵盖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库),也没能实现进度条。