多个spider写入csv时数据丢失

最近遇到一个问题,需要将多个spider抓取到的数据保存到同一个csv文件,但是数据会丢失。在测试的时候,发现数据不仅经常性丢失,而且每个spider写入数据前都会先写入列名,尝试通过判断文件是否存在来决定是否写入header,都不能解决问题。但是呢,分别写入不同的csv文件却不会出现数据丢失的情况,有点懵,看来对scrapy的运行机制的理解还是不够,目前还没找到问题所在。

在同事的帮助下,终于找到解决方法了:

1、先创建一个空的csv文件,只写入header

2、再用pandas将数据以追加的方式写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# pipelines.py
# -*- coding: utf-8 -*-

import csv

import datetime
import pandas as pd


class ScrapywebspiderPipeline(object):
"""将产品信息写入到csv"""
columns = ['urls', 'status', 'title','price']
date = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

def __init__(self):
self.file_name = '{}_{}.csv'.format('spider', self.date)
# 创建csv文件,并写入头部
with open(self.file_name, 'w', newline='', encoding='utf-8') as f:
c = csv.DictWriter(f, self.columns)
c.writeheader()

def process_item(self, item, spider):
df = pd.DataFrame([item], columns=self.columns)
df.to_csv(self.file_name, mode='a', header=False, index=False)
return item

在根目录下新建run.py,写上运行多个脚本的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding:utf-8 -*-
# Time: 2018/7/2 16:30

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy.spiderloader import SpiderLoader

settings = get_project_settings()
spider_loader = SpiderLoader(settings=settings)
spiders = spider_loader.list()
process = CrawlerProcess(settings=settings)

for spider in spiders:
process.crawl(spider)

process.start()

直接在终端运行(切到scrapy项目根目录下)

1
python -m run