Size: a a a

2021 May 27

A

Alexander in Scrapy
Привет, можете подсказать?
В пауке две функции. Первая парсит страницу и собирает инфо по элементам (допустим 5), по каждому наполняет словарь. У каждого элемента есть ссылка на страницу с его детализацией. В конце функции прописан переход по ссылке с детализацией каждого элемента и вызов второй функции для сбора детальной инфы и добавления в тот же словарь.
Проблема в том, что если отрабатывает вторая функция, то словарь заполняется только данными последнего элемента, а по 4м предыдущим данных нет. Если без перехода на детализирующие страницы, то словарь заполняется правильно.
источник

AR

Andrey Rahmatullin in Scrapy
объекты по ссылке передаются потому что
источник

AR

Andrey Rahmatullin in Scrapy
исправляй логику чтоб объекты отдельные были
источник

AR

Andrey Rahmatullin in Scrapy
ну и вообще, что за словарь? общий на всего паука?
источник

A

Andrii in Scrapy
проще показать код
источник

AR

Andrey Rahmatullin in Scrapy
угу
источник

(

(o_O) in Scrapy
dict.copy()
источник

A

Alexander in Scrapy
import scrapy
from ..items import DeliveryItem

class exper_delivery(scrapy.Spider):
   name = 'exper_delivery'
   start_urls = ['https://www...']

   def parse(self, response):
       item = DeliveryItem()
       documents_xpath = "..."
       documents = response.xpath(documents_xpath)
       for document in documents:
           ...
           name = document.xpath("./..//tbody/tr/td[2]/text()").get().strip()
           item['name'] = name
           ...
           link = document.xpath("normalize-space(./..//a/@href)").get()
           yield response.follow(link, callback=self.details_parse, cb_kwargs=dict(item=item))

   def details_parse(self, response, item):

       series_xpath = '...'
       exp_date_xpath = '...'
       item['series'] = response.xpath(series_xpath).get().strip()
       item['drug_exp_date'] = response.xpath(exp_date_xpath).get().strip()
       yield item
источник

AR

Andrey Rahmatullin in Scrapy
ну да, один и тот же итем передаётся везде
источник

A

Alexander in Scrapy
словарь один общий на паука, зачада - сделать запись, которая состоит из инфы на общей странице и детализации на странице перехода
источник

AR

Andrey Rahmatullin in Scrapy
надо копировать
источник

AR

Andrey Rahmatullin in Scrapy
а словаря я вообще не вижу в коде
источник

AR

Andrey Rahmatullin in Scrapy
речь про item = DeliveryItem() что ли
источник

(

(o_O) in Scrapy
Разжую: cb_kwargs=dict(item=item.copy())
источник

A

Alexander in Scrapy
да, у него класс class DeliveryItem(Item):
источник

A

Alexander in Scrapy
спасибо, буду пробовать
источник

AR

Andrey Rahmatullin in Scrapy
не надо называть итемы словарями, а "итем общий на паука" вообще нонсенс, особенно когда итем этот много раз йилдится
источник

МС

Михаил Синегубов... in Scrapy
item = DeliveryItem()
item['name'] = name
источник

МС

Михаил Синегубов... in Scrapy
создавай новый айтем в цикле
источник

(

(o_O) in Scrapy
Питон, как и куча других языков, передает структуры не по значению, а по ссылке
источник