Scrapy CSV抓取

时间:2012-02-01 15:31:00

标签: python scrapy

尝试使用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时会发生这种情况。但我不知道如何改变这个方面。你有什么想法吗?

由于 梅德

2 个答案:

答案 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)

尝试返回空listtuple而不是None

else:
    return []

并确保load_product返回listtupleItemRequest