2017-02-04 3 views
0

私は広告のリストを解析し、いくつかの情報をAdvertItemに入れてAdvertLoaderを使用して読み込みました。しかし、アイテムページの詳細から各広告の追加情報を得る方法を見つけ出すことはできませんでした。この追加情報を同じAdvertItemオブジェクトに入れ、AdvertLoaderを使用してすべての情報を含むアイテムを読み込みます。Scrapyフレームワークを使用して各リスト項目の別のページからいくつかの詳細を取得

class AdvertLoader(ItemLoader): 
    default_input_processor = MapCompose(unicode.strip, remove_tags) 
    default_output_processor = Join() 


class AdvertSpider(scrapy.Spider): 
    name = "adverts" 
    start_urls = [ 
     "http://blablaadverts.com/", 
    ] 
    adverts_list_xpath = '//table[@class="object-list-table"]/tbody/tr[@class="object-type-apartment"]' 
    advert_item_fields = { 
     'id': './@id', 
     'link': './/td[@class="object-name"]/h2[contains(@class, "object-title")]/a/@href', 
     'status': 'normalize-space(.//td[contains(@class, "object-media")]/div/p/a/span[contains(@class, ' 
       '"sold-overlay-list")]/span/text())', 
     'state': './/td[@class="object-name"]/h2[contains(@class, "object-title")]/a/text()', 
     'city': './/td[@class="object-name"]/h2[contains(@class, "object-title")]/a/text()', 
     'zone': './/td[@class="object-name"]/h2[contains(@class, "object-title")]/a/text()', 
     'address': './/td[@class="object-name"]/h2[contains(@class, "object-title")]/a/text()', 
     'rooms': './/td[contains(@class, "object-rooms")]/text()', 
     'area': 'normalize-space(.//td[contains(@class, "object-m2")]/text())', 
     'price': 'normalize-space(.//td[contains(@class, "object-price")]/p/text())', 
    } 
    advert_details_xpath = '//table[contains(@class, "object-data-meta")]/tbody/tr' 
    advert_item_details_fields = { 
     'floor': './/td/text()', 
     'built_in_year': './/td/text()', 
     'condition': './/td/text()', 
     'ownership': './/td/text()', 
     'energy_level': './/td/text()', 
    } 
    contact_name = '//div[contains(@class, "object-article-contact")]/p[@class="fn"]/text()' 
    next_page = '//li[contains(@class, "next")]/a/@href' 


    def parse(self, response): 
      selector = Selector(response) 

      for advert in selector.xpath(self.adverts_list_xpath): 
       loader = AdvertLoader(AdvertItem(), selector=advert) 

       for field, xpath in self.advert_item_fields.iteritems(): 
        loader.add_xpath(field, xpath) 

        # This request is not working as I expect. 
        yield scrapy.Request("http://blablaadverts.com/index.htmlnr=55&search_key=ca41231a29d2ab921aed02e864152c0e", 
            callback=self.parse_page2, meta={'loader': loader}) 

        yield loader.load_item() 

      next_page = response.xpath(self.next_page).extract_first() 
      if next_page is not None: 
       next_page = response.urljoin(next_page) 
       yield Request(next_page, callback=self.parse) 


    def parse_page2(self, response): 
     selector = Selector(response) 
     loader = response.meta['loader'] # type: AdvertLoader 
     loader.selector = selector 
     loader.add_xpath('contact_name', self.contact_name) 
     # yield loader.load_item() 

以下のコードは、2番目のアイテムの詳細ページから詳細を除いて、各広告に関する情報のみを保存します。

parse()機能とは別に実行すると、parse_page2()が動作しています。

すべての情報を収集し、ローダーに自分のAdvertItemオブジェクトをロードするにはどうすればよいですか?

答えて

0

私はあなたを正しく取得するかどうかはわかりません。

しかし、すべての情報が利用可能な場合、この機能に

   # This request is not working as I expect. 
       scrapy.Request("http://blablaadverts.com/index.htmlnr=55&search_key=ca41231a29d2ab921aed02e864152c0e", 
           callback=self.parse_page2, meta={'loader': loader}) 

       loader.load_item() 

そしてyieldにコード

   # This request is not working as I expect. 
       yield scrapy.Request("http://blablaadverts.com/index.htmlnr=55&search_key=ca41231a29d2ab921aed02e864152c0e", 
           callback=self.parse_page2, meta={'loader': loader}) 

       yield loader.load_item() 

のこの部分を変更します。

def parse_page2(self, response): 
    selector = Selector(response) 
    loader = response.meta['loader'] # type: AdvertLoader 
    loader.selector = selector 
    loader.add_xpath('contact_name', self.contact_name) 
    yield loader.load_item() 
関連する問題