Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 使用刮痧中的物品_Python_Scrapy - Fatal编程技术网

Python 使用刮痧中的物品

Python 使用刮痧中的物品,python,scrapy,Python,Scrapy,我使用Scrapy并尝试输出一个json文件。当我不使用物品,但我想使用它们时,它非常有效 所以我的蜘蛛代码是: import json import scrapy from scrapy.loader import ItemLoader from ccv_spiders.items import AuctionItem class GlenMarchSpider(scrapy.Spider): name = 'auction_results' def __init__(se

我使用Scrapy并尝试输出一个json文件。当我不使用物品,但我想使用它们时,它非常有效

所以我的蜘蛛代码是:

import json
import scrapy
from scrapy.loader import ItemLoader
from ccv_spiders.items import AuctionItem

class GlenMarchSpider(scrapy.Spider):
    name = 'auction_results'

    def __init__(self, *args, **kwargs):
        with open('file.json', encoding='utf-8') as data_file:
            self.data = json.load(data_file)


    def start_requests(self):
        for item in self.data:
            request = scrapy.Request(item['gm_url'], callback=self.parse)
            request.meta['item'] = item
            yield request

    def parse(self, response):
        item = response.meta['item']
        item['results'] = []

        for caritem in response.css("div.car-item-border"):
            loader= ItemLoader(item=AuctionItem(), selector=caritem, response=response)
            item['results'].append({
                loader.add_css("marque", "div.make::text"),
                loader.add_css("model", "div.make::text"),
                loader.add_css("model_year", "div.make::text"),
                loader.add_css("price_str", "div.price::text"),
                loader.add_css("auction_house", "div.auctionHouse::text"),
                loader.add_css("auction_country", "div.auctionHouse::text"),
                loader.add_css("auction_url", "div.view-auction a::attr(href)"),
                loader.add_css("img", "img.img-responsive::attr(src)")
            })
            yield loader.load_item()

        yield item
My items.py代码是:

import scrapy


class AuctionItem(scrapy.Item):
    marque= scrapy.Field()
    model= scrapy.Field()
    model_year= scrapy.Field()
    price_str= scrapy.Field()
    auction_house= scrapy.Field()
    auction_country= scrapy.Field()
    auction_date= scrapy.Field()
    auction_url= scrapy.Field()
    img= scrapy.Field()
和我的Json输出:

{
    "objectID": 10000,
    "gm_url": "https://www.glenmarch.com/cars/results/quick/AC/10?unsold=1?limit=9999",
    "results": [
        [null]
    ]
},
{
    "marque": [" 1913 AC 10 hp Light Car "],
    "model": [" 1913 AC 10 hp Light Car "],
    "model_year": [" 1913 AC 10 hp Light Car "],
    "price_str": ["£24,150"],
    "auction_house": [" Bonhams - The Beaulieu Sale, Beaulieu, UK "],
    "auction_country": [" Bonhams - The Beaulieu Sale, Beaulieu, UK "],
    "auction_url": ["http://www.bonhams.com/auctions/23594/lot/417/?category=list"],
    "img": ["https://www.glenmarch.com/img/auctions/car/thumb/16-8-29-667feacd0f478172e463f237ba7ee692.jpg"]
}

但是我希望第二个对象位于结果数组中,我不知道如何操作…

首先尝试收集项目,然后只生成一次结果:

def parse(self, response):
    item = response.meta['item']
    item['results'] = []

    for caritem in response.css("div.car-item-border"):
        loader = ItemLoader(item=AuctionItem(), selector=caritem, response=response)
        loader.add_css("marque", "div.make::text")
        loader.add_css("model", "div.make::text")
        loader.add_css("model_year", "div.make::text")
        loader.add_css("price_str", "div.price::text")
        loader.add_css("auction_house", "div.auctionHouse::text")
        loader.add_css("auction_country", "div.auctionHouse::text")
        loader.add_css("auction_url", "div.view-auction a::attr(href)")
        loader.add_css("img", "img.img-responsive::attr(src)")
        item['results'].append(loader.load_item())

    yield item

我看到您正在使用我在您的问题“如何在Scrapy中使用包含URL和ID的JSON并构造结果?”中向您建议的结构。如果您希望从StackOverflow社区获得帮助,请不要忘记将答案标记为已接受。谢谢