前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python爬取最爱的电影并下载到本地(附源码)

Python爬取最爱的电影并下载到本地(附源码)

作者头像
Python研究者
发布2020-11-24 15:23:03
5.7K0
发布2020-11-24 15:23:03
举报
文章被收录于专栏:Python研究者

小说、图片、小视频都弄了,今天就下载电影或者电视剧吧,目标网站:https://www.okzyw.com/

首先进入搜索页面:https://www.okzyw.com/index.php?m=vod-search 搜索自己喜爱的剧(比如我就喜欢西部世界^ _ ^)

进入Network查看发现是POST请求:

我把数据也截下来了,直接上代码就行:

代码语言:javascript
复制
import requests
import parsel,os
from ffmpy3 import FFmpeg
from concurrent.futures import ThreadPoolExecutor as pool


headers ={
    'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
}

wd = "西部世界第一季"
params = {
    'wd': wd,
    'submit': 'search',
}
target = 'http://www.okzyw.com'
url = 'https://www.okzyw.com/index.php?m=vod-search'

html = requests.get(url,params=params,headers=headers).text

res = parsel.Selector(html)
for each in res.xpath('//div[@class="xing_vb"]/ul[2]/li'):
    link = target + each.xpath('./span[2]/a/@href').get()
    print(link)
    

内容页拿到:

代码语言:javascript
复制
output:
http://www.okzyw.com/?m=vod-detail-id-12790.html

进入内容页后我们需要将电影标题作为文件夹,免得后面会乱:

代码语言:javascript
复制
html = requests.get(link).text
res = parsel.Selector(html)
# 获取电影标题做文件夹
title = res.xpath('//div[@class="vodh"]/h2/text()').get()

# 创建文件夹
if title not in os.listdir("./"):
     os.mkdir(title)

里面有两种格式,我们选择m3u8格式的:

因为是静态网页,我就直接上代码了:

代码语言:javascript
复制
    for each in res.xpath('//div[@id="2"]/ul/li'):
        # 获取集数
        num = each.xpath('./text()').get().split("$")[0]

        # 获取每一集对应的链接
        m3u8 = each.xpath('./input/@value').get()
        dic_url[m3u8] = num
        print(m3u8)

顺利拿到:

接下来就是把m3u8格式的下载下来就行了,m3u8格式是由多个ts格式组成的,也是现在大多数网站都会选择的方式,也就是说,你会了这个,然后再去爬其他的也同样有用:

既然是由多个ts组成,那么如何合并呢,这里我们需要用到一个库:ffmpy3 直接pip就行

代码语言:javascript
复制
pip install ffmpy3

之后就是两行代码就能将ts合并:

代码语言:javascript
复制
from ffmpy3 import FFmpeg
FFmpeg(inputs={URL:None}, outputs={name:None).run()

不过在此之前需要下载一个文件,解压后将FFmpeg.exe放在py文件目录下,我已经放在网盘了,需要的朋友可以自行下载,这个是64位的,下载链接:在底部

因为每一集都有几百M,所以开8个线程:

代码语言:javascript
复制
import requests
import parsel,os
from ffmpy3 import FFmpeg
from concurrent.futures import ThreadPoolExecutor as pool


headers ={
    'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
}
wd = input("请输入您要下载的影片名称(比如:西部世界第一季):")
# wd = "西部世界第一季"
params = {
    'wd': wd,
    'submit': 'search',
}
target = 'http://www.okzyw.com'
url = 'https://www.okzyw.com/index.php?m=vod-search'

html = requests.get(url,params=params,headers=headers).text

res = parsel.Selector(html)
for each in res.xpath('//div[@class="xing_vb"]/ul[2]/li'):
    link = target + each.xpath('./span[2]/a/@href').get()


    dic_url = {}
    html = requests.get(link).text
    res = parsel.Selector(html)
    # 获取电影标题做文件夹
    title = res.xpath('//div[@class="vodh"]/h2/text()').get()

    # 创建文件夹
    if title not in os.listdir("./"):
        os.mkdir(title)

    for each in res.xpath('//div[@id="2"]/ul/li'):
        # 获取集数
        num = each.xpath('./text()').get().split("$")[0]

        # 获取每一集对应的链接
        m3u8 = each.xpath('./input/@value').get()
        dic_url[m3u8] = num

def down_movie(k,v):

    print("正在下载:",end="")
    print(k,v)
    name = os.path.join(title, v +".mp4")
    FFmpeg(inputs={k:None}, outputs={name:'-loglevel quiet'}).run()       
if __name__ == "__main__":
    # 开启线程池
    pl = pool(max_workers=8)
    pl.map(down_movie,dic_url.keys(),dic_url.values())
    pl.shutdown()

因为没有做优化,所以在输入名字的时候尽量详细点:

搞定:

可以看到,确实是在同时下载,趁这个时间可以出去活动一下,回来应该就下载完了。

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫数据分析挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档