Size: a a a

2020 July 08

К

Кирилл in Scrapy
Кэлбек возвращает запрос(или несколько), и этот запрос ставится в очередь
источник

SM

Setplus Mac in Scrapy
так

то есть, parse должна выглядеть так?

   def parse(self, response):
       # FIXME: пулучаем все линки на след. страницы
       #        нам нужна ссылка, у которой текст  -- След.
       yield scrapy.Request(response.urljoin(response.url), callback=self.parse_item)
       next_page = ""
       all_links = response.css('div[data-pagination-num="1"] a')
       for a_sel in all_links:
           if a_sel.css('a::text').get() == 'След.':
               next_page = a_sel.css('a::attr(href)').get()
       if next_page:
           yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
источник

К

Кирилл in Scrapy
Setplus Mac
так

то есть, parse должна выглядеть так?

   def parse(self, response):
       # FIXME: пулучаем все линки на след. страницы
       #        нам нужна ссылка, у которой текст  -- След.
       yield scrapy.Request(response.urljoin(response.url), callback=self.parse_item)
       next_page = ""
       all_links = response.css('div[data-pagination-num="1"] a')
       for a_sel in all_links:
           if a_sel.css('a::text').get() == 'След.':
               next_page = a_sel.css('a::attr(href)').get()
       if next_page:
           yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
нет, зачем делать второй запрос для парсинга итема, если у тебя уже есть респонс
источник

К

Кирилл in Scrapy
нижняя часть уже лучше, ещё бы этот цикл поменять на нормальный селектор и будет ок
источник

SM

Setplus Mac in Scrapy
Кирилл
нет, зачем делать второй запрос для парсинга итема, если у тебя уже есть респонс
так, то есть первый запрос оставляем, чтобы спарсить данные с текущего респонса, а второй ... но мне всё ещё нужно перейти на след страницу...
источник

К

Кирилл in Scrapy
нет, первый запрос не нужен, тебе не нужно делать еще один запрос на ту же страницу чтоб получить данные, сразу же используешь респонс
источник

К

Кирилл in Scrapy
попробуй поменять  yield scrapy.Request(response.urljoin(response.url), callback=self.parse_item) на  yield from self.parse_item(response)
источник

К

Кирилл in Scrapy
запрос след страницы выглядит более менее норм сейчас
источник

К

Кирилл in Scrapy
а насчет цикла, xpath умеет делать поиск по тексту
источник

К

Кирилл in Scrapy
а там уже можно и на CrawlSpider поменять)
источник

SM

Setplus Mac in Scrapy
Кирилл
попробуй поменять  yield scrapy.Request(response.urljoin(response.url), callback=self.parse_item) на  yield from self.parse_item(response)
так, это теперь корректно отработало)
источник

SM

Setplus Mac in Scrapy
Кирилл
а там уже можно и на CrawlSpider поменять)
а это тип специальный паук, которые делает то, что я сейчас пытаюсь сделать?)
источник

К

Кирилл in Scrapy
Да, там можно удобно прописывать правила, какие ссылки собирать
источник

SM

Setplus Mac in Scrapy
аа
источник

SM

Setplus Mac in Scrapy
rules и LinkExtractor, да?
источник

К

Кирилл in Scrapy
Да
источник

SM

Setplus Mac in Scrapy
Понял, спасибо большое за терпеливое и хорошее объяснение!)
источник

SM

Setplus Mac in Scrapy
Так
А вот такой момент: как лучше парсить: через итемы или так?

def parse(self, response):
       for prod in response.css('div.product-item-container > div.product-item'):
           yield {
               'name': prod.css('div.product-item-title > a::text').get(),
               'desc': prod.css('meta[itemprop="description"]::attr(content)').get(),
               'cur price': prod.css('span.product-item-price-current::text').get(),
               'old price': prod.css('span.product-item-price-old::text').get(),
           }

       # FIXME: пулучаем все линки на след. страницы
       #        нам нужна ссылка, у которой текст  -- След.
       next_page = ""
       all_links = response.css('div[data-pagination-num="1"] a')
       for a_sel in all_links:
           if a_sel.css('a::text').get() == 'След.':
               next_page = a_sel.css('a::attr(href)').get()
       if next_page:
           yield response.follow(next_page, callback=self.parse)
источник

SM

Setplus Mac in Scrapy
Просто в последнем случае при вызове crawl -o file.csv или .json данные в нормальном структурированном виде выплёвываются
источник

SM

Setplus Mac in Scrapy
а если с итемами использовать, то нет
источник