2017-01-28 8 views
0

ニュースサイトをスクラップします。すべてのニュースについて、内容と多くのコメントがあります。私は2つのアイテム、1つはコンテンツ、もう1つは複数のコメントを持っています。 コンテンツに問題があり、複数のコメントが異なるリクエストとして発生します。私はニュースの内容を望んでおり、その複数のコメントは、一緒に、または1つとして、収穫または返されるべきです。パイプラインのタイミングや注文は私にとって重要ではありません。アイテムでスキル収量のために別の項目を接続

ファイル:

スパイダー、ニュースの内容、およびその多くのコメントで
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() 

が接続されていません。

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

は、それが完全に働いた、ありがとうございました:)) –

関連する問題