不想复制粘贴了,爬取TED视频的语言脚本

这只爬虫的由来

学英语,备战CET6。

想学点好玩的、有意思的英语文章。

而且,想用博客记录一下TED学习笔记。

但又不想做一些机械操作——比如:

  1. 复制粘贴视频英语/中文脚本(transcript)。
  2. 给博客设置一级标题、二级标题等

我拍一拍脖子之上:
“要不就写个爬虫,生成MarkDown文件,直接用代码完成一些机械的博客内容!”

说干就干!


先看效果

文件结构:

在这里插入图片描述

MarkDown模板

在这里插入图片描述

生成的MarkDown文件

在这里插入图片描述

大致思路

思路很简单:

入口视频URL
爬虫
获取视频id
抓取保存Json文件
导出MarkDown文件

口水话讲一下吧:

  1. 抓入口视频URL,提取视频id,
  2. 用视频id和语言参数,生成新的url,获取json文件,
  3. 然后解析json文件,导出markdown文件。

上代码之前

我的Python环境:

Python 解释器版本: 3.9.1
Python IDE: Pycharm
用到的第三方库:
	json
	os
	time
	requests
	BeautifulSoup
	logging
	re

主要用到的知识

  1. python 面向对象
  2. python 生成器 (yield)
  3. 模块化编程
  4. 字符串填充
  5. 用到的库的知识

算了,反正很好学


上代码

这里的入口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命令就能执行的那种。

最后:

在这里插入图片描述
文明爬虫,好自为之。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

adingable

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值