手机网页抓取视频(撕开爬虫的面纱——爬虫是什么,它能做什么爬虫)
优采云 发布时间: 2022-02-01 07:08手机网页抓取视频(撕开爬虫的面纱——爬虫是什么,它能做什么爬虫)
一、揭开爬行动物的面纱——爬行动物是什么,它能做什么
什么是爬行动物
爬虫是一种可以有效地从 Internet 获取数据的程序。
我们每天都从互联网上获取数据。当我们打开浏览器访问百度时,我们从百度服务器获取数据,当我们拿起手机在线听歌时,我们从应用服务器获取数据。简单概括一下,这些过程可以描述为:我们提交一个Request请求,服务端会返回一个Response数据,应用根据Response渲染页面,并将数据结果展示给我们。
爬虫的核心也是这个过程,提交Requests -> 接受Response。就是这样,很简单,当我们在浏览器中打开一个页面,看到该页面的内容,就可以说这个页面已经采集给我们了。
只是我们实际爬取数据的时候,一般需要采集大量的页面,需要提交大量的Requests,接受大量的Responses。当数量很大时,会涉及到一些更复杂的处理,比如并发,比如请求序列,比如去重,比如链路跟踪,比如数据存储等等。因此,随着问题的延伸和扩展,爬虫已经成为一个相对独立的技术门类。
但其本质是对一系列网络请求和网络响应的处理。
爬行动物能做什么
爬虫的作用和目的只有一个,获取网络数据。我们知道,互联网是一个数据的海洋,大量的信息漂浮在其中。爬虫是回收这些资源最常用的方式。尤其是近年来,大树数据挖掘技术、机器学习和知识图谱技术的繁荣,对数据提出了更大的需求。此外,还有很多互联网创业公司。当他们前期积累的数据较少时,也会通过爬虫快速获取数据启动。
二、python爬虫框架scrapy——爬虫开发工具
如果你是爬虫概念的新手,我建议你暂时不要使用scrapy框架。或者更广泛地说,如果你是某个技术类别的新手,我不建议你直接使用框架,因为框架是许多基础技术细节的高级抽象。你发呆了。
刚开始使用爬虫,看scrapy的文档,会觉得“太复杂了”。当你使用urllib或者Requests开发python爬虫脚本,一一解决请求头封装、访问并发、队列去重、数据清洗等问题,再回来学习scrapy,你会觉得就是这么简单漂亮,可以为你节省很多时间,并且会为一些常见的问题提供成熟的解决方案。
scrapy数据流程图
这张图是scrapy框架的经典描述。暂时看不懂也没关系,过一会再回过头来。或者读完这篇文章回来。
在一些书籍中,爬虫的基本爬取过程会概括为UR2IM,意思是数据爬取的过程是围绕URL、Request(请求)、Response(响应)、Item(数据项)、MoreUrl(更多Url)展开的. 上图中的绿色箭头反映了这些元素的流动。图中涉及的四个模块用于处理这些类型的对象:
每个模块和scrapy引擎之间可以加一层或多层中间件,scrapy引擎负责处理进出模块的UR2IM对象。
爬虫安装
参考官方文档,不再赘述。官方文档:
三、scrapy实战:50行代码爬取全站短视频
python 的优雅之处在于它允许开发人员专注于业务逻辑,而花更少的时间在枯燥的代码编写和调试上。scrapy无疑完美诠释了这种精神。
开发爬虫的一般步骤是:
所以,让我们一步一步来。
由于我们使用的是scrapy框架,让我们先创建项目:
scrapy startproject DFVideo
接下来,我们创建一个爬虫:
scrapy genspider -t crawl DfVideoSpider eastday.com
这是我们发现在当前目录下已经自动生成了一个目录:DFVideo
该目录包括以下文件:
在 spiders 文件夹下,会自动生成一个名为 DfVideoSpider.py 的文件。
创建爬虫项目后,我们来确定需要爬取的数据。在 items.py 中编辑:
接下来,我们需要确定视频源的url,这是关键的一步。
现在很多视频播放页面都隐藏了视频链接,导致大家无法右键另存为,防止视频被随意下载。
但是只要页面播放视频,就必须和视频源有数据交互,所以只要抓包一点,就能找到谜底。
这里我们使用 fiddler 抓包进行分析。
找到指向其视频播放页面的链接,例如:/a/3827264568.html?index3lbt
视频源的数据链接类似于:/vyule/20180415/2_1_06400360.mp4
有了这两个链接,大部分工作就完成了:
在 DfVideoSpider.py 中编辑
# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose,Join
from DFVideo.items import DfvideoItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import time
from os import path
import os
class DfvideospiderSpider(CrawlSpider):
name = 'DfVideoSpider'
allowed_domains = ['eastday.com']
start_urls = ['http://video.eastday.com/']
rules = (
Rule(LinkExtractor(allow=r'video.eastday.com/a/\d+.html'),
callback='parse_item', follow=True),
)
def parse_item(self, response):
item = DfvideoItem()
try:
item["video_url"] = response.xpath('//input[@id="mp4Source"]/@value').extract()[0]
item["video_title"] = response.xpath('//meta[@name="description"]/@content').extract()[0]
#print(item)
item["video_url"] = 'http:' + item['video_url']
yield scrapy.Request(url=item['video_url'], meta=item, callback=self.parse_video)
except:
pass
def parse_video(self, response):
i = response.meta
file_name = Join()([i['video_title'], '.mp4'])
base_dir = path.join(path.curdir, 'VideoDownload')
video_local_path = path.join(base_dir, file_name.replace('?', ''))
i['video_local_path'] = video_local_path
if not os.path.exists(base_dir):
os.mkdir(base_dir)
with open(video_local_path, "wb") as f:
f.write(response.body)
yield i
至此,一个简单但功能强大的爬虫就完成了。
如果要将视频的附加数据保存在数据库中,可以在pipeline.py中进行相应的操作,比如保存在mongodb中:
from scrapy import log
import pymongo
class DfvideoPipeline(object):
def __init__(self):
self.mongodb = pymongo.MongoClient(host='127.0.0.1', port=27017)
self.db = self.mongodb["DongFang"]
self.feed_set = self.db["video"]
# self.comment_set=self.db[comment_set]
self.feed_set.create_index("video_title", unique=1)
# self.comment_set.create_index(comment_index,unique=1)
def process_item(self, item, spider):
try:
self.feed_set.update({"video_title": item["video_title"]}, item, upsert=True)
except:
log.msg(message="dup key: {}".format(item["video_title"]), level=log.INFO)
return item
def on_close(self):
self.mongodb.close()
当然需要在setting.py中开启管道:
ITEM_PIPELINES = {
'TouTiaoVideo.pipelines.ToutiaovideoPipeline': 300,
}
四、执行结果展示
视频文件:
本文所发布代码仅用于学习交流,请勿用于非法用途,后果自负。