2017-01-28 10 views
0

Я ломаю новостной сайт. Для каждой новости есть контент и много комментариев. У меня есть 2 пункта, один для контента и другой для нескольких комментариев. Проблема заключается в содержании и нескольких комментариях в качестве другого запроса. Я хочу, чтобы контент новостей и его многочисленные комментарии должны были давать или возвращаться вместе или как один. Время или порядок трубопровода для меня не имеет значения.Scrapy Connect Различные предметы для урожая

В Items файл:

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() 

В Spider, содержание новостей, и многие его комментарии не связаны:

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 

Трубопроводы:

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

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

Как соединить элементы или быть вложенными при выходе?

ответ

0

Лучше запросов цепи и передать новость между обратных вызовов, чтобы заполнить его комментарии, используя meta(*):

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

Спасибо большое, она работала отлично :)) –