Scrapy框架入门

18 篇文章 0 订阅
11 篇文章 0 订阅

Scrapy简介

Scrapy 功能非常强大,爬取效率高,相关扩展组件多,可配置和可扩展程度非常高,它几乎可以应对所有反爬网站,是目前 Python 使用最广泛的爬虫框架。它是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,我们只需要定制开发几个模块就可以轻松实现一个爬虫。

架构介绍

首先我们来看一下Scrapy框架的架构,如下图所示。
在这里插入图片描述
它可以分为如下的几个部分:

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

首先,引擎从爬虫程序中获取到第一个要爬取的URL,并传递给调度器入列,然后从调度器中请求要爬取的URL,之后通过下载器中间件传递给下载器进行下载,一旦页面下载完毕,下载器生成该页面的Response,并将其通过下载器中间件传给引擎,然后由引擎传递给爬虫程序进行处理。从中提取数据,以及新的Request传递给引擎,引擎将Item传递给项目管道,新的请求传递给调度器进行入列。直至调度器中没有更多的请求,引擎关闭,爬取结束。

Scrapy入门

下面通过一个简单的项目,完成Scrapy抓取流程,通过这个过程,来进一步了解Scrapy的用法。

创建项目

创建一个Scrapy项目,我们可以通过Scrapy命令来生成项目,命令如下所示:

scrapy startproject image360

这个命令可以在任意文件夹运行,如果提示权限问题,可以加sudo运行该命令。这个命令将会创建一个名为image360文件夹,文件夹结构如下所示:
在这里插入图片描述
scrapy.cfg:它是 Scrapy 项目的配置文件,其内定义了项目的配置文件路径、部署相关信息等内容
items.py:它定义 Item 数据结构,所有的 Item 的定义都可以放这里
pipelines.py:它定义 Item Pipeline 的实现,所有的 Item Pipeline 实现都可以放这里
settings.py:它定义项目的全局配置
middlewares.py:它定义 Spider Middlewares 和 Downloader Middlewares 的实现
spides:其内包含一个个 Spider 的实现,每个 Spider 都有一个文件

创建Spider

Spider是自己定义的类,Scrapy用它来从网页中抓取内容,并解析抓取的结过。这个类必须继承Scrapy提供的Spider类scrapy.Spider,还要定义Spider的名称和起始请求,以及如何处理爬取结果的方法。

通过命令行创建一个Spider,比如要生成images这个Spider,可以执行如下命令:

cd image360
scrapy genspider images images.so.com

进入刚才创建的image360文件夹,然后执行genspider命令。第一个参数是spider的名称,第二个参数是网站域名。执行后会在spiders文件夹中生成一个images.py,也就是刚刚创建的爬虫程序。

创建Item

Item 是保存爬取数据的容器,它的使用方法和字典类似。创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段。观察目标网站,我们可以提取到的信息有id、url、title、thumb。

可以定义Item如下:

import scrapy

class Image360Item(scrapy.Item):
    id = scrapy.Field()
    url = scrapy.Field()
    title = scrapy.Field()
    thumb = scrapy.Field()

根据要提取的信息定义了四个字段,接下来爬取时我们会使用到这个Item。

解析Response

由于爬虫程序中的parse()方法的参数response是爬取url后的结果,所以在该方法中,我们需要对响应数据进行解析,比如进一步分析源代码内容,或者从中获取新的请求对象。
在这里插入图片描述
首先看看网页结构,可以看到每一张图片的信息都在list中,因此我们可以先找到list,然后提取每一张图片的信息。
由于Response是Json字符串类型,所以在此我们可以通过以下方法提取信息。

def parse(self, response):
    result = response.json()
    for image in result.get('list'):
        item = Image360Item()
        item['id'] = image.get('id')
        item['url'] = image.get('qhimg_url')
        item['title'] = image.get('title')
        item['thumb'] = image.get('qhimg_thumb')
        yield item
保存到文件

如果想将结果保存到文件中,我们可以通过Scrapy提供的命令将item结果输出,例如,我们想将上面的结果保存为CSV文件,可以执行如下命令:

scrapy crawl images -o images.csv

命令运行后,项目内多了一个images.csv文件,包含了刚才抓取的所有信息,内容是csv格式。输出格式多种多样,还可以是json格式。

同样,我们也可以通过Item Pipeline 来实现将数据保存到文件。我们可以在pipelines.py文件中写如下代码:

class Image360Pipeline:
    def process_item(self, item, spider):
        with open('images.csv','a+',encoding='utf8',newline='')as f_obj:
            f_obj.write(item['id']+','+item['url']+','+item['title']+','+item['thumb']+'\n')
        return item

不过我们一般使用Pipeline来实现更加复杂的操作,比如将数据保存到数据库。在之后我们将会学习如何将数据保存到数据库,以及Scrapy的更多知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值