介绍:
在自学爬虫时,一开始就是爬取一些文字(比如小说之类的),再后来变成了图片,再后来变成了视频…
其中最简单的就是对文字的爬取了,从文字过渡到图片也只是多了几行代码而已,但是: 从图片过渡到视频就要 分情况了。
分情况解释:
第一种情况: 链接明确是以 mp4、mkv、rmvb 这类视频格式后缀为结尾的链接,这种下载很简单,和图片下载的方法一样,就是视频文件要比图片大而已。
第二种情况: 另一种,链接是以 m3u8 这类以多个 ts 文件组成的链接。
ts文件 ? 链接: 百度知道。
然而,在进行爬取的过程中,你会发现:第二种情况又有两种呈现方式:
第一种: 网页源码中的链接直接以 m3u8 结尾,这类的链接,推荐使用 FFmpeg 进行下载。(注意该工具下载成功后需要配置环境变量才可以使用。)
使用方法:
import ffmpy3
ffmpy3.FFmpeg(inputs={
'http://***.m3u8': None}, outputs={
name+'.mp4':None}).run()
FFmpeg 可以帮你下载 m3u8 格式的视频,而且还能帮你自动转换为 mp4 的格式,并且不会出现拼接 ts 文件时乱序的情况。
第二种: 也是我今天着重说的一种情况。网页源码中并没有以 m3u8 格式结尾的链接。而是由在网页中直接请求并解析 ts 文件。
比如以下的视频网站:
分析及爬取:
我们就在当前网站爬取一个前段时间热播的动漫:《天气之子》 来演示用最为基础的 with open() 来爬取 ts 文件并合成为 mp4 格式的方法。
进入 天气之子 的主页,通过控制台我们需要构建一点简单的头文件来防止反爬: (主链接被我修改了,怕被和谐,这里主要分享的是方法。)
header = {
'origin': 'https://www.******.tv',
'referer': 'https://www.******.tv/py/lJWMpVmYqRWb_1.html?158064',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edg/81.0.416.72'
}
由于我曾经被拉进过网站的黑名单: 所以还是默默的写个代理 IP 吧。
不会写 IP代理 ? 链接: Python爬虫,自建IP地址池.
proxies = ['HTTP://110.243.30.23:9999', 'HTTP://222.189.191.206:9999', 'HTTP://118.212.104.138:9999',
'HTTP://182.149.83.97:9999', 'HTTP://106.42.163.100:9999', 'HTTP://120.83.107.69:9999',
'HTTP://60.13.42.135:9999', 'HTTP://60.205.188.24:3128', 'HTTP://113.195.232.23:9999',
'HTTP://59.62.36.74:9000', 'HTTP://218.2.226.42:80']
proxy = {
'HTTP': random.choice(proxies)} #随机选取一个IP
通过点击每一个 ts 文件,我们发现,对于每一个 ts 文件的请求地址都差不多:具体为:
https://*****/20200508/19312_c9d456ff/1000k/hls/d3276cb180400(****).ts
括号中的 * 代表数字,如: 0001、0002、0003…9999
通过拉动进度条可以快速地查看,最大的数字为 1613。
我们来试着请求 一下某段 ts 文件:
import os
import requests
import random
header = {
'origin': 'https://www.pianku.tv',
'referer': 'https://www.pianku.tv/py/lJWMpVmYqRWb_1.html?158064',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edg/81.0.416.72'
}
proxies = ['HTTP://110.243.30.23:9999', 'HTTP://222.189.191.206:9999', 'HTTP://118.212.104.138:9999',
'HTTP://182.149.83.97:9999', 'HTTP://106.42.163.100:9999', 'HTTP://120.83.107.69:9999',
'HTTP://60.13.42.135:9999', 'HTTP://60.205.188.24:3128', 'HTTP://113.195.232.23:9999',
'HTTP://59.62.36.74:9000', 'HTTP://218.2.226.42:80']
proxy = {
'HTTP': random.choice(proxies)}
print(proxy)
path = './Spider/'