python爬虫下载视频

这两天在追某部剧,为了方便看,写个了python爬虫下载。

网站基于m3u8格式视频,一个视频分好几百个ts文件。类似于这样的:


ts文件列表

我们的目标就是批量下载这些ts文件,然后合成一个大的ts视频文件。现在让我们开始!

初始条件

  1. 网站地址
  2. python环境
  3. 缺乏能够code控制的下载工具
  4. 缺乏爬虫将下载链接爬取下来

下载环境

首先找到一个能够python代码调起来下载的工具aria2,发现还是比较好用的。下载一下它的exe文件,然后从网上抄下来一份配置文件。如下:

#允许rpc
enable-rpc=true
#允许非外部访问
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
rpc-listen-port=6800

#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=32
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=16
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=256
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0

#文件保存路径, 默认为当前启动位置
#dir="./"
#使用代理
# all-proxy=localhost:1080
#添加引用页
referer=http://images.dmzj.com/

然后通过bat脚本启动该下载工具服务,进行下载调用监听。

start C:\Users\admin\Desktop\download\aria2-1.35.0-win-64bit-build1\aria2c --conf-path=C:\Users\admin\Desktop\download\aria2.conf
pause

此时,我们的下载环境就准备好了。接下来准备python爬虫脚本。

分析过程

  1. 网站的视频是一个iframe套着一个iframe,然后再套着一个iframe,并且这些iframe都是通过js进行动态加载的。


    三层iframe
  2. 发现最后一个iframe是一个网址地址,这个才是真正的视频地址。
  3. 直接打开视频地址,发现是可以播放视频的,没问题。看看network请求了什么。


    视频资源
  4. 这里看到我们要的资源就是这些ts了。
    网上了解下m3u8,详细的解释:m3u8 文件格式详解

爬虫脚本功能

  1. 获取视频地址
  2. 获取m3u8地址
  3. 获取各个ts文件地址
  4. 通过下载服务进行下载
  5. 合并ts文件
  6. 转为mp4

获取视频地址

动态的iframe加载无法直接通过urllib进行html获取,只能试试selenium,搞了半天switch_to_frame发现贼难用,不知道怎么搞了,先pass。还是学艺不精。

获取m3u8地址

发现该地址https://txxs.mahua-yongjiu.com/20191221/8556_b31334a2/1000k/hls/index.m3u8和页面里面一段js代码有关系,从这里可以搞到地址。

m3u8地址相关的js代码

这里通过pyquery获取script节点的text,然后通过正则进行匹配main变量,正则很烂~~

获取ts文件地址

首先看下ts文件地址,分析下https://txxs.mahua-yongjiu.com/20191221/8556_b31334a2/1000k/hls/2de4925e786000001.ts。首先域名一致,然后是部分路由一致20191221/8556_b31334a2,这里发现1000k/hls是写死的,那这里唯一变化的就是最后的ts文件名了。在m3u8文件中,有所有ts文件的目录列表,如下:

m3u8文件内容

解析一下,就可以用了。

通过下载服务进行下载

通过服务调用进行下载,这里aria2调用的方式很多,就不赘述了。

合并ts文件

copy /b E:\*.ts E:\all.ts

转为mp4

格式工厂

上代码

最后还是没把第一个获取视频地址解决了,只能手工一下,没办法...

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import json
from urllib.request import urlopen
from pyquery import PyQuery as pq
import requests
import urllib3
# from selenium import webdriver 
# from selenium.common.exceptions import NoSuchElementException
import re
import os
urllib3.disable_warnings()
filepath="C:/Users/admin/Desktop/download/dist"
urlList=[
    {"js":"28", "host":"https://yingxiong.qiling-yongjiu.com", "path":"/share/xxxxx"}
]

def download(url, filepath):
    jsonreq = json.dumps([{'jsonrpc': '2.0', 'id': 'sdfg',
                              'method': 'aria2.addUri',
                              'params': [[url],{'refer': url,'dir':filepath}],
                              }]).encode()
    c = urlopen('http://localhost:6800/jsonrpc', jsonreq)

def getm3u8url(urlobj):
    doc=pq(requests.get(urlobj["host"]+urlobj["path"],params={},verify=False).text)
    text=doc('script[type^="text/javascript"]').text()
    textarr=text.split("var")

    mainPathText=list(filter(lambda item: len(re.compile(r'main.*').findall(item)) > 0, textarr))[0]
    pattern = re.compile(r'\".*\"')
    mainPathText=pattern.findall(mainPathText)[0]

    # https://txxs.mahua-yongjiu.com/20191219/8387_628492df/1000k/hls/index.m3u8
    mainPath=mainPathText.replace("\"","").replace("index", "1000k/hls/index")
    mainUrl=urlobj["host"]+mainPath

    return mainUrl

def getResourcesUrlList(urlobj, mainUrl):
    mainData=requests.get(mainUrl,params={},verify=False).text
    pattern = re.compile(r'.*\.ts')
    tslist = pattern.findall(mainData)
    # https://txxs.mahua-yongjiu.com/20191219/8387_628492df/1000k/hls/4a6c5f245f4000017.ts
    return list(map(lambda s:mainUrl.replace("index.m3u8", s), tslist))

urlObj = urlList[18]
os.makedirs(filepath+"/"+urlObj["js"])

mainUrl=getm3u8url(urlObj)
print(mainUrl)

resourcesUrlList=getResourcesUrlList(urlObj, mainUrl)
print(resourcesUrlList)

for item in resourcesUrlList:
     download(item, filepath+"/"+urlObj["js"])

OVER

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342