我有一个物品管道来处理价格。我在处理此管道中的项目时遇到错误。但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
答案 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.name
,spider.my_var
,spider.my_dict
。