//20200115

最近在看“咱们裸熊——we bears”第一季和第三季都看完了,单单就第二季死活找不到,只有腾讯有资源,但是要vip……而且还是国语版……所以就瞄上了一个视频网站——可以在线观看(好的动漫喜欢收藏,就想着下载,第一季第三季都找到了资源,甚至第四季都有,就没有第二季……)

最近又正好在学python(为大数据打基础),就想着爬取视频,下面说说流程:

首先F12检查,先看看是否是直接嵌入链接(以防真的有笨笨的web主~),然后发现没有

然后就开始点开Networks检查抓包,发现有后缀为.m3u8的链接,就点开看了——有两层,第二层是一大堆格式化数据

然后再看剩下的包,都是.ts文件,再以.ts文件链接比对第二个m3u8包里的东西,发现正好对应,只是要拼接字符串获取真实链接,确认了思路之后就开始上手了(只是基础爬取,还未用到线程——其实用线程池技术可以更快,毕竟ts文件很多,也未用到代理,因为数据量还不算大,而且有手动限时)

理一下思路:

先从视频播放界面源码中获取每一集的链接,存在列表里备用(这个是显示的)---->然后获取每一个链接对应网址的源码——里边儿有一个ckplayer的div块,里边儿有第一层m3u8的链接 ----> 用beautifulSoup获取到这个链接(这个链接返回的是一个json,用json包转格式获取到第一层链接) -----> 访问这个链接获取到第二个m3u8链接(其中要拼接字符串)----->然后访问第二个链接获取到ts视频地址信息(也要拼接字符串——拼接完成后存储到列表中备用)----->使用文件输出流将ts文件下载并存在对应文件夹内

接下来就是等待了,等它下完,因为文件很细碎,所以耗时很久……可以考虑使用线程池改进(等我把大数据基础学完了再说,不急)

然后在每一个ts文件夹中用windows命令copy/b *.ts video.mp4将ts文件合并为mp4文件——可以嵌入到python代码中,不过我没有bat基础,就直接手动了,也不会太困难(大功告成!)

下面上源码:

source code:

#20200115

importrequestsimportjsonimporttimefrom bs4 importBeautifulSoup

