参考官方文档,不再赘述。官方文档: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):
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中编辑
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中:
最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里无偿获取