2017-07-12 2 views
0

Je souhaite un pipeline pour envoyer les articles POST asynchrones à un service de stockage. J'ai l'idée d'utiliser quelque chose comme FilePipeline pour cela. FilePipeline vient avec beaucoup de frais généraux, car il suppose que je veux enregistrer des fichiers sur le disque, mais ici, je veux juste publier les fichiers dans une API de stockage. Cependant, il a une méthode qui donne des demandes: get_media_requests().Pipeline pour publier l'élément dans le service de stockage

Je reçois actuellement FileException échec, et je ne sais pas comment éliminer le composant qui enregistre sur le disque. Y a-t-il un moyen de faire ce travail bien?

class StoragePipeline(FilePipeline): 


    access_token = os.environ['access_token'] 

    def get_media_requests(self, item, info): 

     filename = item['filename'] 


     headers = { 
      'Authorization': f'Bearer {self.access_token}', 
      'Dropbox-API-Arg': f'{{"path": "/{filename}"}}', 
      'Content-Type': 'application/octet-stream', 
     } 

     request = Request(
      method='POST', 
      url='https://content.dropboxapi.com/2/files/upload', 
      headers=headers, 
      body=item['data'], 

     ) 

     yield request 


    def item_completed(self, results, item, info): 

     return item 
+1

Vous pouvez jeter un oeil à [Scrapy Livre] (https://www.packtpub.com/ échantillons de big-data-and-business-intelligence/learning-scrapy), comme [ce pipeline d'Async ElasticSearch] (https://github.com/scalingexcellence/scrapybook/blob/5a6600abecb50e344b7aa6eaf03a181dbbbb08c0/ch09/properties/pipelines/ es.py). –

Répondre

1

Vous pouvez planifier des demandes de Scrapy dans les conduites en exposant crawler et la planification de votre demande directement:

class MyPipeline(object): 
    def __init__(self, crawler): 
     self.crawler = crawler 

    @classmethod 
    def from_crawler(cls, crawler): 
     return cls(crawler) 

    def process_item(self, item, spider): 
     if item['some_extra_field']: # check if we already did below 
      return item 
     req = scrapy.Request('some_url', self.check_deploy, 
          method='POST', meta={'item': item}) 
     self.crawler.engine.crawl(req, spider) 
     return item 

    def check_deploy(self, response): 
     # if not 200 we might want to retry 
     if response.status != 200: 
      return response.meta['item']