大家好,我是云朵君!
本文总结的思路,分为四步走:
1.Scrapy框架的安装 2.Scrapy的简单使用 3.Scrapy的整体架构和组成 4.Scrapy的中间件详解
一、Scrapy框架的安装
Scrapy框架因为功能十分强大,所以依赖很多库,不能直接安装,需要先安装依赖库,因为我的电脑在Windows下,所以这里展示Windows下的安装方法(如果有其他平台的需要,欢迎给我留言我在发出来)。
需要安装4个依赖库分别是:
- lxml(这个最重要),使用pip命令安装
pip3 install lxml
若没有报错,则安装成功,如果报错提示缺少libxml2 库,可以使用wheel文件进行安装 libxml2。
- pyOpenSSL 需要在官网下载wheel文件 pyOpenssL 下载后使用
pip3 install pyOpenSSL-17.2.0-py2.py3-none-any.whl
安装即可。
- Twisted 同理,需要在官网下载wheel文件 Twisted,但是有一件事,一定要记得在控制台下输入
python
查看你的电脑版本和python版本,然后在上面的地址中下载对应的wheel文件。
然后使用命令安装。
代码语言:javascript复制pip3 install Twisted-17.5.0-cp36-cp36m-win_amd64.whl
- PyWin32 在官网下载对应版本的安装包双击安装即可 pywin32
在依赖包全部安装成功前提下安装Scrapy框架,使用pip命令。
代码语言:javascript复制pip3 install Scrapy
就证明 Scrapy 已经安装好了。
使用之前你要清楚这么一件事,Scrapy框架和你自己编写的区别,我理解的区别就是没什么区别,你编写的爬虫也是为了抓取数据,框架也是为了抓取数据,唯一有一定不同的就是,不管是我们现在所说的Scrapy框架还是其他的爬虫框架都是使爬虫功能模块话,把各种爬虫需求分开来,你只要使用你的项目所需要的模块就够了!
你还需要知道这么几条常用的命令。
创建项目:scrapy startproject xxx 进入项目:cd xxx #进入某个文件夹下 创建爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域) 生成文件:scrapy crawl xxx -o xxx.json (生成某种类型的文件) 运行爬虫:scrapy crawl XXX 列出所有爬虫:scrapy list 获得配置信息:scrapy settings [options]
那么我们现在来说说Scrapy框架的基本使用也是一样分为几部分
1.scrapy startproject tutorial
我们来看看Scrapy项目下都有些什么
scrapy.cfg: 项目的配置文件 tutorial/: 该项目的python模块。在此放入代码(核心) tutorial/items.py: 项目中的item文件.(这是创建容器的地方,爬取的信息分别放到不同容器里) tutorial/pipelines.py: 项目中的pipelines文件 tutorial/settings.py: 项目的设置文件.(我用到的设置一下基础参数,比如加个文件头,设置一个编码) tutorial/spiders/: 放置spider代码的目录. (放爬虫的地方)
容器(items)的定义,容器不一定是一开始全部都定义好的,可以跟随项目的更新一点点向里面添加
代码语言:javascript复制import scrapy
class DmozItem(scrapy.Item): #创建一个类,继承scrapy.item类,就是继承人家写好的容器
title = scrapy.Field() # 需要取哪些内容,就创建哪些容器
link = scrapy.Field()
desc = scrapy.Field()
一个简单的爬虫小例子
代码语言:javascript复制import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"https://www.baidu.com/"
]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'a') as f:
f.write(response.body)
里面的parse方法,这个方法有两个作用:
1.负责解析start_url下载的Response 对象,根据item提取数据(解析item数据的前提是parse里全部requests请求都被加入了爬取队列) 2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request 对象 这两点简单来说就是编写爬虫的主要部分
那么爬虫编写完,我们需要启动爬虫。
代码语言:javascript复制cd XXX
进入到你的文件夹下 输入命令,启动爬虫
代码语言:javascript复制scrapy crawl dmoz
那么启动爬虫时发生了什么?
Scrapy为Spider的 start_urls 属性中的每个url创建了Request 对象,并将 parse 方法作为回调函数(callback)赋值给了requests,而requests对象经过调度器的调度,执行生成response对象并送回给parse() 方法进行解析,所以请求链接的改变是靠回调函数实现的。
代码语言:javascript复制yield scrapy.Request(self.url, callback=self.parse)
三、Scrapy框架的整体架构和组成
先来上一张官方的Scrapy的架构图。
图中绿色的是数据的流向
我们看到图里有这么几个东西,分别是:
- Spiders:爬虫,定义了爬取的逻辑和网页内容的解析规则,主要负责解析响应并生成结果和新的请求
- Engine:引擎,处理整个系统的数据流处理,出发事物,框架的核心。
- Scheduler:调度器,接受引擎发过来的请求,并将其加入队列中,在引擎再次请求时将请求提供给引擎
- Downloader:下载器,下载网页内容,并将下载内容返回给spider
- ItemPipeline:项目管道,负责处理spider从网页中抽取的数据,主要是负责清洗,验证和向数据库中存储数据
- Downloader Middlewares:下载中间件,是处于Scrapy的Request和Requesponse之间的处理模块
- Spider Middlewares:spider中间件,位于引擎和spider之间的框架,主要处理spider输入的响应和输出的结果及新的请求middlewares.py里实现
是不感觉东西很多,很乱,有点懵!没关系,框架之所以是框架因为确实很简单 我们再来看下面的这张图!你就懂了!
最后我们来顺一下scrapy框架的整体执行流程:
- spider的yeild将request发送给engine
- engine对request不做任何处理发送给scheduler
- scheduler,生成request交给engine
- engine拿到request,通过middleware发送给downloader
- downloader在获取到response之后,又经过middleware发送给engine
- engine获取到response之后,返回给spider,spider的parse()方法对获取到的response进行处理,解析出items或者requests
- 将解析出来的items或者requests发送给engine
- engine获取到items或者requests,将items发送给ItemPipeline,将requests发送给scheduler(ps,只有调度器中不存在request时,程序才停止,及时请求失败scrapy也会重新进行请求)
四、Scrapy的中间件详解
参考资料
[1]
Scrapy的中间件详解: https://www.cnblogs.com/fengf233/p/11453375.html
[2]
原文链接: https://www.jianshu.com/p/cecb29c04cd2