python爬虫实战:利用scrapy,短短50行代码下载整站短视频

近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法。这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题。

因为这个事儿,勾起了我另一个念头,这不最近一直想把python爬虫方面的知识梳理梳理吗,干脆借机行事,正凑着短视频火热的势头,做一个短视频的爬虫好了,中间用到什么知识就理一理。

我喜欢把事情说得很直白,如果恰好有初入门的朋友想了解爬虫的技术,可以将就看看,或许对你的认识会有提升。如果有高手路过,最好能指点一二,本人不胜感激。

一、撕开爬虫的面纱——爬虫是什么,它能做什么

爬虫是什么

爬虫就是一段能够从互联网上高效获取数据的程序。

我们每天都在从互联网上获取数据。当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿起手机在线听歌的时候,我们就从某个app的服务器上获取数据。简单的归纳,这些过程都可以描述为:我们提交一个Request请求,服务器会返回一个Response数据,应用根据Response来渲染页面,给我们展示数据结果。

爬虫最核心的也是这个过程,提交Requests——〉接受Response。就这样,很简单,当我们在浏览器里打开一个页面,看到页面内容的时候,我们就可以说这个页面被我们采集到了。

只不过当我们真正进行数据爬取时,一般会需要采集大量的页面,这就需要提交许多的Requests,需要接受许多的Response。数量大了之后,就会涉及到一些比较复杂的处理,比如并发的,比如请求序列,比如去重,比如链接跟踪,比如数据存储,等等。于是,随着问题的延伸和扩展,爬虫就成为了一个相对独立的技术门类。

但它的本质就是对一系列网络请求和网络响应的处理。

爬虫能做什么

爬虫的作用和目的只有一个,获取网络数据。我们知道,互联网是个数据的海洋,大量的信息漂浮在其中,想把这些资源收归己用,爬虫是最常用的方式。特别是最近几年大树据挖掘技术和机器学习以及知识图谱等技术的兴盛,更是对数据提出了更大的需求。另外也有很多互联网创业公司,在起步初期自身积累数据较少的时候,也会通过爬虫快速获取数据起步。

二、python爬虫框架scrapy——爬虫开发的利器

如果你刚刚接触爬虫的概念,我建议你暂时不要使用scrapy框架。或者更宽泛的说,如果你刚刚接触某一个技术门类,我都不建议你直接使用框架,因为框架是对许多基础技术细节的高级抽象,如果你不了解底层实现原理就直接用框架多半会让你云里雾里迷迷糊糊。

在入门爬虫之初,看scrapy的文档,你会觉得“太复杂了”。当你使用urllib或者Requests开发一个python的爬虫脚本,并逐个去解决了请求头封装、访问并发、队列去重、数据清洗等等问题之后,再回过头来学习scrapy,你会觉得它如此简洁优美,它能节省你大量的时间,它会为一些常见的问题提供成熟的解决方案。

scrapy数据流程图

这张图是对scrapy框架的经典描述,一时看不懂没有关系,用一段时间再回来看。或者把本文读完再回来看。

在一些书上会把爬虫的基本抓取流程概括为UR2IM,意思是数据爬取的过程是围绕URL、Request(请求)、Response(响应)、Item(数据项)、MoreUrl(更多的Url)展开的。上图的绿色箭头 体现的正是这几个要素的流转过程。图中涉及的四个模块正是用于处理这几类对象的:

  • Spider模块:负责生成Request对象、解析Response对象、输出Item对象

  • Scheduler模块:负责对Request对象的调度

  • Downloader模块:负责发送Request请求,接收Response响应

  • ItemPipleline模块:负责数据的处理

  • scrapy Engine负责模块间的通信
    各个模块和scrapy引擎之间可以添加一层或多层中间件,负责对出入该模块的UR2IM对象进行处理。

scrapy的安装

参考官方文档,不再赘述。官方文档:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html

三、scrapy实战:50行代码爬取全站短视频

python的优雅之处在于能够让开发者专注于业务逻辑,花更少的时间在枯燥的代码编写调试上。scrapy无疑完美诠释了这一精神。

开发爬虫的一般步骤是:

  • 确定要爬取的数据(item)

  • 找到数据所在页面的url

  • 找到页面间的链接关系,确定如何跟踪(follow)页面
    那么,我们一步一步来。

既然是使用scrapy框架,我们先创建项目:

1 scrapy startproject DFVideo

紧接着,我们创建一个爬虫:

scrapy genspider -t crawl DfVideoSpider eastday.com

这是我们发现在当前目录下已经自动生成了一个目录:DFVideo

目录下包括如图文件:

spiders文件夹下,自动生成了名为DfVideoSpider.py的文件。

爬虫项目创建之后,我们来确定需要爬取的数据。在items.py中编辑:

 import scrapy

class DfvideoItem(scrapy.Item):
     # define the fields for your item here like:
     # name = scrapy.Field()
     video_url = scrapy.Field()#视频源url
     video_title = scrapy.Field()#视频标题
     video_local_path = scrapy.Field()#视频本地存储路径

接下来,我们需要确定视频源的url,这是很关键的一步。

现在许多的视频播放页面是把视频链接隐藏起来的,这就使得大家无法通过右键另存为,防止了视频别随意下载。

但是只要视频在页面上播放了,那么必然是要和视频源产生数据交互的,所以只要稍微抓下包就能够发现玄机。

这里我们使用fiddler抓包分析。

发现其视频播放页的链接类似于:video.eastday.com/a/180926221513827264568.html?index3lbt

