今天将带大家简单了解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 创建一个scrapy项目
scrapy startproject mySpider#2 生成一个爬虫
scrapy genspider demo "demo.cn"#3 提取数据
完善spider 使用xpath等#4 保存数据
pipeline中保存数据

在命令中运行爬虫

scrapy crawl qb     # qb爬虫的名字

在pycharm中运行爬虫

from scrapy import cmdlinecmdline.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:

SPIDER_MODULES = ['st.spiders']
NEWSPIDER_MODULE = 'st.spiders'
LOG_LEVEL = 'WARNING' # 这样设置可以在运行的时候不打印日志文件
...
# Obey robots.txt rules
ROBOTSTXT_OBEY = False # 调整为false,
...
# Override the default request headers: # 头部信息,反爬
DEFAULT_REQUEST_HEADERS = {'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','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}
...
ITEM_PIPELINES = { # 打开管道'st.pipelines.StPipeline': 300,
}

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

from scrapy import cmdline
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规律:

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

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

二、解析数据

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

三、文件配置

items:

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

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

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

然后调整stsp文件:

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

piplines:

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

四、批量爬取

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
request = scrapy.Request(next_url)
yield request

最后运行程序:

csv文件:

page2.mp4文件:

代码下载

Scrapy 爬取视频源码

链接:https://pan.baidu.com/s/1hmNBwdfNWd7gM795x5ivfg 提取码:kxpy

推荐阅读

Pandas处理数据太慢,来试试Polars吧!

懒人必备!只需一行代码,就能导入所有的Python库

绝!关于pip的15个使用小技巧

介绍10个常用的Python内置函数,99.99%的人都在用!

可能是全网最完整的 Python 操作 Excel库总结!

如何用 Python + Scrapy 爬取视频?相关推荐

  1. Python+scrapy爬取36氪网

    Python+Scrapy爬取36氪网新闻 一.准备工作: ​ ①安装python3 ​ ②安装scrapy ​ ③安装docker,用来运行splash,splash是用来提供js渲染服务(pyth ...

  2. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  3. python怎么爬取视频

    在 Python 中爬取视频的方法有很多种,具体的步骤如下: 找到要爬取的视频的网址. 在 Python 中使用网络爬虫工具(如 requests 库)发送 HTTP 请求,获取视频的网页源代码. 使 ...

  4. 手把手教你使用Python+scrapy爬取山东各城市天气预报

    1.在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说"大宗师"全文 2.使用 ...

  5. 【python如何爬取视频】

    该文章实验了如何利用Python进行爬取网络视频,看完该文章基本是可以下载出视频的,如有不足请多多包涵 1.爬虫需要使用到的Python库. I.requests库II.re库III. jsonVI. ...

  6. python scrapy爬取HBS 汉堡南美航运公司柜号信息

    下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...

  7. 使用Python+Scrapy爬取并保存QQ群空间帖子

    首先声明,在Python和爬虫这方面,我是业余的那一卦,只是平时玩一玩,不能当真的,请各位大佬轻拍.虽然爬虫与传统意义上的大数据技术不属于同一类,但大概也只能放在大数据分类下面了. 今天接到了 @小阿 ...

  8. python Scrapy爬取天气预报,零基础的你也可以快速上手

    目的 写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt.json.已经存在的mysql数据库中. 目标分析: 初学者有什么不懂的可以私信我--我刚整理了一套2021最新的0基础入门教程,无 ...

  9. 如何用Python爬虫爬取网页免费小说

    如何用python爬网页(小说阅读网)免费小说 小说网址:https://www.readnovel.com/ 要导入requests和beautifulsoup4的包.pycharm点击File-& ...

最新文章

  1. 检查Lync SRV记录是否正常
  2. 计算机学业水平测试题及答案初中,初中信息技术学业水平考试试题30号试题.doc...
  3. 5行代码满分——L1-060 心理阴影面积 (5分)
  4. php里的抽象类和接口
  5. 基础 | numpy ndarray 之内功心法,理解高维操作!
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园订餐点餐外卖管理系统
  7. 【VS开发】Windows平台下Makefile学习笔记
  8. 静态页面转换为模板2
  9. LintCode 51: Previous Permutation
  10. 公众号丶服务号丶订阅号三者间的区别
  11. Mongodb实验二——分片集群搭建
  12. excel合并单元格和左对齐
  13. 微信公众号获取用户地理位置,转换百度坐标
  14. Java中JDBC详解
  15. 食物链(种类并查集)
  16. 寄存器一般多大,cpu一级缓存一般多大
  17. python有四个数字_Python生成0-9任意4位数字组合的方法
  18. 关于DM达梦数据库,获取用户表信息、数据表结构、数据表创建语句、主键等信息的sql
  19. 各省投入产出表数据(2002、2007、2012)
  20. 怎么使用阿里云直播服务应用到现在主流直播平台中

热门文章

  1. chrome应用程序无法启动因为并行配置不正确的处理办法(亲测版本不一样也是类似的操作)
  2. tensorflow中使用tf.ConfigProto()配置Session运行参数GPU设备指定
  3. Java秒杀系统优化的工程要点
  4. sublime开启vim模式
  5. php 实现进制相互转换
  6. Elasticsearch的功能、使用场景以及特点
  7. 第七章 Web开发实战2——商品详情页
  8. emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
  9. 微信小程序onLoad与onShow的区别
  10. CRMEB页面说明这个是v3.0H5端的