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