视频源的数据链接类似于:mvpc.eastday.com/vyule/20180415/20180415213714776507147_1_06400360.mp4

有了这两个链接,工作就完成了大半:

在DfVideoSpider.py中编辑

# -*- coding: utf-8 -*-import scrapyfrom scrapy.loader import ItemLoaderfrom scrapy.loader.processors import MapCompose,Joinfrom DFVideo.items import DfvideoItemfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Ruleimport timefrom os import pathimport 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中将pipelines打开:

ITEM_PIPELINES = {    'TouTiaoVideo.pipelines.ToutiaovideoPipeline': 300,}

四、执行结果展示

视频文件:

五、最后

今天讲了爬虫的一些基础的概念,不深也不透,主要是通过一个案例给大家一个直观的认识。一些细节上的点后续会专门开文细讲,喜欢的朋友可以关注,一起探讨。

本文所公布代码仅作为学习交流之用,请勿用于非法用途。

本文作者:马鸣谦,原文链接:https://www.cnblogs.com/mamingqian/p/9867697.html

(0)

相关推荐

  • 【视频讲解】Scrapy递归抓取简书用户信息

    好久没有录制实战教程视频,大邓就在圣诞节后直接上干货. 之前写过一期[视频教程-用python批量抓取简书用户信息]的文章,是自己造的轮子,今天我趁着刚入门scrapy和xpath,操刀重写这个任务. ...

  • 抓取了《大秦赋》所有数据,我发现了这些秘密

    前言 最近大火的电视剧<大秦赋>,给朋友圈的小伙伴都拉回到那个风云激荡的春秋战国时期,大家都在热情的讨论着大秦一统,秦始皇嬴政.商人吕不韦的那些尔虞我诈.恩怨情仇.那到底小伙伴们都在讨论什 ...

  • 使用 Python 爬取简书网的所有文章

    第一时间获取 Python 技术干货! 阅读文本大概需要 6 分钟. 01 抓取目标 我们要爬取的目标是「 简书网 」. 打开简书网的首页,随手点击一篇文章进入到详情页面. 我们要爬取的数据有:作者. ...

  • 列举几个简单的例子来更好的理解scrapy工作的原理

    说明:了解爬虫的可能都会知道,在爬虫里,requests入门简单,即使是没有基础的小白,学个几天也能简单的去请求网站,但是scrapy就相对来说就比较难,本片文章能是列举几个简单的例子去理解的scra ...

  • 【实战视频】使用scrapy写爬虫-爬知乎live

    我其实很喜欢造轮子,一直没用过爬虫框架写爬虫.虽然知道爬虫很简单,scrapy框架也不难,但是在舒适区呆久了,真的不想学新东西,用新知识写爬虫. 今天我不止用新框架scrapy写爬虫,而且我还要使用s ...

  • 想要利用Python快速爬取整站图片?速进(附完整代码)

    目录 一. 爬取前的准备 二. 查看网页 三. 分析与实现 1. 先确定我们所要爬取内容的具体位置2. 存储的具体实现 (`在pipelines中处理`)3. 更新完善源码 四. 代码   快速爬取整 ...

  • 全网最详细的爬虫实战教学

    转载自:小一的学习笔记 今天要分享的教程是爬取各大城市的二手房数据,抛开以前的文章不谈,下面的内容应该足够你实现这篇爬虫.以下是正文: 一.确定目标 今天我们的目标官网链接是链家网 ok,前提条件交代 ...

  • Python爬虫实战教学:爬取电影视频数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 做了一些小项目,用的技术和技巧会比较散比较杂,写一个小品文记录一下,帮助熟悉. 需求:经常在腾讯视 ...

  • 用 50 行代码写个听小说的爬虫

    来源:Python 技术「ID: pythonall」 在路上发现好多人都喜欢用耳机听小说,同事居然可以一整天的带着一只耳机听小说.小编表示非常的震惊.今天就用 Python 下载听小说 tingch ...

  • 有人说Python是青铜?我用50行Python代码绘制3D机场分布图

    原创 菜鸟哥 菜鸟学Python 2020-03-23 绘制一款的3D图形,不仅可以直观的展示数据分析的结果,也更方便数据化运营,同时也让工作成果更容易被大众理解.本文就基于python绘制一款基础的 ...

  • Python爬虫实战教程--人工智能课程培训

    Python爬虫实战教程-人工智能课程培训-Python专项课 边玩边学,为小白特别定制的零基础Python课程 "课程亮点" "全部课程" Python零基础 ...

  • Python爬虫实战练习:爬取微信公众号文章

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:徐洲更 为了实现该爬虫我们需要用到如下工具 Chrome浏览器 Py ...

  • Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 今天带大家爬取喜马拉雅音频数据,一起期待吧!! 这个案例的视频地址在这里 https://v.douyu.com/show/a2JEMJj3e3mMNxml 项目目标 爬取喜马拉雅音频数据 受害 ...

  • python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  • Python爬虫实战

    小白:爬取上市公司数据干嘛用呢? 小调:有上市公司数据,我们就可以看公司业绩,发展趋势啊? 小白:那有什么用呢?还是不懂! 小调:sb,有数据你买股票的时候就有参考啦!天天瞎买赔钱的货! 小白:了解了 ...

  • Python爬虫新手入门教学(七):爬取腾讯视频弹幕

    基本开发环境 Python 3.6 Pycharm 相关模块的使用 jieba wordcloud 安装Python并添加到环境变量,pip安装需要的相关模块即可. 一.明确需求 选择 <欢乐喜 ...