2016-10-16 70 views
0

據我所知Scrapy異步工作,請求無序。
現在,我可以解析某個網站頁面上的項目列表,並詳細解析附加信息。
問題是,在完成所有這些工作之後,我需要爲另一個城市解析相同的數據。
通過提出請求http://www.example.com/city/set/1來改變城市。用Scrapy解析網站時改變城市

我的蜘蛛看起來是這樣的:

class ExampleSpider(scrapy.Spider): 
    name = "example" 
    allowed_domains = ["example.com"] 

    def start_requests(self): 
     for category in CATEGORIES: 
      if 'subcategories' in category: 
       subcategories = category['subcategories'] 
       for subcategory in subcategories: 
        url = subcategory['url'] 
        yield scrapy.Request(
         url = url, 
         callback = self.parse, 
         meta = { 
          'category': category, 
          'subcategory': subcategory 
         } 
        ) 

    def parse(self, response): 
     pass 

什麼是做到這一點的最好辦法?

回答

0

你可以簡單的連鎖請求:

def parse(self, response): 
    item = dict() 
    # fill up item with data 
    city_url = '' #make city url 
    yield Request(city_url, 
        meta={'item': item}, # carry item to next callback in meta 
        callback=self.parse_city) 

def parse_city(self, response): 
    # get item from meta 
    item = response.meta['item'] 
    # add more stuff to your item 
    item['some_city_data'] = '' 
    yield item 
+0

我想你沒有正確地理解我的問題。對於每個城市都有不同的物品,因此我不需要攜帶物品。例如,調用'http:// www.example.com/city/set/1'爲會話保存城市ID。然後我需要解析該城市的所有項目,完成後我需要爲城市ID設置另一個值並再次解析項目。 –

+0

@Chika哦,我明白了。如果會話在cookie中設置,那麼您可以簡單地創建多個會話,將每個城市url添加到'start_urls'並將'dont_filter = True'添加到您的請求中,例如'Requests(dont_filter = True)'以避免過濾。 – Granitosaurus