Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy-多页上的项目处理_Python_Web Scraping_Scrapy - Fatal编程技术网

Python Scrapy-多页上的项目处理

Python Scrapy-多页上的项目处理,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我需要刮的品牌,型号和版本的车辆在多个页面,并把它放在一个单一的项目。我希望我的爬行器从第1页检索车辆品牌列表。然后,对于每个品牌,转到第2页,获取所有型号。对于每个型号,请转至第3页,获取所有相关版本和规格。 每个版本的品牌和型号都需要放在一个单独的汽车项目中(和?)。 不幸的是,它只是在第1页上循环第一个品牌的所有步骤。在获得下一个品牌并重新开始这一过程之前,我如何强制它在所有型号和相关版本上循环?我见过这个问题以不同的形式提出,但当我试图控制一个项目的处理顺序时,我仍然很难理解多个回调是如

我需要刮的品牌,型号和版本的车辆在多个页面,并把它放在一个单一的项目。我希望我的爬行器从第1页检索车辆品牌列表。然后,对于每个品牌,转到第2页,获取所有型号。对于每个型号,请转至第3页,获取所有相关版本和规格。 每个版本的品牌和型号都需要放在一个单独的汽车项目中(和?)。 不幸的是,它只是在第1页上循环第一个品牌的所有步骤。在获得下一个品牌并重新开始这一过程之前,我如何强制它在所有型号和相关版本上循环?我见过这个问题以不同的形式提出,但当我试图控制一个项目的处理顺序时,我仍然很难理解多个回调是如何工作的

class Spider(scrapy.Spider):
    name = "fdm_bot"
    allowed_domains = ["fdm.dk"]
    start_urls = ["http://www.fdm.dk/bildatabasen",]

    def parse(self, response):
        rows = response.xpath('//td//a[contains(@href,"bildatabasen")]')
        for row in rows:
            car = CarItem()
            car['brand'] = row.xpath('./text()').extract()
            absolute_URL = response.urljoin(row.xpath('./@href').extract()[0])
            request =  Request(absolute_URL, callback=self.parse_model, meta={'car':car})
            yield request

    def parse_model(self, response):
        rows = response.xpath('//td//a[contains(@href,"bildatabasen")]')
        for row in rows:
            car = response.meta['car']
            brand = car['brand'][0]
            model = row.xpath('./text()').extract()[0]
            car['model'] = string.replace(model,brand, "")
            absolute_URL = response.urljoin(row.xpath('./@href').extract()[0])
            request =  Request(absolute_URL, callback=self.parse_editions, meta={'car':car})
            return request

    def parse_editions(self, response):
        rows = response.xpath('//td//a[contains(@href,"bildatabasen")]')
        for row in rows:
            car = response.meta['car']
            brand = car['brand'][0]
            model = car['model']
            edition = row.xpath('./text()').extract()[0]
            edition = string.replace(edition,brand, "")
            car['edition'] = string.replace(edition,model, "")
            absolute_URL = response.urljoin(row.xpath('./@href').extract()[0])
            request = Request(absolute_URL, callback=self.parse_specs, meta={'car':car})
            return request

    def parse_specs(self, response):
        car = response.meta['car']
        car['engineVolume'] = 1.0
        return car