【问题标题】:Scrapy callback function抓取回调函数
【发布时间】:2016-04-06 02:20:35
【问题描述】:

我有一个基本的scrapy脚本,它执行以下操作:

  1. 访问网站
  2. 使用规则获取所有页面:

     rules = (
             Rule(LinkExtractor(allow=(), restrict_xpaths=('//*[@id="pagination_top"]/a',)), callback="parse_page", follow= True),
             )
    
  3. 在每个页面中,获取到产品页面的所有链接:

    def parse_page(self, response):
        for href in response.css("#prod_category > ul > li > a::attr('href')"):
            url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback=self.parse_dir_contents)
    
  4. 并访问每个产品页面以获取有关产品的详细信息。然后我从另一个链接获取更多详细信息

    def parse_dir_contents(self, response):
         # select xpath here
         print '________________________BEGIN PRODUCT________________________'
         item = detailedItem()
         item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()
    
         # get url_2 from this page
    
         request = scrapy.Request(url_2, callback=self.parse_detailed_contents)
         request.meta['item'] = item
         yield request
    
  5. 最后是获取产品详细信息的函数

    我认为最后一个 parse_detailed_contents 是我遇到问题的地方

    def parse_detailed_contents(self, response):
        item = response.meta['item']
        sel = Selector(response)
        sites = sel.xpath('//*[@id="prod-details"]')
    
        print '________________________GETTING DETAILS________________________'
        item['prod_details'] = sites.xpath('//*[@id="prod-details"]/div/text()').extract()
    
        return item
    

问题是我的脚本为第一个链接返回 item['prod_details'] 但没有为后续链接返回任何项目。

那是因为 url_2 被传递给所有产品吗?

有人可以帮忙吗?提前非常感谢!

【问题讨论】:

  • 您在运行爬虫时是否在控制台日志中发现任何错误?
  • 谢谢@jithin 没有错误...脚本为每个产品打印“BEGIN PRODUCT”,但仅为第一个产品打印“GETTING DETAILS”。所有后续产品页面仅返回“BEGIN PRODUCT”

标签: python scrapy yield-return


【解决方案1】:

尝试添加 dont_filter=True

def parse_dir_contents(self, response):
 # select xpath here
 print '________________________BEGIN PRODUCT________________________'
 item = detailedItem()
 item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()

 # get url_2 from this page

 request = scrapy.Request(url_2, callback=self.parse_detailed_contents,dont_filter=True)
 request.meta['item'] = item
 yield request

【讨论】:

  • 非常感谢@jithin 成功了!我没有足够的分数来选择你的答案,但一旦我有足够的分数,我肯定会回来的。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
相关资源
最近更新 更多