如何从Scrapy中的主解析函数调用不同的解析函数?

时间:2017-01-08 19:22:24

标签: python web-scraping scrapy scrapy-spider

我对Scrapy很新(实际上这是我第一次使用它)。我正在解析一个电视节目全部演员的页面,我试图收集每个只存在于演员个人页面中的演员的信息。

以下是我的解析函数的片段:

for actor in response.css('tr.even'):
    .
    .
    .
    .
    yield {
              'real_name':
              ' '.join(actor.css('td.itemprop a span.itemprop::text').extract_first().split()),

              'character_name':
              ' '.join(actor.css('td.character a::text').extract_first().split()),

              'imdb_link': link,

              'show': show,

              'pic': scrapy.Request(url=link, callback=self.parse_pic)
   }

对于pic参数,我想打开存储在链接中的网址,然后运行response.css('td div.image a img::attr(src)').extract_first()以获取指向该演员图片的链接

这是我的parse_pic函数:

def parse_pic(self, response):
    return response.css('td div.image a img::attr(src)').extract_first()

谢谢!

1 个答案:

答案 0 :(得分:0)

现在您创建了一个请求,但是您没有执行它。我建议将您收集的数据存储在新请求的元数据中。

请求1:为pic创建新请求,将第1个url中的所有数据存储在元数据中,使用pic url发送新请求

请求2:从请求1收集数据(来自meta)并使用pic数据补充此数据。

for actor in response.css('tr.even'):
    .
    .
    .
    .
    request = scrapy.Request(url=link, callback=self.parse_pic)
    request.meta['data'] = {
              'real_name':
              ' '.join(actor.css('td.itemprop a span.itemprop::text').extract_first().split()),

              'character_name':
              ' '.join(actor.css('td.character a::text').extract_first().split()),

              'imdb_link': link,

              'show': show,
   }
   yield request

然后这就是parse_pic:

   def parse_pic(self, response):
     data = response.meta.get('data')
     data['pic'] = response.css('td div.image a img::attr(src)').extract_first()
     yield data