scrapy 爬取视频
利用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 爬取视频的更多相关文章
- Scrapy爬取美女图片 (原创)
有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...
- 以豌豆荚为例,用 Scrapy 爬取分类多级页面
本文转载自以下网站:以豌豆荚为例,用 Scrapy 爬取分类多级页面 https://www.makcyun.top/web_scraping_withpython17.html 需要学习的地方: 1 ...
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
- scrapy爬取豆瓣电影top250
# -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...
- scrapy爬取极客学院全部课程
# -*- coding: utf-8 -*- # scrapy爬取极客学院全部课程 import scrapy from pyquery import PyQuery as pq from jike ...
- scrapy爬取全部知乎用户信息
# -*- coding: utf-8 -*- # scrapy爬取全部知乎用户信息 # 1:是否遵守robbots_txt协议改为False # 2: 加入爬取所需的headers: user-ag ...
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...
- Scrapy爬取静态页面
Scrapy爬取静态页面 安装Scrapy框架: Scrapy是python下一个非常有用的一个爬虫框架 Pycharm下: 搜索Scrapy库添加进项目即可 终端下: #python2 sudo p ...
随机推荐
- CodeForces-1217D (拓扑排序/dfs 判环)
题意 https://vjudge.net/problem/CodeForces-1217D 请给一个有向图着色,使得没有一个环只有一个颜色,您需要最小化使用颜色的数量. 思路 因为是有向图,每个环两 ...
- 剑指Offer-35.两个链表的第一个公共结点(C++/Java)
题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { publi ...
- HTML连载48-清除浮动的其中两种方式
一.清除浮动的方式一 给前面一个父元素设置高度,注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...
- umi+dva+antd新建项目(亲测可用)
首先全局安装dva+umiumi:npm install -g umidva:npm install -g dva-cli 通过脚手架创建项目 一: mkdir myapp && cd ...
- mysql8报错解析
1. 场景描述 想把测试数据导一份到本地使用,乱入装了mysql8,使用springboot项目启动的时候报: java.sql.SQLException: The server time zone ...
- Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法
1)find过滤目录使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤.不过必须注意:要忽 ...
- WPF 解决多个TreeViewItem同时触发某事件的简单方法
原理是: 因为是双击事件,也就是同时引发了选择事件,TreeViewItem的IsSelected为True.通过触发器设置某个属性为特殊值,然后在CS页面的双击事件方法内判断是否此值即可. xaml ...
- Web前端基础(7):JavaScript(一)
1. JavaScript概述 1.1 JavaScript历史背景介绍 布兰登 • 艾奇(Brendan Eich,1961年-),1995年在网景公司,发明的JavaScript. 一开始Java ...
- 黑马程序员面试宝典(Java)Beta6.0免费下载
场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? ...
- 反射DataTable转实体类
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ...