爬虫框架——Scrapy快速上手
爬虫框架——Scrapy快速上手
一、Scrapy 简介
Scrapy 框架
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。Scrapy 使用了 Twisted 异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
- 虽然我们可以使用独立的 python 脚本来编写我们的爬虫,但框架的使用无疑会大大简化我们的爬虫开发以及加快我们的爬取速度。我们也可以在在框架中自定义组件来控制和伪装我们的爬虫,以达到反反爬的目的。
我们这里以一个图片网站为例进行爬取 ——-> https://www.mzitu.com/ (由于一些原因我就不把爬取的结果图贴上去了🤐)
二、安装依赖创建项目
1 | 下载安装依赖(如果速度太慢可以配置镜像) |
这次因为是一个爬虫工程,我们用 Pycharm 打开,然后你就可以看见以下目录文件
spiders
:放置你的爬虫脚本的文件夹_init_.py
:包的声明文件meizitu.py
:主要的爬虫脚本文件,你的大部分业务代码在这里编写
_init_.py
:包的声明文件items.py
:资源封装文件middlewares.py
:爬虫中间件文件pipelines.py
:管道处理文件settings.py
:配置文件scrapy.cfg
:爬虫的主配置文件
三、Scrapy 框架架构
Scrapy 架构图
Scrapy 流程图
Scrapy框架模块功能
Scrapy Engine
(引擎):Scrapy框架的核心部分。负责在Spider和ItemPipeline、Downloader、Scheduler中间通信、传递数据等。Spider
(爬虫):发送需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据再发送给爬虫,爬虫就去解析想要的数据。这个部分是我们开发者自己写的,因为要爬取哪些链接,页面中的哪些数据是我们需要的,都是由程序员自己决定。Scheduler
(调度器):负责接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。Downloader
(下载器):负责接收引擎传过来的下载请求,然后去网络上下载对应的数据再交还给引擎。Item Pipeline
(管道):负责将Spider(爬虫)传递过来的数据进行保存。具体保存在哪里,应该看开发者自己的需求。Downloader Middlewares
(下载中间件):可以扩展下载器和引擎之间通信功能的中间件。Spider Middlewares
(Spider中间件):可以扩展引擎和爬虫之间通信功能的中间件。
四、爬虫文件
1. 默认生成的爬虫文件
1 | import scrapy |
2. 两个常用的爬虫类
scrapy.Spider
:scrapy.Spider是所有爬虫类的父类。scrapy.spiders.CrawlSpider
:规则爬虫是省略了一般的解析工作,它完成了感兴趣的连接<a href="">文本</a>
提取。按rules中给定的Rule规则进行提取连接标签中的信息(href, text)。
3. 开始解析结果
1 | from scrapy.linkextractors import LinkExtractor |
结果的解析这里可以使用 正则表达式 、 xpath表达式 和 css选择器 这些的具体语法这里不过多赘述
然后根据浏览器的调试工具来抓取自己所需要的信息
4. 爬虫配置
1 | # 关闭对爬虫协议的遵守 |
5. 爬虫调试
爬虫启动:因为scrapy是从命令行启动,这边为了方便调试,我们通过 python 脚本启动
1
2
3
4
5
6
7# 目录下新建一个start.py文件
from scrapy import cmdline
# 启动命令行并输入命令
cmdline.execute('scrapy crawl meizitu'.split())
# 这样我们就可以通过运行这个脚本来启动爬虫爬虫测试:由于爬虫的框架在调试时频繁启动很麻烦,我们这里可以使用 scrapy 提供的命令行工具进行测试
1
2scrapy shell http://xxxxxxx.com(你的目标url)
接下来就可以开始测试你的正则表达式或者xpath语法
五、资源封装下载
1. 封装
我们在
item.py
中定义我们需要传递的资源1
2
3
4
5import scrapy
class MeizituItem(scrapy.Item):
title = scrapy.Field()
urls = scrapy.Field()然后就可以在爬虫文件中将其传递过来
1
2
3
4
5
6
7
8from MeiziTu.items import MeizituItem
def prase(self, response):
...
item = MeizituItem(title=title, urls=urls)
# 封装到 item
yield item
# 传到下载组件在管道文件中接收
1
2
3
4class MeizituPipeline:
def process_item(self, item, spider):
title = item["title"]
urls = item["urls"]
2. 文件下载
接下来我们就可以在管道文件中定义下载过程了
1 | import os |
然后就可以开始享受成果了!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Fabian Bao!
评论