2017-01-28 4 views
0

Ich Schrott Nachrichten Website. Zu jeder Nachricht gibt es Inhalte und viele Kommentare. Ich habe 2 Artikel, einen für Inhalt und andere für mehrere Kommentare. Problem ist Inhalt und mehrere Kommentare ergeben als unterschiedliche Anfrage. Ich möchte, dass der Inhalt der Nachrichten und ihre Mehrfachkommentare zusammen oder als eins zurückgegeben werden. Pipeline Timing oder Reihenfolge ist mir egal.Scrapy Connect verschiedene Produkte für den Ertrag

In Artikel Datei:

class NewsPageItem(scrapy.Item): 
    title = scrapy.Field() 
    date = scrapy.Field() 
    hour = scrapy.Field() 
    image = scrapy.Field() 
    image_url = scrapy.Field() 
    top_content = scrapy.Field() 
    parag = scrapy.Field() 
    #comments = scrapy.Field() 
    comments_count = scrapy.Field() 

class CommentsItem(scrapy.Item): 
    id_ = scrapy.Field() 
    username = scrapy.Field() 
    firstname = scrapy.Field() 
    lastname = scrapy.Field() 
    email = scrapy.Field() 
    ip = scrapy.Field() 
    userid = scrapy.Field() 
    date = scrapy.Field() 
    comment_text = scrapy.Field() 
    comment_type_id = scrapy.Field() 
    object_id = scrapy.Field() 
    yes = scrapy.Field() 
    no = scrapy.Field() 

In Spinne, Nachrichten Inhalt und seine vielen Kommentare sind nicht verbunden:

class NewsSpider(scrapy.Spider): 
    ... 

    def parse(self, response): 
     for nl in news_links: 
      yield scrapy.Request(url=nl, callback=self.new_parse) 
      yield scrapy.Request(url=url, callback=self.comment_parse) 

    def new_parse(self,response): 
     item = BigParaItem() 
     item['title'] = response.xpath(...).extract() 
     ... 
     yield item 

    def comment_parse(self,response): 
     data = json.loads(response.body.decode('utf8')) 

     for comment in data.get('data', []): 
      item = CommentsItem() 
      item['id_'] = comment.get('Id') 
      ... 
      yield item 

Pipelines:

class NewsPagePipeline(object): 
    def process_item(self, item, spider): 
     return item 

class CommentsPipeline(object): 
    def process_item(self, item, spider): 
     return item 

Wie kann ich Elemente verbinden oder verschachtelt werden, wenn die Ausbeute?

Antwort

0

Es ist besser, Ketten Anfragen und übergeben News zwischen Rückrufe es mit den Kommentaren mit meta(*) zu füllen: Vielen Dank

class NewsSpider(scrapy.Spider): 
... 

def parse(self, response): 
    for nl in news_links: 
     yield scrapy.Request(url=nl, callback=self.new_parse, meta={'comments_url': url}) 

def new_parse(self,response): 
    item = BigParaItem() 
    item['title'] = response.xpath(...).extract() 
    item['comments'] = [] 
    ... 
    yield scrapy.Request(response.meta['comments_url'], callback=self.comment_parse, meta={'item': item}) 

def comment_parse(self,response): 
    data = json.loads(response.body.decode('utf8')) 
    item = response.meta['item'] 
    for comment in data.get('data', []): 
     c_item = CommentsItem() 
     c_item['id_'] = comment.get('Id') 
     ... 
     item['comments'].append(c_item) 
    yield item 
+0

, es funktionierte perfekt :)) –

Verwandte Themen