Scrapy:如何使用来自两个网站的数据填充项目

时间:2018-01-25 00:25:59

标签: python scrapy

我想收集来自2个不同网站的项目数据。

它应该如下工作:

  1. parse_website_1从website_1获取人名并填充 项目
  2. parse_website_1会产生对parse_website_2
  3. 的请求
  4. parse_website_2解析website_2,根据从website_1中删除的人名收集人发色并填充该项
  5. parse_website_2加载项
  6. 如果项目在items.py

    中定义,那么这是否正确?
    import scrapy
    from scrapy.loader import ItemLoader
    from myproject.items import MyItem
    
    class MySpider(scrapy.Spider):
    
        name = "myspider" 
    
        def __init__(self):
            self.item = ItemLoader(item=MyItem(), response=response)  
    
        def start_requests(self):
            scrapy.Request(url="http://website_1.com", callback=self.parse_website_1)
    
        def parse_website_1(self, response):   
            name = response.xpath('//div[@class="name"]/text()').extract_first()
            self.item.add_value("name", name)
            website_2_path = "http://website_2.com/" + name 
            yield scrapy.Request(url=website_2_path, callback=self.parse_website_2)
    
        def parse_website_2(self, response):
            self.item.add_xpath("hair_color", '//div[@class="hair_color"]')
            yield self.item.load_item() 
    

1 个答案:

答案 0 :(得分:2)

这个想法是对的,但是实现不正确,因为您尝试使用实例属性(self.item)在连续请求之间传递数据。 Scrapy请求是异步的,因此无法按预期工作。

Scrapy FAQ概述了如何做到这一点的正确方法。使用Request的{​​{1}}属性将部分商品数据传递给连续请求,您可以使用meta的{​​{1}}属性获取该属性,添加更多数据并最终生成商品。这是改编的代码:

Response