爬取爱奇艺VIP电影
- 获取要爬取的电影链接--决战中途岛
- 将电影链接放在http://jx.618g.com/?url=后,打开该网页。--决战中途岛
- 打开网页的检查(F12),在Network下的Head里找Request URL: https://youku.cdn7-okzy.com/20200111/16621_33e37e94/1000k/hls/9daac15b8f3000016.ts
- 然后就可以在python中开始写代码了
import requests
# 因为.ts文件就是视频的解码,一个ts文件就有几秒画面,所有一部视频可能有1000多个ts文件,所以在这里遍历循环下载ts文件
for i in range(20):
url = "https://youku.cdn7-okzy.com/20200111/16621_33e37e94/1000k/hls/9daac15b8f300%04d.ts" % i
print(url)
r = requests.get(url)
ret = r.content
# 将ts文件保存到文件夹里
with open('./video/{}'.format(url[-10:]), 'wb') as f:
f.write(ret)
运行程序后会得到如下结果:
下一步我们就要把这些ts文件给合并成一个MP4文件,打开cmd,起换目录到video目录下,然后输入copy /b *.ts 决战中途岛.mp4,如下图所示:
![cmd下合并ts文件]打开文件夹后就可以看到合并成了一个决战中途岛.mp4的文件了
总结
- 此方法可用于多平台的VIP电影
- ts文件有许多,所以下载文件可能很慢,这个时候可以用多线程来解决下载速度了
#encoding utf-8
import requests
from queue import Queue
import threading
# 创建线程 生产者负责获取URL,并且解析URL
class Procuder(threading.Thread):
headers = {
'user-agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)'
'Chrome/76.0.3809.132 Safari/537.36'
}
def __init__(self, num_queue, ts_queue, *args, **kwargs):
super(Procuder, self).__init__(*args, **kwargs)
self.num_queue = num_queue
self.ts_queue = ts_queue
def run(self):
while True:
if self.num_queue.empty():
# 如果队列为空就,线程执行完成,跳出死循环,结束run
break
url = self.num_queue.get()
self.download_ts(url)
def download_ts(self, url):
r = requests.get(url)
ret = r.content
filename = url[-10:]
self.ts_queue.put((ret, filename))
# 创建线程 消费者 负责下载
class Consumer(threading.Thread):
def __init__(self, num_queue, ts_queue, *args, **kwargs):
super(Consumer, self).__init__(*args, **kwargs)
self.num_queue = num_queue
self.ts_queue = ts_queue
def run(self):
while True:
if self.ts_queue.empty() and self.num_queue.empty():
# 如果队列为空就,线程执行完成,跳出死循环,结束run
break
ret, filename = self.ts_queue.get()
# 将ts文件保存到文件夹里
with open('./video/{}'.format(filename), 'wb') as f:
f.write(ret)
print(filename + ' 下载完成!')
def main():
# 定义线程
num_queue = Queue(2000)
ts_queue =Queue(5000)
for i in range(1000):
url = "https://youku.cdn7-okzy.com/20200111/16621_33e37e94/1000k/hls/9daac15b8f300%04d.ts" % i
num_queue.put(url)
# 定义5个生产者
for x in range(100):
t = Procuder(num_queue, ts_queue)
t.start()
# 定义5个消费者
for x in range(100):
t = Consumer(num_queue, ts_queue)
t.start()
if __name__ == '__main__':
main()