Получить список данных в разных разделах о scrapy - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужна очистка данных в разных разделах сайта.В первом разделе я получаю данные от клиента и идентификатор ваших заказов.С этим идентификатором я получаю доступ ко второму разделу и получаю детали товаров из заказов.Итак, мне нужно объединить результат диктата «клиент» со списком «заказов» со списком «итенов».

По сути, мой алгоритм:

def parse1(self, response):
    customer['data'] = response.xpath("path to customer data").extract()
    customer_orders = response.xpath("path to customer orders")
    for index, customer_order in enumarate(customer_orders):
         id = customer_order.xpath('path to order id').extract_first()
         customer['orders'].append({'id' : id})
         yield scrapy.FormRequest(url="www.url.com/orders"+id, callback=self.parse2, method='GET', meta= {'customer': customer})

def parse2(self, response):
    customer = response.meta['customer']
    customer['orders']['items'] = []  
    for index, order_item in response.xpath("path to order items"):
           customer['orders']['items'].append({"items_details": order_item.xpath("path to items details").extract_first()})
    yield customer

Но я не могу закодировать эту логику с асинхронной архитектурой Scrapy.Ближе к тому, что я получил, было напечатано много раз тот же самый заказ клиента в результате.Кто-нибудь может помочь это сделать?

1 Ответ

0 голосов
/ 28 сентября 2018

Поскольку у вас есть запросы типа A и B на 1 элемент, у вас есть два цепных запроса, чтобы действовать по порядку: сначала сканирование A, а затем сканирование B N раз:

customer -> N order pages -> 1 item

Итак, ваша логика сканирования:

  1. Получить данные о клиентах
  2. Получить идентификаторы заказов
    2.1 Идентификатор всплывающего заказа
    2.2 Идентификатор заказа при сканировании
    2.3 Прикрепить детали заказа к # 1 данным клиента
  3. вернуть данные клиента с данными заказа

В скрапе это будет выглядеть примерно так:

def parse_customer(self, response):
    # find root customer data
    customer = {}
    # find order ids
    orders = [1,2,3]
    # schedule first order request and start order scraping loop
    first_order = order_url + orders.pop(0)
    yield Request(
        first_order, 
        self.parse_orders, 
        meta={'orders': orders, 'item': customer},
        )

def parse_orders(self, response):
    item = response.meta['item']
    remaining_orders = response.meta['orders']
    # first loop it's [1, 2] but finally it'll be []
    if not remaining_orders:  # all orders are scraped -> save item
        yield item
        return

    # attach found order details to root customer item we have
    found_orders = ...
    item['orders'].expand(found_orders)

    # scrape next order
    next_order = order_url + orders.pop(0),
    yield Request(
        next_order,
        self.parse_orders, 
        meta={'orders': orders, 'item': item},
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...