scrapy只保存一个项目

时间:2014-10-22 07:10:09

标签: python postgresql scrapy

我在scrapy中有一个关于保存列表项目的问题

我的代码是这样的:

class MySpider(Spider): 
    name = "test"
    start_urls=[""]
    def parse(self, response):
        sel =  Selector(response)
        sites = sel.xpath("//a[contains(@href, '.html')]")   #many .html
        for i,site in enumerate(sites):
            item = YoutoItem()             
            item['link'] = site.xpath("./@href").extract()[0]
            item['title'] = site.xpath("./text()").extract()[0]
            yield Request(url=link,meta={'item':item}, callback=self.parse_ler)
            break #just test the first one.html

    def parse_ler(self, response):
        item = response.meta['item']
        sel =  Selector(response)
        url = sel.xpath("//embed/@src").extract()
        for t in url:
            print t  #it will print url1,url2,url3
            item['url'] = t
            yield item

我的pipline.py

class YoutoPipeline(object):
    def process_item(self, item, spider):
        item.save()
        return item

终端将打印输出:

{'link': u'http://test.html',
 'title': u'A',
 'url': u'url1'}
{'link': u'http://test.html',
 'title': u'A',
 'url': u'url2'}
{'link': u'http://test.html',
 'title': u'A',
 'url': u'url3'}

但是当它保存到数据库时,它会保存其中一个

 {'link': u'http://test.html',
 'title': u'A',
 'url': u'url1'}

我瘦了它是因为item ['url']是通过forloop获得的

请教我如何编辑将这3个数据分别保存到数据库中 我的数据库是postgreSQL

修改

我找到了一个方法: 只需将item = YoutoItem()放在forloop下 它可以工作:

for t in url:
    item = YoutoItem()    
    item['url'] = t
    yield item

2 个答案:

答案 0 :(得分:0)

如果您需要将这些项目分别存储在数据库中,只需使用另一个YoutoItem()

yield Request(url=link,meta={'item':item}, callback=self.parse_ler)

可以改写为:

# def parse
# or Request if you import scrapy.Request, and you don't need request.meta
yield scrapy.Request(link, callback=self.parse_ler)

# def parse_ler, which you don't need the request.meta anymore
sel =  Selector(response)
url = sel.xpath("//embed/@src").extract()
for t in url:
    item = YoutiItem() # just construct a new YoutoItem
    item['url'] = t
    yield item

答案 1 :(得分:0)

尝试禁用过滤器请求,如本例所示:

Request(url=u, callback=self.parse_ler, meta={"item": item}, dont_filter = True)