尝试使用CSVFeedSpider从CSV文件中抓取某些行 文件的结构是下一个: id |类别|价钱 我需要抓取只有特定类别“付费”的行 我做下一个:
class Outillage_spider(CSVFeedSpider):
name = 'domain.com'
allowed_domains = ['domain.com', 'www.domain.com']
start_urls = ('http://www.domain.com/file.csv',)
delimiter = ';'
headers = ['name', 'category', 'price']
def parse_row(self, response, row):
categories = ['Bosch','Dolmar','Fein','Hitachi','Karcher','Leman','Makita','SDMO','Ski']
if row['category'] in categories:
res = {}
res['name'] = row['name']
res['price'] = row['price']
return load_product(res, response)
else:
return None
接下来我得到了:
File "/home/rolikoff/web/scrapy_projects/local/lib/python2.7/site-packages/Scrapy-0.14.1-py2.7.egg/scrapy/contrib/spiders/feed.py", line 129, in parse_rows
raise TypeError('You cannot return an "%s" object from a spider' % type(ret).__name__)
exceptions.TypeError: You cannot return an "NoneType" object from a spider
我认为当parse_row()返回None时会发生这种情况。但我不知道如何改变这个方面。你有什么想法吗?
由于 梅德
答案 0 :(得分:1)
到目前为止,我担心你必须在parse_row中产生字段!例如,这是我为抓取Podcasts网址所做的蜘蛛: https://github.com/arthurnn/podcast/blob/master/podcast/spiders/itunes_spider.py
我会删除其他人!试试这个:
if row['category'] in categories:
res = {}
res['name'] = row['name']
res['price'] = row['price']
yield load_product(res, response)
但是如果你没有使用普通的蜘蛛!对于CSVFeedSpider,请阅读下面的编辑:
修改强>
在这种情况下,您必须返回BaseItem或列表或元组!如果你看一下CSVFeedSpider http://dev.scrapy.org/browser/scrapy/contrib/spiders/feed.py?rev=1516的实现!你会看到
答案 1 :(得分:1)
尝试返回空list
或tuple
而不是None
else:
return []
并确保load_product
返回list
,tuple
,Item
或Request