爬虫Scrapy笔记(一)、安装及初始化

因为业务的需要,最近需要研究爬虫实现相关功能。故此,新开一篇记录学习过程。
从网上查询相关的资料,母目前使用的比较多的开源框架可能要算 Scrapy 了。
百度百科是这样介绍的:

- Scrapy 是 Python 开发的一个快速、高层次的屏幕抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。Scrapy 用途广泛,可以用于数据挖掘、监测和自动化测试。

- Scrapy 吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如 BaseSpider、sitemap 爬虫等,最新版本又提供了 web2.0 爬虫的支持。

Scrapy 架构介绍(摘自百度百科)

- Scrapy Engine(引擎):负责 Spider、ItemPipeline、Downloader、Scheduler 中间的通讯,信号、数据传递等。
- Scheduler(调度器):它负责接受引擎发送过来的 Request 请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载 Scrapy Engine(引擎)发送的所有 Requests 请求,并将其获取到的 Responses 交还给 Scrapy Engine(引擎),由引擎交给 Spider 来处理。
- Spider(爬虫):它负责处理所有 Responses,从中分析提取数据,获取 Item 字段需要的数据,并将需要跟进的 URL 提交给引擎,再次进入 Scheduler(调度器)。
- Item Pipeline(管道):它负责处理 Spider 中获取到的 Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
- Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider 中间件):一个可以自定扩展和操作引擎和 Spider 中间通信的功能组件。

大概的工作流程如下:

- 爬虫引擎启动之后,爬虫根据初始的url经由Engine交给调度器;
- 调度器按照一定的逻辑排序,在通过Engine依赖于Downloader请求相关资源;
- Downloader将获取到的结果返回给爬虫来解析;
- 爬虫解析完成后,将一部分结果通过pipeline做持久化;
- 另一部需要继续爬取的任务再经由由Engine交给调度器;
- 按照上述逻辑重复执行,直到没有可以爬取的数据;
- 爬取停止,退出;

这样我们就有了一个初步的理解,理论部分结束。我们开始动手吧,实际使用加上阅读源码才能了解的更彻底。
参照相关的教程,大致如下:

安装 Scrapy,我本地因为使用的是 conda 环境,他可以自己解决各种依赖,很方便,直接安装就可以了,这里不再赘述。
安装好了之后,检查下版本 【scrapy version】,出现版本号,表示安装完成

接下来创建一个项目,我们命名为 sample,【scrapy startproject sample】,提示创建完成

我们看下创建的项目文件,和上面的组件基本上对应的,具体的功能不再赘述

这里有两个文件,一个是 settings,主要是做设置的,是项目中程序相关的配置,是一个全局配置。譬如我想配置一个常量,可以写在这个文件里。还有一个 scrapy.cfg 这样也是一个配置信息,主要是项目的相关信息。

当然了你也可以不使用命令行,你也可以手动创建,都是可以的,只不过这样麻烦一点而已。话说回来谁喜欢和自己过不去呢。

好了,接下来我们需要新建一只属于我们自己爬虫,本着开源学习的精神,我们以爬取开源中国 https://www.oschina.net/ 为例:

当然,这一步也可手动创建,其实也很简单,就是创建一个集成scrapy的子类

# -*- coding: utf-8 -*-
import scrapy


class OschinaSpider(scrapy.Spider):
    name = "oschina"
    allowed_domains = ["https://www.oschina.net/"]
    start_urls = ['http://https://www.oschina.net//']

    def parse(self, response):
        pass

爬虫的名字叫oschina,爬虫会爬取 https://www.oschina.net/ 域名下url,起始url是 https://www.oschina.net/ 。
这样一只爬虫就建好了,下一步我们将丰满这只爬虫,让它去爬取我们需要的信息。

发表评论

邮箱地址不会被公开。 必填项已用*标注