如何访问Item Pipeline Scrapy中的请求对象

时间:2017-11-13 15:51:13

标签: python python-2.7 scrapy

我有一个物品管道来处理价格。我在处理此管道中的项目时遇到错误。但scrapy错误并不能告诉哪个url产生了错误。有没有办法可以访问管道内的请求对象

def process_item(self, item, spider):
    """
        :param self:
        :param item:
        :param spider:
    """
    print dir(spider) # No request object here...
    quit()
    if not all(item['price']):
        raise DropItem

    item['price']['new'] = float(re.sub(
        "\D", "", item['price']['new']))
    item['price']['old'] = float(re.sub(
        "\D", "", item['price']['old']))
    try:
        item['price']['discount'] = math.ceil(
            100 - (100 * (item['price']['new'] /
                          item['price']['old'])))
    except ZeroDivisionError as e:
        print "Error in calculating discount {item} {request}".format(item=item, request=spider.request) # here I want to see the culprit url...
        raise DropItem

    return item

2 个答案:

答案 0 :(得分:3)

你不能从ItemPipeline,你可以从蜘蛛中间件访问响应(和response.url),但我认为更简单的解决方案是添加一个临时的url字段,当你分配产生项目,如:

yield {...
       'url': response.url,
       ...}

可以在管道内轻松访问网址。

答案 1 :(得分:2)

在您的蜘蛛类中,您在此处定义的任何类变量都可以通过spider.variable_name

在您的管道中访问
class MySpider(scrapy.Spider):
    name = "walmart"
    my_var = "TEST"
    my_dict = {'test': "test_val"}

现在,您可以执行spider.namespider.my_varspider.my_dict