利用FilesPipeline 下载视频

1.setting.py

# 保存log信息的文件名
LOG_LEVEL = "INFO"
# LOG_STDOUT = True
# LOG_ENCODING = 'utf-8'
# # 路径  os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
# LOG_FILE = "info.log"

# 下载延迟
import random

DOWNLOAD_DELAY = random.random() + random.random()
RANDOMIZE_DOWNLOAD_DELAY = True

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'

# 视频下载路径
import os

BASE_DIR = os.path.dirname((os.path.abspath(__file__)))
MEDIA_ALLOW_REDIRECTS = True
FILES_STORE = os.path.join(BASE_DIR, "videos")  # 文件保存路径
FILES_URLS_FIELD = 'file_urls'  # 这里对应着item.py文件中的字段
FILES_RESULT_FIELD = 'files'  # 同样对应item.py文件中的字段
# 120 days of delay for files expiration
# FILES_EXPIRES = 120  # 设置文件失效时间

ITEM_PIPELINES = {
    'steam_video.pipelines.SteamVideoPipeline': 300,
    'steam_video.pipelines.SteamDownLoadPipeline': 100,   # 视频下载的管道
}

2.spider.py

import scrapy, pymysql, re

class VideosSpider(scrapy.Spider):
    name = 'videos'
    allowed_domains = ['.com']
    start_urls = ['https://www.baidu.com/']

    def parse(self, response):
        db = pymysql.connect(host='localhost', port=3306, database='game', user='root', password='root',
                             charset='utf8', autocommit=True)
        cursor = db.cursor()
        cursor.execute(
            'SELECT id, appid, data_webm_source, data_webm_hd_source, data_mp4_source, data_mp4_hd_source, data_poster from steam_game_video WHERE id<5')  # 获取图片url
        for appid in cursor.fetchall():
            for i in range(2, 7):
                item = {}
                item['id'] = appid[0]
                item['appid'] = appid[1]
                item['file_url'] = appid[i]  # 下载视频的url    前面要自己获取到 视频的url   可以自己爬
                item['video_name'] = str(item['appid']) + '_' + re.findall(r'/(\d+)/', appid[i])[0] + '_' + \
                                     appid[i].split('/')[-1].split('?')[0]  # 后面图片要命名的名称
                print(item)
                print('*' * 100)
                yield item

3.pipelines.py

# -*- coding: utf-8 -*-
from scrapy.pipelines.images import FilesPipeline  # 导入文件下载类
import scrapy, os, hashlib
from scrapy.http import Request
from scrapy.utils.python import to_bytes
from steam_video.settings import FILES_STORE as FILS

class SteamVideoPipeline(object):
    def process_item(self, item, spider):
        return item

# 下载图片管道
class SteamDownLoadPipeline(FilesPipeline):
    def get_media_requests(self, item, info):
        return scrapy.Request(item['file_url'],
                              meta={'video_name': item.get('video_name', None)})  # 下载视频  video_name为视频名称

    def file_path(self, request, response=None, info=None):

        def _warn():
            from scrapy.exceptions import ScrapyDeprecationWarning
            import warnings
            warnings.warn('FilesPipeline.file_key(url) method is deprecated, please use '
                          'file_path(request, response=None, info=None) instead',
                          category=ScrapyDeprecationWarning, stacklevel=1)

        # check if called from file_key with url as first argument
        if not isinstance(request, Request):
            _warn()
            url = request
        else:
            url = request.url

        # detect if file_key() method has been overridden
        if not hasattr(self.file_key, '_base'):
            _warn()
            return self.file_key(url)

        media_guid = hashlib.sha1(to_bytes(url)).hexdigest()  # change to request.url after deprecation
        media_ext = os.path.splitext(url)[1]  # change to request.url after deprecation
        # 这里我们使用自定义的文件名,如果meta中没有video_name,就使用url的hash值作为文件名
        file_path = FILS + '\\' + request.meta.get('video_name')
        file = file_path.replace('\\{}'.format(file_path.split('\\')[-1]), '')
        if not os.path.exists(file):
            os.makedirs(file)
        return '{}'.format(request.meta.get('video_name'))
        # return 'full/%s.mp4' % (''.join(request.meta.get('video_name', media_guid).split(' ')))

    def file_key(self, url):   # 服务器部署需要家里这个代码
        return self.file_path(url)
    file_key._base = True

    def item_completed(self, results, item, info):
        print('******the results is********:',
              results)  # resulte [(True, {'url': 'https://media.st.dl.bscstorage.net/steam/apps/904/movie480.mp4?t=1569623096', 'path': '220_904_movie480.mp4', 'checksum': '0f22435cdfe2d605480fc5396160d3a5'})]
        if results[0][0]:  # 判断视频是否下载成功
            print('下载成功:{}'.format(item))
        else:
            print('下载失败:{}'.format(item))

  

  

  

