Scrapy Spider跟随网址,但不会导出数据

时间:2018-07-19 11:08:12

标签: python web-scraping scrapy scrapy-spider

我正在尝试从房地产列表页面中获取详细信息。我可以获取所有数据,但似乎无法导出。

我使用yield关键字的方式可能有问题。该代码大部分工作:

  • 访问第1页,example.com / kittens
  • 转到第2页,example.com / puppers。这是街区列出的10套公寓。我可以从每个块中获取数据,但是我需要超链接内部的其他信息。
  • 访问超链接,例如example.com/puppers/apartment1。它也从此处获取一些信息,但是我似乎无法返回此数据以将其包含在我的HousingItem()类中。

    import scrapy
    from urllib.parse import urljoin
    
    class HousingItem(scrapy.Item):
         street      = scrapy.Field()
         postal      = scrapy.Field()
         city        = scrapy.Field()
         url         = scrapy.Field()
    
         buildY         = scrapy.Field()
         on_m           = scrapy.Field()
         off_m          = scrapy.Field()
    
    
    class FAppSpider(scrapy.Spider):
        name = 'f_app'
        allowed_domains = ['example.com']
        start_urls = ['https://www.example.com/kittens']
    
        def parse(self, response):
    
             yield scrapy.Request(url="https://www.example.com/puppers",
                 callback=self.parse_puppers)   
    
        def parse_inside_pupper(self, response):
    
             item = HousingItem()
             item['buildY']          = response.xpath('').extract_first().strip()
             item['on_m']            = response.xpath('').extract_first().strip()
             item['off_m']           = response.xpath('').extract_first().strip()
    
    
        def parse_puppers(self, response):
    
             base_url = 'https://www.example.com/'
             for block in response.css('div.search-result-main'):
    
                  item = HousingItem()
                  item['street']          = block.css(''),
                  item['postcode']        = block.css(''),
                  item['city']            = block.css('')
                  item['url']             = urljoin(base_url, block.css('div.search-result-header > a::attr(href)')[0].extract())
    
                # Problem area from here.. 
    
                  yield response.follow(url=item['url'],callback=self.parse_inside_pupper)
    
                # yield scrapy.request(url=item['url'],callback=self.parse_inside_pupper)?
    
                  yield item
    

FEED_EXPORT_FIELDS已在我的SETTINGS.py中进行了调整。 parse_puppers()中的4个项目已正确导出,parse_inside_puppers()数据在控制台中是正确的,但不会导出。

我用scrapy crawl f_app -o raw_data.csv来给我跑蜘蛛。在此先感谢您,感谢所有帮助。

p.s。我敢于注意到python和实践是相当新的东西。

1 个答案:

答案 0 :(得分:0)

您需要使用item参数将当前的parse_inside_pupper发送到meta

def parse_puppers(self, response):

     base_url = 'https://www.example.com/'
     for block in response.css('div.search-result-main'):

          item = HousingItem()
          item['street']          = block.css(''),
          item['postcode']        = block.css(''),
          item['city']            = block.css('')
          item['url']             = urljoin(base_url, block.css('div.search-result-header > a::attr(href)')[0].extract())

          yield response.follow(url=item['url'],callback=self.parse_inside_pupper, meta={"item": item})

之后,您可以在parse_inside_pupper(和yield从这里开始)中使用它:

def parse_inside_pupper(self, response):

     item = response.meta["item"]
     item['buildY']          = response.xpath('').extract_first().strip()
     item['on_m']            = response.xpath('').extract_first().strip()
     item['off_m']           = response.xpath('').extract_first().strip()
     yield item