如何用 Python + Scrapy 爬取视频?

开发 后端
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取.

[[403300]]

本文转载自微信公众号「快学Python」,作者快快。转载本文请联系快学Python公众号。

人生苦短,快学Python!

今天将带大家简单了解Scrapy爬虫框架,并用一个真实案例来演示代码的编写和爬取过程。

一、scrapy简介

1. 什么是Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,我们只需要实现少量的代码,就能够快速的抓取

Scrapy使用了Twisted异步网络框架,可以加快我们的下载速度

http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html

异步和非阻塞的区别

异步:调用在发出之后,这个调用就直接返回,不管有无结果

非阻塞:关注的是程序在等待调用结果时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程

2. Scrapy工作流程

另一种爬虫方式

Scrapy工作流程

Scrapy engine(引擎) 总指挥:负责数据和信号的在不同模块间的传递 scrapy已经实现
Scheduler(调度器) 一个队列,存放引擎发过来的request请求 scrapy已经实现
Downloader(下载器) 下载把引擎发过来的requests请求,并返回给引擎 scrapy已经实现
Spider(爬虫) 处理引擎发来的response,提取数据,提取url,并交给引擎 需要手写
Item Pipline(管道) 处理引擎传过来的数据,比如存储 需要手写
Downloader Middlewares(下载中间件) 可以自定义的下载扩展,比如设置代理 一般不用手写
Spider Middlewares(中间件) 可以自定义requests请求和进行response过滤 一般不用手写

3. Scrapy入门

  1. #1 创建一个scrapy项目 
  2. scrapy startproject mySpider 
  3.  
  4. #2 生成一个爬虫 
  5. scrapy genspider demo "demo.cn" 
  6.  
  7. #3 提取数据 
  8. 完善spider 使用xpath等 
  9.  
  10. #4 保存数据 
  11. pipeline中保存数据 

在命令中运行爬虫

  1. scrapy crawl qb # qb爬虫的名字 

在pycharm中运行爬虫

  1. from scrapy import cmdline 
  2.  
  3. cmdline.execute("scrapy crawl qb".split()) 

4. pipline使用

从pipeline的字典形可以看出来,pipeline可以有多个,而且确实pipeline能够定义多个

为什么需要多个pipeline:

1 可能会有多个spider,不同的pipeline处理不同的item的内容

2 一个spider的内容可以要做不同的操作,比如存入不同的数据库中

注意:

1 pipeline的权重越小优先级越高

2 pipeline中process_item方法名不能修改为其他的名称

5. 文件目录结构

文件配置:

