爬虫工程化: 对爬虫的功能进行模块化的开发. 并达到可以批量生产的效果(不论是开发还是数据产出)
整个工作流程,
-
爬虫中起始的url构造成request对象, 并传递给调度器.
-
引擎
从调度器
中获取到request对象. 然后交给下载器
-
由
下载器
来获取到页面源代码, 并封装成response对象. 并回馈给引擎
-
引擎
将获取到的response对象传递给spider
, 由spider
对数据进行解析(parse). 并回馈给引擎
-
引擎
将数据传递给pipeline进行数据持久化保存或进一步的数据处理. -
在此期间如果spider中提取到的并不是数据. 而是子页面url. 可以进一步提交给调度器, 进而重复
步骤2
的过程
名词解析
-
引擎(engine)
scrapy的核心, 所有模块的衔接, 数据流程梳理.
-
调度器(scheduler)
本质上这东西可以看成是一个队列. 里面存放着一堆我们即将要发送的请求. 可以看成是一个url的容器. 它决定了下一步要去爬取哪一个url. 通常我们在这里可以对url进行去重操作.
-
下载器(downloader)
它的本质就是用来发动请求的一个模块. 小白们完全可以把它理解成是一个get_page_source()的功能. 只不过这货返回的是一个response对象.
-
爬虫(spider)
这是我们要写的第一个部分的内容, 负责解析下载器返回的response对象.从中提取到我们需要的数据.
-
管道(pipeline)
这是我们要写的第二个部分的内容, 主要负责数据的存储和各种持久化操作.
scrapy框架的使用流程:
- 创建爬虫项目.
scrapy startproject xxx
- 进入项目目录.
cd xxx
- 创建爬虫
scrapy genspider 名称 抓取域
- 编写
item.py
文件, 定义好数据item - 修改spider中的parse方法. 对返回的响应response对象进行解析. 返回item
- 在pipeline中对数据进行保存工作.
- 修改
settings.py
文件, 将pipeline设置为生效, 并设置好优先级 - 启动爬虫
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