本脚本是在最近复习python
程序时,做的一次尝试,涵盖TED到目前位置共40000+
视频标题的提取,结果以文本格式存储,然后使用wordcloud
词云库,生成可视化的云图。
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过滤'为正常的标点符号[`]
#print(type(video_names))
for name in video_names:
namerg = name.replace(''','\'') #加repleace过滤'为正常的标点符号[`]
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千多条记录。词云部分,由于暂不熟悉,因此采用默认的样式,实际上还可以生成图片背景的云图,这个后期再做尝试。