headers= {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'}

location= 'https://www.****.cc'mid= "/1000k/hls"last= "/index.m3u8"url_pool= ['/dianshiju/20740/player-1-1.html','/dianshiju/20740/player-1-2.html','/dianshiju/20740/player-1-3.html','/dianshiju/20740/player-1-4.html','/dianshiju/20740/player-1-5.html','/dianshiju/20740/player-1-6.html','/dianshiju/20740/player-1-7.html','/dianshiju/20740/player-1-8.html','/dianshiju/20740/player-1-9.html','/dianshiju/20740/player-1-10.html','/dianshiju/20740/player-1-11.html','/dianshiju/20740/player-1-12.html','/dianshiju/20740/player-1-13.html','/dianshiju/20740/player-1-14.html','/dianshiju/20740/player-1-15.html','/dianshiju/20740/player-1-16.html','/dianshiju/20740/player-1-17.html','/dianshiju/20740/player-1-18.html','/dianshiju/20740/player-1-19.html','/dianshiju/20740/player-1-20.html','/dianshiju/20740/player-1-21.html','/dianshiju/20740/player-1-22.html']

len1=len(url_pool)defget_json_url(soup):

url= soup.find("div",id = "iFrame_play").script.get('src')return location +urldefget_first_url(json_url):

r2= requests.get(json_url,headers = headers,timeout = 10).text

dic= json.loads(r2[r2.find('{'):r2.find('}')+1])return dic['url']defget_real_m3u8_url(url):

index_of_last= url.rfind('/')

the_forward=url[:index_of_last]return the_forward +middefget_the_ts_pack(url):

r3= requests.get(url,headers = headers,timeout = 10).text

list_of_ts= r3.split('#')returnlist_of_tsdefget_each_ts_url(the_ts_pack,the_real_m38u_url):

len2=len(the_ts_pack)for i inrange(0,len2):

suffix= the_ts_pack[i].split('\n')[1]

the_ts_pack[i]= the_real_m38u_url + "/" +suffix#return the_ts_pack

defmission(url,n,group):print('*****')

response=requests.get(url,headers=headers,timeout = 10)print('-----')

f=open("./"+str(group)+"/%03d.ts"%n,"wb")

f.write(response.content)

f.close()print("%03d.ts OK..."%n)defdownload(the_ts_pack,group):

len3=len(the_ts_pack)

count=0

i= -1

while i != len3-1:try:

i+=1mission(the_ts_pack[i],i,group)except(requests.exceptions.ConnectionError,requests.exceptions.ReadTimeout):

count+=1

print("第"+str(count)+"次等待")

time.sleep(5)

i-=1

else:

count=0

time.sleep(0.5)#for i in range(0,len1):

for i in range(12,22):

completed_link= location +url_pool[i]

r1= requests.get(completed_link,headers=headers,timeout = 10)

soup= BeautifulSoup(r1.text,"lxml")

json_url=get_json_url(soup)

time.sleep(0.1)

the_first_mu38_url=get_first_url(json_url)

time.sleep(0.1)

the_real_m38u_url=get_real_m3u8_url(the_first_mu38_url)

the_ts_pack= get_the_ts_pack(the_real_m38u_url + last)[5:-1]

get_each_ts_url(the_ts_pack,the_real_m38u_url)print(the_ts_pack)

download(the_ts_pack,i)print("第" + str(i) + "组ts视频已经下载完成")

time.sleep(10)#

##list1 = str1.rfind('/')#str2 = str1[:list1]#print(str2)

#for i in range()

#for each in url_pool:#print(each)

#

#for n in range(1,167):#mission(link + str(8000+n)+".ts",n)#dic = {'%3A':':','%2F':"/"}#str1 = str1.replace('%3A',':')#str1 = str1.replace('%2F','/')#print(str1)

#

# #r = requests.get(link,headers = headers,timeout = 10)#text = r.text#print(text)

#

注:因为视频有版权,网站地址就不放出来了,重要的是思路,每个网站都不一样,都要重新分析

侵删!

关于python异常机制:

1.try-except代码块,就是如果有异常就执行except里的代码,然后如果有循环就跳过这一次(显然不符合要求,因为要下齐资源,所以要用到2)

2.try-except-else代码块,如果有异常,就执行except内代码,如果没有,执行完try中代码后,继续执行else中代码

另:except后跟的异常,可以是一个也可以是多个(多个使用“(..,..,..)”这种格式,不知道啥异常可以直接用Exception)

因为代码执行过程中,服务器有的时候会返回不了信息,就要异常来处理,不然每次都手动怎么称得上自动化呢~

希望对大家有所帮助

以上

python合并大量ts文件_python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及一些异常的注意事项)...相关推荐

  1. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  2. python网络爬虫网易云音乐下载_python网络爬虫爬取网易云音乐

    #爬取网易云音乐 url="https://music.163.com/discover/toplist" #歌单连接地址 url2 = 'http://music.163.com ...

  3. python爬取率_Python实现爬虫爬取NBA数据功能示例

    本文实例讲述了Python实现爬虫爬取NBA数据功能.分享给大家供大家参考,具体如下: 爬取的网站为:stat-nba.com,这里爬取的是NBA2016-2017赛季常规赛至2017年1月7日的数据 ...

  4. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页

    目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...

  5. python多线程爬虫 爬取多个网页_python多线程爬虫爬取顶点小说内容(BeautifulSoup+urllib)...

    思路 之前写过python爬取起点中文网小说,多线程则是先把爬取的章节链接存到一个列表里,然后写一个函数get_text每次调用这个函数就传一个章节链接,那么就需要调用n次该函数来获取n章的内容,所以 ...

  6. python爬取页面内容由京东提_python制作爬虫爬取京东商品评论教程

    本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...

  7. python爬虫爬取微信网页_python下爬虫爬取微信公众号文章给网站的相关操作与问题...

    一.出发点 在dodo团队知乎号开刊文章中已介绍过本团队平常的实际工作,我们是一个从事游戏与金融结合的项目开发与运营团队.技术上主要是从事游戏分期.玩后付支付插件.游戏充值app等前后端开发,主要使用 ...

  8. python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...

    学习前提1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 1.引入库 爬取网站视频需要引入的第三方库: impor ...

  9. python外国网站爬虫_python 网络爬虫-爬取网页外部网站

    前言 上一篇中我们在维基百科的内部网站上随机跳转进入文章类网页,而忽视外部网站链接.本篇文章将处理网站的外部链接并试图收集一些网站数据.和单个域名网站爬取不同,不同域名的网站结构千差万别,这就意味我们 ...

  10. python爬虫爬取豆瓣电影排行榜,并写进csv文件,可视化数据分析

    #1.爬取内容,写进csv文件 import requests import re import csv #豆瓣电影排行榜,写进csv文件 url = "https://movie.doub ...

最新文章

  1. Ext JS Designer 1.0.5 发布
  2. 编写实现atoi函数
  3. [linux] 线程和wait命令,sleep命令
  4. Apex Integration Overview
  5. Qt 模式视图框架解读之委托
  6. html首页 slider图片切换效果,jQuery插件Slider Revolution实现响应动画滑动图片切换效果...
  7. (JAVA)Calender类
  8. 将表数据生成SQL脚本的存储过程和工具
  9. [Web Chart系列之五] 1. 实战draw2d 之总体介绍
  10. 外链应该这样发,网站排名速度提升十陪
  11. mosaic数据增强_YoloV4当中的Mosaic数据增强方法(附代码详细讲解)
  12. lvm快照备份mysql
  13. 计算机多媒体技术的内容有哪些方面,多媒体技术是什么_多媒体技术知识点总结...
  14. Redis集群:./redis-trib.rb:24:in `require': no such file to load -- rubygems
  15. 一个完整的HTTP请求过程详细
  16. js获取当前时间 年月日 分秒
  17. androidP 对反射的限制之黑名单机制
  18. linux ctex缺少字体,LaTeX .sty文件缺失解决办法
  19. 云呐:2022学校固定资产盘点,学校RFID固定资产盘点计划方案
  20. Direct2D学习方法

热门文章

  1. 在开发人力资源管理 HRM 系统?试试低代码
  2. mybatis返回map键值对_Mybatis结果生成键值对
  3. Bex5文档服务器,不通过登录直接打开BeX5的首页和功能页的url是什么?
  4. 【概率论与数理统计】1.1 随机事件及其运算
  5. Cboard框架搭建及使用
  6. Prelude CC 2019 for Mac附激活补丁 v8.1.0中文版
  7. NMEA的GPGGA数据包解析 字符转数字
  8. MXY-单点登陆系统
  9. Hadoop 入门笔记
  10. uTorrent任务栏的种子状态一直是“找不到元素”