zoukankan      html  css  js  c++  java
  • Python爬取最爱的电影并下载到本地(附源码)

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

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


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

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

    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)
        
    
    
    

    内容页拿到:

    output:
    http://www.okzyw.com/?m=vod-detail-id-12790.html
    
    
    

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

    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格式的:

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

        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就行

    pip install ffmpy3
    

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

    from ffmpy3 import FFmpeg
    FFmpeg(inputs={URL:None}, outputs={name:None).run()
    

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


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

    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 -

    FFmpeg.exe获取方式

    识别文末二维码,回复:FFmpeg

    欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章

    回复【开源源码】免费获取更多开源项目源码;

    耐得住寂寞,才能登得顶
    Gitee码云:https://gitee.com/lyc96/projects
  • 相关阅读:
    [HDU3247]Resource Archiver
    [POJ2243]考研路茫茫——单词情结
    [POJ2778]DNA Sequence
    [bzoj3670] [Noi2014]动物园
    [bzoj3786] 星系探索
    [bzoj1493] [NOI2007]项链工厂
    postgreSQL的设置自增主键初始值
    postgreSQL绝对值
    GitHub上新建或删除仓库Repository
    Intellij Idea上传本地项目到Git
  • 原文地址:https://www.cnblogs.com/chenlove/p/14038540.html
Copyright © 2011-2022 走看看