setting:

  1. SPIDER_MODULES = ['st.spiders'
  2. NEWSPIDER_MODULE = 'st.spiders' 
  3. LOG_LEVEL = 'WARNING' # 这样设置可以在运行的时候不打印日志文件 
  4. ... 
  5. # Obey robots.txt rules 
  6. ROBOTSTXT_OBEY = False # 调整为false
  7. ... 
  8. # Override the default request headers: # 头部信息,反爬 
  9. DEFAULT_REQUEST_HEADERS = { 
  10.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36'
  11.   'Accept''text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
  12.   'Accept-Language''en'
  13. ... 
  14. ITEM_PIPELINES = { # 打开管道 
  15.    'st.pipelines.StPipeline': 300, 

为了运行文件方便:新建start.py(和settings在同一目录下),

  1. from scrapy import cmdline 
  2. cmdline.execute('scrapy crawl stsp'.split()) # 这里爬虫项目名为stsp 

目前是这样,后面提取数据的时候修改对应文件 .

二、页面分析

第一页url:https://699pic.com/video-sousuo-0-18-0-0-0-1-4-popular-0-0-0-0-0-0.html

url规律:

  1. url = 'https://699pic.com/video-sousuo-0-18-0-0-0-{}-4-popular-0-0-0-0-0-0.html'.format(i) 

通过分析页面知道视频数据在li里面,如图所示.现在问题就简单了。

三、解析数据

  1. def parse(self, response): 
  2.     # global count 
  3.     # count += 1 
  4.     # print(response) 
  5.     liList = response.xpath('//li') # 获取所有的li,后面提取有用的 
  6.      
  7.     print(len(liList)) # 76(然后分析可知,第11个到第70个是我们需要的数据) 
  8.      
  9.     newfolderName = 'page{}'.format(count) # 文件夹的名字page1,page2,.... 
  10.     # 步骤二 创建一个新的文件夹 保存每页的视频 
  11.     if not os.path.exists(newfolderName): 
  12.         os.mkdir(newfolderName) 
  13.  
  14.     for li in liList[10:-6]: 
  15.         video_link = li.xpath("./a/div/video/@data-original").extract_first() 
  16.         videoLink = 'https:' + video_link # url拼接 
  17.         title = li.xpath("./a[2]/h3/text()").extract_first() 
  18.         # 下载数据: 
  19.         res = requests.get(videoLink,headers=headers) 
  20.         data = res.content 
  21.                 
  22.         try: 
  23.             with open(newfolderName + '/' + title + '.mp4','wb'as f: 
  24.                  f.write(data) 
  25.                  print('%s下载成功'%title) 
  26.         except
  27.            break 

四、文件配置

items:

  1. import scrapy 
  2. class StItem(scrapy.Item): 
  3.     # define the fields for your item here like
  4.     # 和两个对应前面的数据 
  5.     videoLink = scrapy.Field() 
  6.     title = scrapy.Field() 
  7.     # pass 

设置好items文件后需要在爬虫文件(stsp.py)头部添加如下代码:

  1. from st.items import StItem # 这个要设置根目录文件即st 

然后调整stsp文件:

  1. item = StItem(videoLink=videoLink,title=title)yield item # 这里必须使用yield,如果使用return最后在管道中只能得到一个文件 

piplines:

  1. # 前面的注释代码 
  2. from itemadapter import ItemAdapter 
  3. import csv 
  4.  
  5. class StPipeline: 
  6.     def __init__(self): 
  7.         # 打开文件,指定方式为写,利用第3个参数把csv写数据时产生的空行消除 
  8.         self.f = open('Sp.csv','w',encoding='utf-8',newline=''
  9.         # 设置文件第一行的字段名,注意要跟spider传过来的字典key名称相同 
  10.         self.file_name = ['title''videoLink'
  11.         # 指定文件的写入方式为csv字典写入,参数1为指定具体文件,参数2为指定字段名 
  12.         self.writer = csv.DictWriter(self.f, fieldnames=self.file_name) 
  13.         # 写入第一行字段名,因为只要写入一次,所以文件放在__init__里面 
  14.         self.writer.writeheader() 
  15.  
  16.     def process_item(self, item, spider): 
  17.         # 写入spider传过来的具体数值 
  18.         self.writer.writerow(dict(item)) # 这里的item是上面创建出来的实例对象,需要转换成dict 
  19.         # 写入完返回 
  20.         return item 
  21.  
  22.     def close_spider(self,spider): 
  23.         self.f.close() 

五、批量爬取

  1. next_url = 'https://699pic.com/video-sousuo-0-18-0-0-0-{}-4-popular-0-0-0-0-0-0.html'.format(count) # 这里的count是初始化的全局变量count,每次执行数据解析,就让他+1 
  2. request = scrapy.Request(next_url) 
  3. yield request 

最后运行程序:

csv文件:

page2.mp4文件:

 

 

责任编辑:武晓燕 来源: 快学Python
相关推荐

2020-12-02 09:42:42

PythonApp抖音视频

2020-10-16 07:03:17

Scrapy爬虫框架

2018-01-04 09:20:55

python爬虫视频弹幕

2017-11-17 19:56:46

爬虫视频信息数据库

2017-06-29 11:11:17

2021-07-20 09:45:58

PythonEV短视频

2017-11-20 09:46:08

python爬虫Scrapy

2016-12-07 11:18:58

Python爬虫网站

2017-05-24 15:07:19

Python爬虫爬取

2018-01-16 18:43:18

爬虫工具电影天堂

2020-11-03 14:10:45

Python爬取天气爬虫

2022-05-12 09:25:19

Python播放视频摄像头

2019-01-02 12:23:30

Python金融数据爬取

2018-03-27 18:12:12

PythonHTML

2020-06-28 14:35:54

OBSWebSockets开源

2020-07-10 09:49:53

数据清理数据分析查找异常

2023-02-08 07:09:40

PythonChatGPT语言模型

2021-01-24 16:40:00

Python爬取网站编程语言

2019-01-11 10:22:31

Python数据爬取

2023-08-29 09:31:01

Scrapy网页爬虫
点赞
收藏

51CTO技术栈公众号