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

//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
import requests
import json
import time
from bs4 import BeautifulSoup

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)

def get_json_url(soup):
    url = soup.find("div",id = "iFrame_play").script.get(‘src‘)
    return location + url 

def get_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‘]

def get_real_m3u8_url(url):
    index_of_last = url.rfind(‘/‘)
    the_forward = url[:index_of_last]
    return the_forward + mid

def get_the_ts_pack(url):
    r3 = requests.get(url,headers = headers,timeout = 10).text
    list_of_ts = r3.split(‘#‘)
    return list_of_ts

def get_each_ts_url(the_ts_pack,the_real_m38u_url):
    len2 = len(the_ts_pack)
    for i in range(0,len2):
        suffix = the_ts_pack[i].split(‘\n‘)[1]
        the_ts_pack[i] = the_real_m38u_url + "/" + suffix
    # return the_ts_pack
def mission(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)

def download(the_ts_pack,group):
    len3 = len(the_ts_pack)
    count = 0
    i = -1
    while i != len3-1:
        try:
            i+=1
            mission(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)

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

希望对大家有所帮助

以上

原文地址:https://www.cnblogs.com/lavender-pansy/p/12198998.html

时间: 2024-10-05 22:56:48

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

如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py文件.我们需要获取的数据是朋友圈和发布日期,因此在这里定义好日期和动态两个属性,如下图所示. 2.修改实现爬虫逻辑的主文件moment.py,首先要导入模块,尤其是要主要将items.py中的WeixinMomentItem类导入进来,这点要特别小心别被遗漏了.之后修改start_requests方

Python简易爬虫爬取百度贴吧图片

通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.request.urlopen(url) html=page.read() return html 说明: 向getHtml()函数传递一个网址,就可以把整个页面下载下来. urllib.request 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据. 二.筛选页面

python制作爬虫爬取京东商品评论教程

作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计图表,非常的细致,有需要的小伙伴可以参考下 本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D共18个尺寸,以及超过700条的购买评论. 京东商品评论信息是由JS动态加载的,所以直接抓取商品详

Python多线程爬虫爬取电影天堂资源

最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. 先来简单介绍一下,网络爬虫的基本实现原理吧.一个爬虫首先要给它一个起点,所以需要精心选取一些URL作为起点,然后我们的爬虫从这些起点出发,抓取并解析所抓取到的页面,将所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点.这样不断地循环,一直到获得你想得到的所有的信息爬虫的任务

Python 简单爬虫 爬取知乎神回复

看知乎的时候发现了一个 “如何正确地吐槽” 收藏夹,里面的一些神回复实在很搞笑,但是一页一页地看又有点麻烦,而且每次都要打开网页,于是想如果全部爬下来到一个文件里面,是不是看起来很爽,并且随时可以看到全部的,于是就开始动手了. 工具 1.Python 2.7 2.BeautifulSoup 分析网页 我们先来看看知乎上该网页的情况: 网址: ,容易看到,网址是有规律的,page慢慢递增,这样就能够实现全部爬取了. 再来看一下我们要爬取的内容: 我们要爬取两个内容:问题和回答,回答仅限于显示了全部

如何用Python网络爬虫爬取网易云音乐歌词

前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本地. 本文的目的是获取网易云音乐的歌词,并将歌词存入到本地文件.整体的效果图如下所示: 基于Python网易云音乐歌词爬取 赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示

Python 利用爬虫爬取网页内容 (div节点的疑惑)

最近在写爬虫的时候发现利用beautifulsoup解析网页html 利用解析结果片段为: <td valign="top"><div class="pl2"><a class="" href="https://movie.douban.com/subject/26588308/"> 死侍2 / <span style="font-size:13px;">DP

用Python写爬虫爬取58同城二手交易数据

爬了14W数据,存入Mongodb,用Charts库展示统计结果,这里展示一个示意 模块1 获取分类url列表 from bs4 import BeautifulSoup import requests,pymongo main_url = 'http://bj.58.com/sale.shtml' client = pymongo.MongoClient('localhost',27017) tc_58 = client['58tc'] tab_link_list = tc_58['link_

python用爬虫爬取一张图片

代码: import requestsresponse = requests.get('https://s1.hdslb.com/bfs/static/jinkela/video/asserts/33.png')with open('C:\\Users\\lingu\\Desktop\\1.png', 'wb') as f: f.write(response.content) f.close() 前提是先用pip install requests命令安装requests库 原文地址:https: