爬虫工程化: 对爬虫的功能进行模块化的开发. 并达到可以批量生产的效果(不论是开发还是数据产出)

整个工作流程,

  1. 爬虫中起始的url构造成request对象, 并传递给调度器.

  2. 引擎调度器中获取到request对象. 然后交给下载器

  3. 下载器来获取到页面源代码, 并封装成response对象. 并回馈给引擎

  4. 引擎将获取到的response对象传递给spider, 由spider对数据进行解析(parse). 并回馈给引擎

  5. 引擎将数据传递给pipeline进行数据持久化保存或进一步的数据处理.

  6. 在此期间如果spider中提取到的并不是数据. 而是子页面url. 可以进一步提交给调度器, 进而重复步骤2的过程

名词解析

  1. 引擎(engine)

    scrapy的核心, 所有模块的衔接, 数据流程梳理.

  2. 调度器(scheduler)

    本质上这东西可以看成是一个队列. 里面存放着一堆我们即将要发送的请求. 可以看成是一个url的容器. 它决定了下一步要去爬取哪一个url. 通常我们在这里可以对url进行去重操作.

  3. 下载器(downloader)

    它的本质就是用来发动请求的一个模块. 小白们完全可以把它理解成是一个get_page_source()的功能. 只不过这货返回的是一个response对象.

  4. 爬虫(spider)

    这是我们要写的第一个部分的内容, 负责解析下载器返回的response对象.从中提取到我们需要的数据.

  5. 管道(pipeline)

    这是我们要写的第二个部分的内容, 主要负责数据的存储和各种持久化操作.

scrapy框架的使用流程:

  1. 创建爬虫项目. scrapy startproject xxx
  2. 进入项目目录. cd xxx
  3. 创建爬虫 scrapy genspider 名称 抓取域
  4. 编写item.py 文件, 定义好数据item
  5. 修改spider中的parse方法. 对返回的响应response对象进行解析. 返回item
  6. 在pipeline中对数据进行保存工作.
  7. 修改settings.py文件, 将pipeline设置为生效, 并设置好优先级
  8. 启动爬虫 scrapy crawl 名称

自定义数据传输结构item

我们使用字典作为数据传递的载体, 但是如果数据量非常大. 由于字典的key是随意创建的. 极易出现问题, 此时再用字典就不合适了. Scrapy中提供item作为数据格式的声明位置. 我们可以在items.py文件提前定义好该爬虫在进行数据传输时的数据格式. 然后再写代码的时候就有了数据名称的依据了.

item.py文件

import scrapy

class GameItem(scrapy.Item):
    # 定义数据结构
    name = scrapy.Field()
    category = scrapy.Field()
    date = scrapy.Field()

spider中. 这样来使用:

from mySpider_2.items import GameItem

# 以下代码在spider中的parse替换掉原来的字典
item = GameItem()
item["name"] = name
item["category"] = category
item["date"] = date
yield item