在管道中使用POST请求保留项目

时间:2011-08-04 19:40:30

标签: scrapy

我希望将管道中的项目保留在网址中。

我在管道

中使用此代码
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从头到尾的流程?我有点迷失了,什么时候被调用。例如,如果Pipelines将项目返回给Spiders,Spiders会对这些项目做些什么?管道呼叫之后发生了什么?

非常感谢提前

Migsy

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

Quote

  

为每个项目管道组件调用此方法,并且必须   要么返回一个Item(或任何后代类)对象,要么引发一个   DropItem异常。丢弃的商品不再进一步处理   管道组件。

因此,只有spider可以通过回调产生请求。 管道用于处理物品。

您最好描述一下您想要达到的目标。

  

是否有一个图解释了Scrapy从开始到结束的流程

Architecture overview

  

例如,如果Pipelines将项目返回给Spiders

管道不会将项目返回给蜘蛛。返回的项目将传递给下一个管道。

答案 2 :(得分:1)

使用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'])
相关问题