【Scrapy】Scrapy教程7——存储数据
上一节我们对爬虫程序的默认回调函数parse做了改写,提取的数据可以在Scrapy的日志中打印出来了,光打印肯定是不行的,还需要把数据存储,数据可以存到文件,也可以存到数据库,我们一一来看。
存储数据到文件
首先我们看看如何将数据存储到文件,在讲[[【Scrapy】Scrapy教程5——第一个Scrapy项目]]时,我们改写了prase函数,将首页存储到了一个shouye.html
文件中,这便是我们的简单的数据存储,但这个存储方式是我们纯手写的代码,存的是整个页面,并非我们想要的数据。
这节主要讲存储数据,我们看下通过Scrapy命令直接存储数据,在这之前我们将parse函数修改下。
def parse(self, response):
# 从获取的所有文章中提取链接和标题
for article in response.css(".card")[1:]:
yield {
"title": article.xpath("./a").css("span::text").get(),
"link": self.start_urls[0] + article.xpath("./a/@href").get(),
}
然后,我们在到命令行中,运行以下命令。
scrapy crawl shouye -o titles.json
上面这条命令会将我们提取的数据存储到titles.json
文件中,存储后的效果如下图所示。
我们会发现,存储的数据没有错,但是被整体存到了一个大的字典中,这不是我想要的结果,我只要数据一行一行的存储下来就好了,我们可以用以下命令。
scrapy crawl shouye -o titles.jsonl
没错,我们换个存储格式,就可以了。
存储数据到数据库
上面这种方法存储简单的数据可以,对于复杂结构的数据存储,就要引入Items和pipelines了。
Items
我们爬取页面的目标就是将非结构化数据提取为结构化数据,而Item就是Scrapy提供的一个类,用于定义通用输出数据格式的。Scrapy可以将提取的数据,作为Item返回,类似python的键值对。
Item Types
Scrapy通过itemadapter支持字典、Item对象、数据类对象、attrs对象几种Item类型。
- 字典:类似Python的键值对字典
- Item对象:Item提供的一个类似dict的API,可以支持更高级的特性
- dataclass对象:允许定义具有字段名称的项目类,可以指定字段的类型和元数据
- attrs对象:允许定义具有字段名称的项目类,可以指定字段的类型和元数据