Scrapy框架是比较常用且成熟的python爬虫框架,可以高效率地爬取web页面并提取出我们关注的结构化数据。前面介绍了手写爬虫的例子,但是每个爬虫都这么写,效率不高,同时造成代码的冗余。而使用爬虫框架可以使代码更加简洁,大大提升效率。本文主要了解一下Scrapy整体的架构、工作流程、常用命令以及创建Scrapy项目。
1.Scrapy架构
如上图所示,scrapy主要由Scrapy Engine、Scheduler、Downloader Middlewares、Downloader、Spider、Spider Middlewares、Item Pipline组成。
1.Scrapy Engine:是整个Scrapy架构的核心,负责控制整个数据处理流程、触发业务处理。
2.Scheduler:相当于一个优先队列,存储待爬取的网址,并确定这些网址的优先级,决定下一次爬取哪个网址。
3.Downloader:下载根据URL爬取的网页资源。
4.Downloader Middlewares:对Downloader和Scrapy Engine之间的通信进行处理,可以通过加入自定义代码,对Scrapy功能进行扩展。
5.Spider:爬虫组件,即Scrapy项目中的Spider文件夹内的文件,每个Spider负责实现特定的爬虫功能。
6.Spider Middlewares:主要对爬虫组件与Scrapy Engine之间的通信进行处理,加入自定义代码,可以扩展Scrapy功能。
7.Item Pipline:该组件主要用于接收Spider组件提取出来的Item,并对这些Item进行相应的处理。
2.Scrapy工作流程
1.Scrapy Engine会将爬虫文件中start_urls属性中的网址传递给Scheduler中
2.Scheduler分析出下一次要爬取的网址,并传递给Scrapy Engine。
3.Scrapy Engine获取需要爬取的网址,将其传递给Downloader Middlewares
4.Downloader Middlewares把网址传递给Downloader。
5.Downloader根据获取到的网址,向互联网对应的网址发送request请求,进行网页的下载。
6.互联网中对应的网址接收到request请求之后,产生response,并传递给Downloader 。
7.Downloader 接收到response之后,传递给Downloader Middlewares。
8.Downloader Middlewares与Scrapy Engine进行通信,将对应的response传递给Scrapy Engine
9.Scrapy Engine接收到response之后,将其传递给Spider Middlewares。
10.Spider Middlewares接收到response,将其传递给对应的Spider进行处理。
11.Spider处理之后,会得到提取出的数据和新的请求信息,Spider会将其传递给Spider Middlewares。
12.Spider Middlewares将信息传递给Scrapy Engine。
13.Scrapy Engine获取信息之后,一方面把Item传递给Item Pipline,进一步处理,另一方面将新的请求信息传递给Scheduler,由Scheduler进一步确定网址。
3.常用命令
1.scrapy startproject --logfile="log文件路径/x.log" --loglevel=DEBUG 项目名:表示创建一个Scrapy项目,其中--logfile和--loglevel属性可以缺省。
2.scrapy --logfile="xx" fetch 网址:显示爬虫爬取的过程。使用--headers属性则会输出网址的headers信息。
3.scrapy view 网址:实现下载某个网页并用浏览器查看
4.scrapy runspider --loglevel=INFO 爬虫文件名(包含后缀):直接运行一个爬虫文件
5.scrapy crawl 爬虫名:启动爬虫项目中某个爬虫
6.scrapy list:列出当前可以使用的爬虫文件
7.scrapy genspider -l:查看当前可以使用的爬虫模板(一般模板为basic、crawl、csvfeed、xmlfeed)
8.scrapy genspider -t 模板名 爬虫名(不含后缀) 域名:创建爬虫文件
9.Scrapy check 爬虫名:使用合同的方式对爬虫进行测试。
4.建立Scrapy项目简单案例
该项目是在Pycharm上完成的。
1.建立爬虫项目:scrapy startproject firstproject
以下是项目结构:
其中firstproject表示项目名,内部还会生成一个同名文件夹,表示项目核心文件夹,spiders包里面存放着不同的爬虫文件;items.py表示希望爬取的数据结构;middlewares.py表示中间件文件,里面存放一些自定义代码用于Scrapy的扩展;piplines.py主要对items.py里面定义的数据进一步的处理;settings.py里面包含一些对爬虫项目的设置信息。
注:pycharm需要点击项目右键-->mark directory as -->sources root,将其变成一个文件夹。如下图所示:
2.编写items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class FirstprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
urlname = scrapy.Field()
urlkey = scrapy.Field()
urlcr = scrapy.Field()
urladdr = scrapy.Field()
其中urlname、urlkey等是需要提取的信息,将这些属性通过调用scrapy.Field()将其Item化,相当于用对象保存数据。
3.Spider编写
创建爬虫文件,首先通过模板创建需要的爬虫文件,然后对爬虫文件进行详细编写。
打开刚建立的爬虫,默认代码如下:
# -*- coding: utf-8 -*-
import scrapy
class FirstSpider(scrapy.Spider):
name = 'first'
allowed_domains = ['sina.com.cn']
start_urls = ['http://sina.com.cn/']
def parse(self, response):
pass
其中,该爬虫继承scrapy.Spider类,name属性表示爬虫名,allowed_domains表示域名,start_urls表示需要爬取的网址,parse(self,response)函数用来对Item进行操作。
修改成本项目需要的代码如下:
# -*- coding: utf-8 -*-
import scrapy
from firstproject.items import FirstprojectItem
class FirstSpider(scrapy.Spider):
name = 'first'
allowed_domains = ['sina.com.cn']
start_urls = ['http://sports.sina.com.cn/basketball/nba/2019-05-09/doc-ihvhiqax7645328.shtml',
'http://sports.sina.com.cn/basketball/nba/2019-05-09/doc-ihvhiews0833865.shtml',
'http://sports.sina.com.cn/basketball/nba/2019-05-09/doc-ihvhiews0793383.shtml']
def parse(self, response):
item = FirstprojectItem()
item["urlname"] = response.xpath("/html/head/title/text()")
print(item["urlname"])
4.运行指定爬虫文件
这里将运行上述first.py爬虫文件:scrapy crawl first --nolog.执行上述命令之后,得到如下结果:
通过本文的讲解,可以初步了解何为Scrapy,Scrapy项目结构以及如何建立Scrapy项目进行爬虫。