Scrapy 在管道中使用POST请求持久化项目

Scrapy 在管道中使用POST请求持久化项目,scrapy,Scrapy,我想在管道中将项目持久化并将其发布到url 我正在管道中使用此代码 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

我想在管道中将项目持久化并将其发布到url

我正在管道中使用此代码

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从头到尾遵循的流程?我有点迷路了,什么时候叫什么。例如,如果管道将项目返回给spider,spider将如何处理这些项目?管道呼叫之后是什么

非常感谢

米希:

每个项目管道组件都会调用此方法,并且必须 返回项(或任何子类)对象或引发 DropItem异常。丢弃的项目不再由其他用户处理 管道组件

因此,只有spider可以生成带有回调的请求。 管道用于处理项目

你最好描述一下你想要实现什么

是否有一个图表解释了Scrapy从头到尾遵循的流程

例如,如果管道将项目返回给spider


管道不会将项目返回到三脚架。返回的项目将被传递到下一个管道。

您可以从scrapy.contrib.pipeline.media.mediapripeline继承管道,并在“get\u media\u Requests”中生成请求。响应被传递到“media_downloaded”回调中。

这可以通过使用库轻松完成。如果你不想使用另一个库,那就调查一下

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'])