处理时Scrapy KeyError

时间:2018-01-05 12:55:16

标签: python web-scraping scrapy scrapy-spider

我无法找到问题的答案,所以我希望可以在这里提问。

我正在试图废弃电影放映,但仍然会出现以下错误。

enter image description here

令我感到困惑的是,问题显然在于管道问题。然而,我有第二个用于歌剧院的蜘蛛与完全相同的代码(只有地方不同),它的工作正常。"显示"和"放置"指的是我的Django模型。我已将他们的字段更改为CharFields,因此错误的日期/时间格式不会出现问题。

我还尝试使用专用的scrapy项目" KikaItem"而不是" ShowItem" (与我的歌剧蜘蛛共享)但错误仍然存​​在。

class ScrapyKika(object):
    def process_item(self, ShowItem, spider):
        place, created = Place.objects.get_or_create(name="kino kika")

        show = Shows.objects.update_or_create(
            time=ShowItem["time"],
            date=ShowItem["date"],
            place=place,
            defaults={'title': ShowItem["title"]}
        )

        return ShowItem

这是我的蜘蛛代码。我希望问题出在这里,因为我在这里使用的方法不同于歌剧方法。但是,我不确定会出现什么问题。

import scrapy
from ..items import ShowItem, KikaItemLoader

class KikaSpider(scrapy.Spider):
    name = "kika"
    allowed_domains = ["http://www.kinokika.pl/dk.php"]
    start_urls = [
        "http://www.kinokika.pl/dk.php"


    ]
    def parse(self, response):
        divs = response.xpath('//b')
        for div in divs:
            l = KikaItemLoader(item=ShowItem(), response=response)
            l.add_xpath("title", "./text()")
            l.add_xpath("date", "./ancestor::ul[1]/preceding-sibling::h2[1]/text()")
            l.add_xpath("time", "./preceding-sibling::small[1]/text()")
            return l.load_item()

ItemLoader

class KikaItemLoader(ItemLoader):
    title_in = MapCompose(strip_string,lowercase)
    title_out = Join()

    time_in = MapCompose(strip_string)
    time_out = Join()

    date_in = MapCompose(strip_string)
    date_out = Join()

感谢您的时间,并对任何拼写错误表示抱歉:)

1 个答案:

答案 0 :(得分:2)

目前,您的蜘蛛会产生一个项目:

{'title': u'  '}

没有填写datetime字段。这是因为您在蜘蛛中初始化ItemLoader类的方式。

您应该在考虑特定选择器的情况下初始化项目加载器。替换:

for div in divs:
    l = KikaItemLoader(item=ShowItem(), response=response)

使用:

for div in divs:
    l = KikaItemLoader(item=ShowItem(), selector=div)