这只爬虫的由来
学英语,备战CET6。
想学点好玩的、有意思的英语文章。
而且,想用博客记录一下TED学习笔记。
但又不想做一些机械操作——比如:
- 复制粘贴视频英语/中文脚本(transcript)。
- 给博客设置一级标题、二级标题等
…
我拍一拍脖子之上:
“要不就写个爬虫,生成MarkDown文件,直接用代码完成一些机械的博客内容!”
说干就干!
先看效果
文件结构:
MarkDown模板
生成的MarkDown文件
大致思路
思路很简单:
口水话讲一下吧:
- 抓入口视频URL,提取视频id,
- 用视频id和语言参数,生成新的url,获取json文件,
- 然后解析json文件,导出markdown文件。
上代码之前
我的Python环境:
Python 解释器版本: 3.9.1
Python IDE: Pycharm
用到的第三方库:
json
os
time
requests
BeautifulSoup
logging
re
主要用到的知识
- python 面向对象
- python 生成器 (yield)
- 模块化编程
- 字符串填充
- 用到的库的知识
…
算了,反正很好学
上代码
这里的入口URL:
https://www.ted.com/talks/bill_gates_the_next_outbreak_we_re_not_ready
爬虫代码
# encoding: utf-8
# @time : 2021-08-26 12:28:00
# @file : ted_spider.py
# @software : {
# @author : m0_46156900
# blog : https://blog.csdn.net/m0_46156900
# 导入库
import json
import os
import time
import requests
from bs4 import BeautifulSoup
import logging as log
import re
from MD_TEMPlATE import md_template
class WriteMD:
ua = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}
languages = {
'English': 'en',
'Chinese_simplified': 'zh-cn',
'Chinese_cantonese': 'zh',
'Chinese_tradition': 'zh-tw'
}
transript_api = 'https://www.ted.com/talks/{0}/transcript.json?language={1}' # ted talk transcript api
def __init__(self, entry_url):
log.basicConfig(level=log.INFO)
if not os.path.isdir('./TranscriptJsonFile'):
os.mkdir(path='./TranscriptJsonFile')
if not os.path.isdir('./MarkdownFile'):
os.mkdir(path='./MarkdownFile')
self.title = None
self.JsonFile = None
self.entry_url = entry_url
self.entry_resp = self.request(url=self.entry_url)
self.talkID = None
def request(self, url):
retry = 5
while retry:
log.info('进行第%d次访问:%s' % (6-retry,url))
try:
resp = requests.get(url=url, headers=self.ua,timeout=30) # 设置超时,这个TED网站可能需要多访问几次
resp.raise_for_status()
log.info('页面抓取成功!')
return resp.text
except Exception as e:
log.error("访问网页失败!,错误:\n %s" %(e))
retry -= 1
def getTranscriptJson(self, language='en'): # 默认用英文
soup = BeautifulSoup(self.entry_resp, 'html.parser')
self.title = soup.select_one('title').text # 形如:Bill Gates: The next outbreak? We're not ready | TED Talk
self.JsonFile = '_'.join(re.findall("[a-z,A-Z]+", self.title))+language.replace('-','_')+'.json' # '_'.join(re.split("['" "|:?!*-]",title))
talkID=re.findall("'set', 'dimension2', '\d+'",self.entry_resp)[0]
self.talkID=re.findall('\d+', talkID)[-1]
json_url=WriteMD.transript_api.format(self.talkID, language)
with open(f'./TranscriptJsonFile/{self.JsonFile}', 'w', encoding='utf-8') as f:
f.write(self.request(url=json_url))
f.close()
log.info('文件保存成功!: %s' % self.JsonFile)
def writeMarkDown(self):
js_eng = json.loads(open(f'./TranscriptJsonFile/{self.JsonFile}').read())
engScript='### '.join(self.parseCuesTime(js_eng))
self.getTranscriptJson(language=WriteMD.languages['Chinese_simplified'])
js_zh_cn = json.loads(open(f'./TranscriptJsonFile/{self.JsonFile}',encoding='utf-8').read())
zh_cnScript = '### '.join(self.parseCuesTime(js_zh_cn))
extListening = 'generated by python script'
abstract='generated by python script'
md = md_template.format(self.title,self.entry_url,extListening,engScript,zh_cnScript,abstract)
mdFile = self.JsonFile.replace(".json",".md")
with open(f'./MarkdownFile/{mdFile}', 'w',encoding='utf-8') as f:
f.write(md)
f.close()
log.info('文件保存成功!: %s' % mdFile)
@staticmethod
def parseCuesTime(jsonFile):
for parph in jsonFile['paragraphs']:
parph_cues_sec = parph['cues'][-1]['time']/1000
parph_text = ''
for cues_text in parph['cues']:
parph_text+=cues_text['text']+' '
parph_text+='\n'
item = time.strftime("%M:%S", time.localtime(parph_cues_sec))+'\n'+parph_text
yield item
def main():
Wmd = WriteMD(entry_url='https://www.ted.com/talks/bill_gates_the_next_outbreak_we_re_not_ready')
Wmd.getTranscriptJson()
Wmd.writeMarkDown()
if __name__ == '__main__':
main()
MarkDown模板
# encoding: utf-8
# @time : 2021-08-26 14:17:00
# @file : md_template.py
# @software : {
# @author : m0_46156900
# blog : https://blog.csdn.net/m0_46156900
md_template='''
@[toc](目录有点长)
# TED Talk URL for This Video:
[{0}]({1})
# Extensive Listening
{2}
## English Script
{3}
## Chinese script
{4}
___
# My Abstract
{5}
# Footnote
'''
想再进一步封装代码, 做一个python脚本,用cmd命令就能执行的那种。
最后:
文明爬虫,好自为之。