Возвращение одного словаря, очищающего несколько страниц с помощью Scrapy - PullRequest
0 голосов
/ 08 апреля 2019

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

В этом конкретном случае верните выходные данные функции get_image со второй страницы и оставшиеся данные: Artist и album , но я не знаю, как передать эту информацию обратно в основной словарь.

Спасибо!

import scrapy                                                                       


class OsmoseSpider(scrapy.Spider):                                                  
    name = "osmose"                                                                 

    def start_requests(self):                                                       
        baseurl = 'https://www.osmoseproductions.com/liste/?lng=2&categ_rech=0&alpha=0&fmt=990001&srt=2&page='
        urls = []                                                                   
        for x in range(1,2):                                                        
            urls.append(baseurl+str(x))                                             
        for url in urls:                                                            
            yield scrapy.Request(url=url, callback=self.parse)                      


    def get_image(self, response):                                                  

        for im in response.xpath('//*[@id="img_product_page_osmose"]/img[@id="id_photo_principale"]/@src').getall():
            yield {'image': im}                                                    


    def parse(self, response):                                                      
        artist, album, link, images  = [], [], [], []                               
        for a in response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/span[1]/text()').getall():
            artist.append(a)                                                        
        for b in response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/span[2]/text()').getall():
            album.append(b)                                                         
        for l in response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/@href').getall():
            link.append(l)                                                          

        for x in link:                                                              
            next_page = x                                                           

            if next_page is not None:                                               
                yield response.follow(next_page, callback=self.get_image)           


        for i, j  in zip(artist, album):                                            
            yield {'artist': i,                                                     
                    'album': j,                                                     
                    }                                                                                                                                                                                                                                                                                                          

        page = response.url.split("/")[-2]                                          
        filename = 'osmose-%s.html' % page                                          
        with open(filename, 'wb') as f:                                             
            f.write(response.body)                                                  
        self.log('Saved file %s' % filename) 

1 Ответ

2 голосов
/ 08 апреля 2019

Я бы использовал передачу аргументов в мета. Проверьте этот пример:

def parse(self, response):                                                                              
    artists = response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/span[1]/text()').getall()
    albums = response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/span[2]/text()').getall()
    links = response.xpath('//*[@id="paginCorpA1"]/div[*]/div/div[2]/div[1]/div[2]/a/@href').getall()                                             

    for artist, album, link in zip(artists, albums, links): 
        if not link:
            continue                                           
        yield response.follow(link, self.get_image, meta={'artist': artist, 'album': album})

def get_image(self, response):   
    artist = response.meta['artist']                                               
    album = response.meta['album']                                               
    for im in response.xpath('//*[@id="img_product_page_osmose"]/img[@id="id_photo_principale"]/@src').getall():
        yield {'image': im, 'album': album, 'artist': artist} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...