Сохранять элементы, используя запрос POST в конвейере - PullRequest
3 голосов
/ 04 августа 2011

Я хочу сохранить элементы в конвейере, публикуя их по 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-запрос из конвейеров?Если нет, нужно ли это делать в Spider?
  • Нужно ли указывать функцию обратного вызова?Если да, то какой?
  • Если я могу сделать http-вызов, могу ли я проверить ответ (JSON) и вернуть элемент, если все прошло нормально, или сбросить элемент, если он не был сохранен?

Как я в заключение скажу, есть ли диаграмма, которая объясняет поток, которым Скрапия следует от начала до конца?Я немного теряюсь, что называется, когда.Например, если Конвейеры вернули предметы Паукам, что Пауки делают с этими предметами?Что после звонка по трубопроводу?

Заранее большое спасибо

Migsy

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Вы можете унаследовать свой конвейер от scrapy.contrib.pipeline.media.MediaPipeline и выдавать запросы в get_media_requests.Ответы передаются в обратный вызов media_downloaded.

3 голосов
/ 23 августа 2011

Цитата

Этот метод вызывается для каждого компонента конвейера элемента и должен либо вернуть объект Item (или любой класс-потомок), либо вызвать Исключение DropItem. Отброшенные предметы больше не обрабатываются компоненты трубопровода.

Таким образом, только паук может дать запрос с обратным вызовом. Трубопроводы используются для обработки предметов.

Ты лучше опиши, чего ты хочешь достичь.

существует ли схема, которая объясняет поток, которым Скотт следует от начала до конца

Обзор архитектуры

Например, если конвейеры вернули предметы Паукам

Трубопроводы не возвращают предметы паукам. Возвращенные элементы передаются следующему конвейеру.

1 голос
/ 22 июня 2015

Это можно легко сделать с помощью библиотеки запросы . Если вы не хотите использовать другую библиотеку, посмотрите 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...