zoukankan      html  css  js  c++  java
  • 爬取小视频网站视频并下载——场库网站视频批量下载

    首先声明:此小视频非彼小视频,大家心照不宣即可

    目标:https://www.vmovier.com/  这网站名字好像叫场库

    """
    首先向https://www.vmovier.com/发送请求
    获取响应,解析响应
    将所有标题和链接过滤出来
    向过滤出的链接发请求下载视频
    向src属性发送请求,获取响应,将内容保存到本地
    注意:这是一个动态的页面  是js的数据 需要捕获接口
    使用抓包工具Fiddler
    接口信息:https://www.vmovier.com/post/getbytab?tab=new&page=1&pagepart=2&type=0&controller=index&last_postid=58197
    """
    import requests
    from  bs4 import  BeautifulSoup
    import time
    import json
    from lxml import etree
    import re
    from  selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    #创建一个参数对象,用来控制Chrome以无界面模式打开
    chrome_options = Options()
    #开启无头模式
    chrome_options.add_argument('--headless')
    #禁用GPU
    chrome_options.add_argument('--disable-gpu')
    #驱动路径
    path =r'D:chromedriverchromedriver.exe'
    
    #添加头部  作为全局
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
    }
    
    
    #此处有一个跳转 感觉像是反爬机制  所以我们要再过滤一次 过滤出跳转后的url这个函数用来处理此跳转
    def FanPa(r):
        #正则获取src属性
        match_obj = re.compile(r'<meta property="article:published_first" content="新片场,(.*)" />')
        url = re.findall(match_obj,r.text)
        # print(url)
        # exit()
        return url
    
    
    #解析首页,返回所有的标题链接
    def handle_title():
        #输入你想要的爬取的页数
        page = int(input("请输入您要爬取的页数:"))
        print("开始爬取第%s页....." % page)
        #将捕获接口拿过来  因为是动态的页面 所以捕获接口 向接口发送数据
        #page=页数  pagepart=每页的第几次刷新 每页有三次刷新分别是1 2 3 可以写一个循环
        for T in range (1,4):
            url = "https://www.vmovier.com/post/getbytab?tab=new&page=% s&pagepart=%d" %(page,T)
            # print(url)
            # exit()
            r = requests.get(url=url,headers=headers)
            #解析内容,因为返回的是json数据 直接解析json格式即可
            # 后来发现不是严格json格式 就使用json对象取出了data部分 用正则过滤出来的
            #我们需要的标题和链接分别是h1标签下的title和href
            #将json数据转化为Python对象
            obj = json.loads(r.text)
            # print(obj)
            # exit()
            #取出所有和视频相关的数据 标题和url 使用正则
            data = obj['data']
            #print(data)
            # # exit()
            match_obj_url = re.compile(r'<a href="(.*)" title=".*全文" target="_blank">阅读全文...</a>')
            url = re.findall(match_obj_url,data)
            # print(url)
            # print(len(url))
            match_obj_title = re.compile(r'<a href=".*" title="(.*)全文" target="_blank">阅读全文...</a>')
            title = re.findall(match_obj_title,data)
            # print(title)
            # print(len(title))
            # exit()
            #循环data列表 依次取出每一个视频信息
            # 其中标题信息可以直接用 但是url拼接后不是最终url 还有2次跳转
            for i in range (0,15):#两个列表各有15条数据 一一对应
                end_title = title[i]
                #print(end_title)
                a_href = "https://www.vmovier.com" + url[i]
                # print(a_href)
                # exit()
                #这个不是最终视频url 需要处理一次跳转
                r = requests.get(url=a_href,headers=headers)
                end_href = FanPa(r)# 这是倒数第二层url
                # print(end_href)
                # exit()
                video_src = get_video_url(end_href)
                # print(video_src)
                # exit()
                #找到视频原始地址后开始下载
                print("开始下载%s..." % end_title)
                filepath = 'shipin/' + end_title +'.mp4'
                r = requests.get(url=video_src)
                with open(filepath,'wb')as fp:
                    fp.write(r.content)
                print("%s下载完成" % end_title)
    
    
    #发送请求, 获取内容 解析内容,获取src
    def get_video_url(end_href):
        # print(end_href)# 这里end_href是一个只有一个元素的列表 所以要加下标
        # # exit()
        # r = requests.get(url=end_href[0],headers=headers)
        # print(r.text)
        # exit()
        #这里打印返回页面 发现没有我们想找的video链接
        # 很可能又是反爬机制 所以使用终极武器  无头浏览器来解决
        browser = webdriver.Chrome(executable_path=path,options=chrome_options)
        browser.get(end_href[0])
        time.sleep(3)
        #获取源码,生成tree对象,然后查找video里的src属性
        # print(browser.page_source)
        # exit()
        soup = BeautifulSoup(browser.page_source,'lxml')
        video_src =soup.find('video',id="xpc_video")['src']
        # print(video_src)
        # exit()
        return video_src
    
    def main():
        #解析首页,返回所有的标题链接
        handle_title()
      if __name__ == '__main__':
        main()

    主要需要注意的问题是:

    1、对于这种懒加载的网页 一般要捕获其接口,从接口返回信息中过滤出标题和url

    2、这个网站有一个跳转过程,感觉像是反爬的机制,可以通过一步步输出HTML页面去判断是否是我们需要的页面

    3、有一些地方 比如json返回的数据 不是严格的json格式 我们就把数据取出来 使用正则表达式去过滤

    4、有的时候requests模块发送请求不能获得我们想要的页面  可能需要使用无界面浏览器驱动去获取页面内容

    结果:

     

    作者:求知鱼

    -------------------------------------------

    个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    独学而无友,则孤陋而寡闻,开源、分享、白嫖!

  • 相关阅读:
    删除 SQL Server 2005 Express 工具
    静态和非静态
    C#中的托管和非托管
    类和结构的区别
    asp.net URL DES加密 什在URL中的使用
    正则替换图片路径
    Oracle 正则 一行转多行
    Oracle 存储过程
    HTTP SOAP Request
    jquery 高亮
  • 原文地址:https://www.cnblogs.com/Qiuzhiyu/p/12177691.html
Copyright © 2011-2022 走看看