scrapy 爬取视频的更多相关文章

  1. Scrapy爬取美女图片 (原创)

    有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...

  2. 以豌豆荚为例,用 Scrapy 爬取分类多级页面

    本文转载自以下网站:以豌豆荚为例,用 Scrapy 爬取分类多级页面 https://www.makcyun.top/web_scraping_withpython17.html 需要学习的地方: 1 ...

  3. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  4. scrapy爬取西刺网站ip

    # scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...

  5. scrapy爬取豆瓣电影top250

    # -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...

  6. scrapy爬取极客学院全部课程

    # -*- coding: utf-8 -*- # scrapy爬取极客学院全部课程 import scrapy from pyquery import PyQuery as pq from jike ...

  7. scrapy爬取全部知乎用户信息

    # -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...

  8. Scrapy爬取Ajax(异步加载)网页实例——简书付费连载

    这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...

  9. Scrapy爬取静态页面

    Scrapy爬取静态页面 安装Scrapy框架: Scrapy是python下一个非常有用的一个爬虫框架 Pycharm下: 搜索Scrapy库添加进项目即可 终端下: #python2 sudo p ...

随机推荐

  1. 3-3 用户管理-新建用户useradd和passwd

    3.用户管理 终端命令 提示:创建用户/删除用户/修改其他用户密码的终端命令都需要通过sudo执行 3.1创建用户/修改密码/删除用户 序号 命令 作用 说明 01 useradd -m -g 组 新 ...

  2. jt格式文件与3D数据压缩

    介绍 JT是西门子公司推出的PLM通用三维格式,设计为一个开放.高效率的.紧凑,持久性存储的产品数据格式,用于产品可视化.协作和CAD数据共享.JT文件格式包括多方面的数据,以及对曲面边的精准表示,产 ...

  3. The Preliminary Contest for ICPC Asia Shenyang 2019

    传送门 B. Dudu's maze 题意: 是什么鬼东西???我读题可以读半小时QAQ 给出一张无向图,一个人在里面收集糖果,每个点都有一个糖果,特殊点除外.当他第一次进入特殊点时,会随机往一条边走 ...

  4. Kali设置1920x1080分辨率

    root@kali:~# xrandr --newmode -hsync +vsync root@kali:~# xrandr --addmode Virtual1 1920x1080 root@ka ...

  5. 2. 词法"陷阱"

    1. 练习2-1 某些编译器允许嵌套注释.请写一个程序测试,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译,但是这两者情况下执行的结果却不相同. #inclu ...

  6. Python开发GUI实战:图片转换素描画工具!

    奋斗没有终点 好好学习72变,因为将来 没有人能替你阻挡81难 . 生如蝼蚁,当有鸿鹄之志: 命如纸薄,应有不屈之心 . ​ 今天被这句话触动了,所以开篇分享给大家.鸡汤有毒,但有时大家却靠它激励自己 ...

  7. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  8. kafka 重放 重播 从某个时间点或者offset开始消费

    转自: https://www.jianshu.com/p/932663e9a226 consumer.subscribe(topicA); consumer.poll(100);//正常订阅topi ...

  9. Linux 内存释放

    简介 linux 内存释放通过如下命令,将cache与buff根据环境进行释放操作,避免重启释放内存. 操作 1.将内存中buff数据保存磁盘 sync 2.清理cache与buff缓存 echo 3 ...

  10. Redis for OPS 01:关于 Redis 基础说明与安装部署

    写在前面的话 本章节开始在主要介绍在运维工作中绕不开的一个话题,数据缓存 NoSQL 服务 Redis,搭建很简单,使用很简单,运行也稳定的一批,一般小公司几乎很少出现以为量的问题导致他 down 掉 ...