【问题标题】:not able to access process_item with python scrapy ImagePipeline无法使用 python scrapy ImagePipeline 访问 process_item
【发布时间】:2013-01-29 12:55:42
【问题描述】:

我正在尝试使用 python scrapy 从网站源中获取一些图像。

整个工作正常,除了我的管道中的 process_item 方法没有被访问。

这是我的文件:

Settings.py:

BOT_NAME = 'dealspider'
SPIDER_MODULES = ['dealspider.spiders']
NEWSPIDER_MODULE = 'dealspider.spiders'

DEFAULT_ITEM_CLASS = 'dealspider.items.DealspiderItem'

ITEM_PIPELINES = ['scrapy.contrib.pipeline.images.ImagesPipeline', dealspider.ImgPipeline.MyImagesPipeline']

IMAGES_STORE = '/Users/Comp/Desktop/projects/ndailydeals/dimages/full'

ImgPipeline:

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        print "inside get_media_requests"
        for image_url in item['image_urls']:

            yield Request(image_url)

    def item_completed(self, results, item, info):

        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        print "inside item_completed"
        return item



    def process_item(self, item, spider):
        if spider.name == 'SgsnapDeal':
            print "inside process_item"
            # some code not relevant to the qn
            deal = DailyDeals(source_website_url=source_website_url, source_website_logo=source_website_logo, description=description, price=price, url=url, image_urls=image_urls, city=city, currency=currency)
            deal.save()

在运行爬虫时没有得到“inside process_item”。我也尝试在 scrapy.contrib.pipeline.images.py 文件中添加 process_item 函数,但这也不起作用!

def process_item(self, item, info):
    print "inside process"
    pass

问题:一切正常,下载图像,设置 image_paths 等,我知道 get_media_requests 和 item_completed 在 MyImagesPipeline 中有效,因为一些打印语句,但不是 process_item!任何帮助将不胜感激..

编辑: 以下是其他相关文件:

蜘蛛:

from scrapy.spider import BaseSpider
from dealspider.items import DealspiderItem
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.pipeline.images import ImagesPipeline


class SG_snapDeal_Spider(BaseSpider):
    name = 'SgsnapDeal'
    allowed_domains = ['snapdeal.com']
    start_urls = [
        'http://www.snapdeal.com',
        ]

    def parse(self, response):
        item = DealspiderItem()

        hxs = HtmlXPathSelector(response)
        description = hxs.select('/html/body/div/div/div/div/div/div/div/div/div/a/div/div/text()').extract()  
        price = hxs.select('/html/body/div/div/div/div/div/div/div/div/div/a/div/div/div/span/text()').extract()
        url = hxs.select('/html/body/div/div/div/div/div/div/div/div/div/a/@href').extract()
        image_urls = hxs.select('/html/body/div/div/div/div/div/div/div/div/div/a/div/div/img/@src').extract()

        item['description'] = description
        item['price'] = price
        item['url'] = url
        item['image_urls'] = image_urls
        #works fine!!
        return item

SPIDER = SG_snapDeal_Spider()

Items.py:

from scrapy.item import Item, Field

class DealspiderItem(Item):
    description = Field()
    price = Field()
    url = Field()
    image_urls = Field()
    images = Field()
    image_paths = Field()

【问题讨论】:

  • 起始 URL 是否正确?我运行了蜘蛛和项目代码来测试它们是如何工作的,并且只返回了一个项目,其所有字段都是空白的。
  • @Talvalin,我更正了网址,请重试,谢谢

标签: python-2.7 scrapy


【解决方案1】:

您需要将process_item 放在单独的管道中,以便将您的项目保存在数据库中。 不在images pipeline

使单独的管道像

class OtherPipeline(object):
  def process_item(self, item, info):
    print "inside process"
    pass

pipleline 包含在您的 settings 文件中

【讨论】:

  • 您能解释一下原因吗?我遇到了一个类似的问题,这将有助于了解为什么在他的案例中没有访问它,以及为什么将这个过程放在一个新的管道中会解决它。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多