在我的蜘蛛中,我有两个管道,一个用于图像,一个用于文件,
蜘蛛中的我检查了这样的图像结果
if len(self.img_) >= 0:
item['image_urls'] = self.img_
并对文件也这样做。
if len(self.result) >= 0:
item['file_urls'] = self.result
我的设置就像管道
一样'ScrawlerScraper.images.ImgPipeline': 1,
'ScrawlerScraper.fld_pipeline.FilesPipeline': 2
首先出现在图像管道中的我的过程项是这样的
def process_item(self, item, spider):
try:
request = [x for x in item['image_urls']]
for x in request:
dfd = spider.crawler.engine.download(x, spider)
dfd.addBoth(self.return_item, item)
return dfd
except logging.info('No images'):
return item
对于文件管道
,这是相同的def process_item(self, item, spider):
try:
request = [x for x in item['file_urls']]
for x in request:
dfd = spider.crawler.engine.download(x, spider)
dfd.addBoth(self.return_item, item)
return dfd
except logging.error('No Files Problem'):
return item
我这样做是因为我得到了多张图片而且只能在蜘蛛中产生一次。
我不明白为什么我在第二个管道中出现错误
fld_pipeline.py", line 23, in process_item
request = [x for x in item['file_urls']]
TypeError: 'NoneType' object has no attribute '__getitem__'
如果没有item['file_urls']
,管道甚至不应该执行。
我完全不知道发生了什么。
感谢您提供任何帮助,我希望我的问题不会错误地形成..
这是我检查退出文件的地方,如果没有,则返回项目。也许我错了,我在循环中并试图返回该项目。 但它回到下一个管道,因为没有
for x in item['image_urls']:
try:
a = urlparse.urlparse(x)
except TypeError:
logging.info('No images')
return item
file_name = os.path.basename(a.path)
try:
u = sock.Worker().get_url(x)
except TypeError:
logging.info('No images')
return item
if u:
try:
os.path.exists(settings.get('IMAGES_STORE') + file_name)
logging.info("Image Already Downloaded: %s " % a.path)
item['image_urls'].append(settings.get('IMAGES_STORE') + file_name)
return item
except TypeError:
data = u.read()
with open(settings.get('IMAGES_STORE') + file_name, 'wb') as code:
code.write(data)
logging.info("Downloading (%s)" % a.path,)
item['image_urls'].append(settings.get('IMAGES_STORE') + file_name)
return item
答案 0 :(得分:2)
你的try / except子句不正确。您必须列出错误类型,而不是说它要记录的内容。试试这个:
try:
request = [x for x in item['image_urls']]
for x in request:
dfd = spider.crawler.engine.download(x, spider)
dfd.addBoth(self.return_item, item)
return dfd
except TypeError:
logging.info('No images')
return item