方法一、基于终端命令
parse方法中存在一个返回值,一般是字典或者列表,将该返回值存储到本地文件中,只需要执行指令:scrapy crawl xxx -o filePath
该方法简洁高效,但是数据只能存储到指定类型的文件中,局限性叫强
Set a supported one (('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')) after a colon at the end of the output URI (i.e. -o/-O <UR
I>:<FORMAT>) or as a file extension.
方法二、基于管道的持久化存储
实现流程:
- parse方法中进行数据解析
- 对取得的数据进行分析整合,在item.py文件中定义相关的属性,将解析到的数据整合存储到item类型的对象中去
- 将item类型的对象交给管道进行持久化存储
- 在pipelines.py文件中的process_item方法中通过return item将接受到的数据进行持久化存储
- 在settings.py中开启管道
基于管道的持久化存储的爬虫案例
爬虫文件
import scrapy
from qiushibaike.items import QiushibaikeItem
class QiubaiSpider(scrapy.Spider):
name = 'qiubai'
allowed_domains = ['https://www.qiushibaike.com/imgrank/']
start_urls = ['https://www.qiushibaike.com/imgrank/']
def parse(self, response):
div_list = response.xpath('//div[contains(@class,"col1")]/div')
for li in div_list:
# 解析数据
name = li.xpath('./div[1]/a[2]/h2/text()')[0].extract()
content = li.xpath('./a[1]/div[1]/span/text()')[0].extract()
# 去除空行
name = name.strip('\n')
content = content.strip('\n')
# 实例化一个item对象
item = QiushibaikeItem()
item['author'] = name
item['content'] = content
yield item
item.py
import scrapy
class QiushibaikeItem(scrapy.Item):
# 定义item对象中的属性
author = scrapy.Field()
content = scrapy.Field()
piplines.py
class QiushibaikePipeline:
def __init__(self):
self.fp = None
# 若直接在process_item方法中打开data.txt文件,那么该操作会执行多次,即文件会被重复打开
# 将文件的开启和关闭分别写在open_spider和close_spider方法中,使得该操作只执行一次
def open_spider(self, spider):
print('爬虫开始.....')
self.fp = open('./data.txt', 'w', encoding='utf-8')
def process_item(self, item, spider):
self.fp.write(item['author'] + ":" + item['content'] + '\n')
return item
def close_spider(self, spider):
self.fp.close()
print("爬虫结束")
settings.py
# 开启通道
ITEM_PIPELINES = {
'qiushibaike.pipelines.QiushibaikePipeline': 300,
}