2011-08-04 30 views
2

我想持久保存管道中的项目,并将它们发布到网址。在管道中使用POST请求的持久性项目

我使用这个代码的管道

class XPipeline(object): 
def process_item(self, item, spider):  
    log.msg('in SpotifylistPipeline', level=log.DEBUG) 

    yield FormRequest(url="http://www.example.com/additem, formdata={'title': item['title'], 'link': item['link'], 'description': item['description']}) 

内,但现在看来,这不是让HTTP请求。

  • 是否有可能从管道发出http请求?如果不是,我必须在蜘蛛中做到吗?
  • 我是否需要指定回调函数?如果是这样,哪一个?
  • 如果我可以进行http调用,我可以检查响应(JSON)并返回项目,如果一切正常,或丢弃该项目,如果它没有得到保存?

作为最后一件事,是否有一张图解释了Scrapy始终遵循的流程?我稍微失去了什么被调用的时候。例如,如果管道将项目返回给蜘蛛,蜘蛛对这些项目做什么?管道呼叫后有什么?

提前感谢

Migsy

回答

3

Quote

这种方法被称为为每个项目管道组件,必须 要么返回一个项目(或子类)对象或提高一个 DropItem异常。丢弃的物品不再被 管道组件处理。

所以,只有蜘蛛可以通过回调产生请求。 管道用于处理项目。

你最好描述你想达到什么。

是否有解释说,Scrapy从开始如下结束

Architecture overview

例如流动的图,如果管道返回项目蜘蛛

管道不要将物品归还蜘蛛。返回的项目被传递到下一个管道。

3

您可以从scrapy.contrib.pipeline.media.MediaPipeline继承管道,并在'get_media_requests'中生成请求。响应被传递到'media_downloaded'回调。

0

这可以通过使用requests库轻松完成。如果您不想使用其他库,请查看urllib2

import requests 

class XPipeline(object): 

    def process_item(self, item, spider):  
     r = requests.post("http://www.example.com/additem", data={'title': item['title'], 'link': item['link'], 'description': item['description']}) 
     if r.status_code == 200: 
      return item 
     else: 
      raise DropItem("Failed to post item with title %s." % item['title'])