爬虫,日志,正则,递归,异常捕捉,线程池
1,准备电影网站
2,分析视频url链接 (起始url,终止url)
3,准备代码,下载至文件(关键)
import requests
import logging
import re
url = 'https://vip2.pp63.org/201903/21/Gp91Gn2m/600kb/hls/' # 【根据url修改】
def download(name):
str_name = str(name)
if len(str_name) == 1: # 【根据url修改】
str_name = '00' + str_name
elif len(str_name) == 2: # 【根据url修改】
str_name = '0' + str_name
print(str_name)
file_name = "1QIyv1Kg3296" + str_name + '.ts' # 【根据url修改】
print(url + file_name)
try:
res = requests.get(url=url + file_name, timeout=15)
content = res.content
with open(r'C:\Users\admin\Desktop\电影\%s' % file_name, 'wb')as f:
f.write(content)
print(file_name + '\x1b[1;30;42m 下载成功 \033[0m')
num = name // 20
print(file_name + '下载完成,' + '已下载' + ' %s %% %s' % (name / 11, '>' * num)) # 【假的进度条,能看个大概,根据url修改】
except Exception as e:
# 报错提示
print(file_name + '\x1b[1;30;41m 下载失败 \033[0m')
print(e)
name = re.findall('1QIyv1Kg3296(\d+).ts', file_name)[0] # 【根据url修改】
print(name + ' 下载失败')
# 记录日志
my_log = logging.getLogger('lo')
my_log.setLevel(logging.DEBUG)
file = logging.FileHandler('error.log', encoding='utf-8')
file.setLevel(logging.ERROR)
my_log_fmt = logging.Formatter('%(asctime)s-%(levelname)s:%(message)s')
file.setFormatter(my_log_fmt)
my_log.addHandler(file)
my_log.error(file_name + ' 下载失败 ')
my_log.error(e)
# 重新下载
download(int(name)) # 如果报错,递归执行一遍
from concurrent.futures import ThreadPoolExecutor # 线程池
p = ThreadPoolExecutor(8)
for name in range(1, 1101): # 【根据url修改】
p.submit(download, name)
# 功能:失败提示,失败重试,失败记录日志,线程池提高并发,超时重试。
4,合并,即可观看
打开cmd
,切进目录
,执行copy /b *.ts video.ts
合并速度超快。