Как использовать 2 продукта из 2 разных методов в скрапе? - PullRequest
0 голосов
/ 10 июня 2018

Я новичок в питоне и скрапе.Я получаю 2 элемента из 2 разных методов, первый - для данных на первой странице, второй - для данных на второй странице.Я не могу сохранить данные в том же порядке, второй элемент сохраняется после первого, но мне нужно сохранить оба одновременно.Заранее спасибо.

class FirstPipeline(object):

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

    def spider_opened(self, spider):
        current_date = datetime.now().strftime("%Y%m%d")
        filename = 'License_Vehicle Inspection Stations_NY_CurationReady_' + current_date +'_v1.csv'
        self.file = open(filename, 'w+b')
        self.exporter = CsvItemExporter(self.file, delimiter = '|')

        self.exporter.csv_writer.writerow(["Premises Name","Principal's Name","","Trade Name","Zone","County","Address/zone","License Class","License Type Code","License Type","Expiration Date","License Status","Serial Number","Credit Group","Filing Date","Effective Date"," "," "," "," "])
        self.exporter.fields_to_export = ["company_name","mixed_name","mixed_subtype","dba_name","zone","county","location_address_string","licence_class","licence_type_code","permity_subtype","permit_lic_exp_date","permit_licence_status","permit_lic_no","credit_group","permit_lic_eff_date","permit_applied_date","permit_type","url","source_name","ingestion_timestamp"]
        self.exporter.start_exporting()


    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

    def process_item(self, item, spider):
        print("got the item in pipeline")
        self.exporter.export_item(item)
        return item

class SecondPipeline(object):

    def process_item(self, item, spider):
        if isinstance(item, SecondItem):
            pass

        return item

1 Ответ

0 голосов
/ 10 июня 2018

Raj725, ваш вопрос актуален для начинающих в Scrapy и может быть на Python.У меня был тот же вопрос, прежде чем я прочитал документацию Scrapy.Невозможно понять Scrapy без чтения документации.Вы можете начать читать учебник , затем раздел Элемент и раздел Конвейер.

Это пример того, как получить несколько типов данных.

1 Необходимость предварительной обработки элементов, которые вам нужны вфайл items.py:

from scrapy import Item, Field

class FirstItem(Item):
    field_one = Field()
    field_two = Field()

class SecondItem(Item):
    another_field_one = Field()
    another_field_two = Field()
    another_field_three = Field()

2 Теперь вы можете использовать Предметы в своем коде терапии.Вы можете получить Предметы в любом месте, где у вас есть данные для сохранения:

from ..items import FirstItem, SecondItem

        item = FirstItem(
            field_one=response.css("div.one span::text").extract_first(),
            field_two=response.css("div.two span::text").extract_first()
        )
        yield item

        item = SecondItem(
            another_field_one='some variable one',
            another_field_one='some variable two',
            another_field_three='some variable tree'
        )
        yield item

3 Пример файла pipe.py.Не забудьте проверить тип элемента перед его сохранением.В конце «process_item» вы должны вернуть товар.

from .items import FirstItem, SecondItem

class FirstPipeline(object):
    def process_item(self, item, spider):
        if isinstance(item, FirstItem):            
            # Save your data here. It's possible to save it to CSV file. Also you can put data to any database you need.
            pass

        return item

class SecondPipeline(object):
    def process_item(self, item, spider):
        if isinstance(item, SecondItem):            
            # Save your data here. It's possible to save it to CSV file. Also you can put data to any database you need.
            pass

        return item

4 Не забудьте объявить свои конвейеры в settings.py.Scrapy не будет использовать Pilelines без него.

ITEM_PIPELINES = {
     'scrapy_project.pipelines.FirstPipeline': 300,
     'scrapy_project.pipelines.SecondPipeline': 300,
}

Я не предоставил готовый код.Я предоставил примеры кода, чтобы понять, как он работает.Можно добавить его в свой код и внести необходимые изменения.Я не показал, как сохранить элементы в файлы CSV.Вы можете импортировать модуль "CSV".Также вы можете использовать CsvItemExported в вашем pipeline.py из "scrapy.exporters".Я привел ссылку с примером того, как сохранить разные элементы в разные файлы CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...