scrapy通过urls'路径将数据导出到文件

时间:2018-05-01 00:25:35

标签: scrapy web-crawler

当我从HTML页面导出数据时,如何更改scrapy的代码,以便通过网址保存文件。

例如: 这个页面(http://example/big/ppp)有很多页面链接

  1. http://example/big/ppp/a
  2. http://example/big/ppp/b
  3. http://example/big/ppp/c
  4. ......
  5. 我想保存

    中的数据

    http://example/big/ppp/a d:/ppp/a.csv

    http://example/big/ppp/b d:/ppp/b.csv

    http://example/big/ppp/c d:/ppp/c.csv

    因为这个页面(http://example/big/ppp)有很多类似的链接 http://example/big/ppp/ahttp://example/big/ppp/b

    你能帮助我,善良的人!

1 个答案:

答案 0 :(得分:0)

您可以使用scrapy管道来完成这项工作,在您要导出的项目中添加一个字段,例如名为' source' (http://example/big/ppp/a)记录项目的来源:

from scrapy import signals
from scrapy.contrib.exporter import CsvItemExporter

class MyCsvPipeline(object):
    def __init__(self):
        self.csvfiles = {}
        self.exporter = {}

    @classmethod
    def from_crawler(cls, crawler):
        pipeline = cls()
        crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
        return pipeline

    def close_spider(self, spider):
        for e in self.exporter.values():
            e.finish_exporting()
        for f in self.csvfiles.values():
            f.close()

    def process_item(self, item, spider):
        csv = item['source'].split('/')[-1] + '.csv'
        if csv not in self.csvfiles:
            newfile = open('d:/ppp/'+csv, 'wb')
            self.csvfiles[csv] = newfile
            self.exporter[csv] = CsvItemExporter(newfile)
            self.exporter[csv].start_exporting()
        self.exporter[csv].export_item(item)

        return item

在settings.py中应用此管道

ITEM_PIPELINES = {
    'xxxx.pipelines.MyCsvPipeline': 300,
}

另一种选择 使用scrapy crawl xxx -t csv -o all.csv --loglevel=INFO将所有项目导出到csv,然后使用另一个脚本根据' source'将其分成小csv。