scrapy экспорт данных в файлы по urls'path - PullRequest
0 голосов
/ 01 мая 2018

Как я могу изменить код Sorce Scorce, чтобы сохранить файлы по URL, когда я экспортирую данные со страниц HTML.

Например: На этих страницах (http://example/big/ppp) есть много ссылок на страницы

  1. http://example/big/ppp/a
  2. http://example/big/ppp/b
  3. http://example/big/ppp/c
  4. ......

и я хочу сохранить данные из

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

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

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

из-за этой страницы (http://example/big/ppp) есть много ссылок, которые как http://example/big/ppp/a http://example/big/ppp/b.

Так не могли бы вы помочь мне, добрый человек!

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать scrapy pipe для выполнения этой работы, добавить поле к элементу, который вы собираетесь экспортировать, например, с именем '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, затем используйте другой скрипт для разделения его на маленькие csv в соответствии с 'source'.

...