【问题标题】:Scrapy pipeline error cannot import nameScrapy管道错误无法导入名称
【发布时间】:2013-07-28 15:27:12
【问题描述】:

我是 python 编程和使用 scrapy 的新手。我已经设置了我的爬虫,到目前为止它一直在工作,直到我想弄清楚如何下载图像。我得到的错误是无法导入名称 NsiscrapePipeline。我不知道我做错了什么,而且我不了解一些文档,因为我是新手。请帮忙

物品文件

from scrapy.item import Item, Field

class NsiscrapeItem(Item):
    # define the fields for your item here like:
    # name = Field()
    location = Field()
    stock_number = Field()
    year = Field()
    manufacturer = Field()
    model = Field()
    length = Field()
    price = Field()
    status = Field()
    url = Field()

    pass

蜘蛛

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from NSIscrape.items import NsiscrapeItem
from scrapy.http import Request
from scrapy.contrib.pipeline.images import NsiscrapePipeline
import Image

class NsiscrapeSpider(BaseSpider):
    name = "Nsiscrape"
    allowed_domain = ["yachtauctions.com"]
    start_urls = [
    "http://www.yachtauctions.com/inventory/"
    ]

    def parse(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//tr')
    items = []
    for site in sites:
    item = NsiscrapeItem()
    item['location'] = site.select('td[2]/text()').extract()
    item['stock_number'] = site.select('td[3]/a/text()').extract()
    item['year'] = site.select('td[4]/text()').extract()
    item['manufacturer'] = site.select('td[5]/text()').extract()
    item['model'] = site.select('td[6]/text()').extract()
    item['length'] = site.select('td[7]/text()').extract()
    item['price'] = site.select('td[8]/text()').extract()
    item['status'] = site.select('td[10]/img/@src').extract()
    item['url'] = site.select('td[1]/a/@href').extract()
    item['image_urls'] = site.select('td/a[3]/img/@data-original').extract()
        item['images'] = item['image_urls']
        yield Request(item['url'][0], meta={'item':item}, callback=self.product_detail_page)


    def product_detail_page(self, response):
    hxs = HtmlXPathSelector(response)
    item = response.request.meta['item']
    #add all images url in the item['image_urls']
    yield item

设置

ITEM_PIPELINES = ['scrapy.contrib.pipeline.image.NsiscrapePipeline']
IMAGES_STORE = 'c:\Python27\NSIscrape\IMG'
IMAGES_EXPIRES = 90

管道这是我不确定我是否遗漏了什么的地方

from scrapy.item import Item 

class NsiscrapePipeline(Item):
image_urls = Field()
    images = Field()

    def process_item(self, item, spider):
        return item

错误

File "NSIscrape\spiders\NSI_Spider.py", line 9, in <module>
from scrapy.contrib.pipeline.images import NsiscrapePipeline
ImportError: cannot import name NsiscrapePipeline

【问题讨论】:

  • spider和NSI_Spider一样吗?

标签: python scrapy


【解决方案1】:

你试图传递列表,但这个函数只接受字符串。仅传递列表中的一个元素(例如 list[0])。

【讨论】:

  • @我已将代码更改为 Request(['url'][0],我收到以下错误:raise ValueError('Missing scheme in request url: %s' % self. _url) exceptions.ValueError: Missing scheme in request url: url. 我不明白这是什么意思,我尝试将代码更改为 item[0]、'url'[0],甚至将索引号从 0 更改为 1或 2 但该方法给了我一个索引错误。
  • 我想我真正的问题是如何通过它?
  • 我刚刚发现它来自这一行: item['images'] = site.select('td/a[3]/img/@data-original').extract() 我我想我错过了什么。 @solusipse
  • 这里是确切的错误文件 "C:\python27\lib\site-packages\scrapy-0.16.2-py2.7.egg\scrapy\http\request_init_ .py",第 61 行,在 _set_url 中引发 ValueError('Missing scheme in request url: %s' % self._url) exceptions.ValueError: Missing scheme in request url:/images/photos/8940/wide_8940__0.jpg @solusipse
【解决方案2】:

这是我的最终代码。有两个问题

1:我错过了请求中需要的第二个反斜杠 --> //td[1]/a[3]/img/@data-original

2:我必须检查显示图像的完整 URL,并将它们连接在一起,即主 URL 或允许的 URL 和图像 URL。

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    images = hxs.select('//tr')
    url = []
    for image in images:
        urls = NsiscrapeItem()
        urls['image_urls'] = ["http://www.yachtauctions.com" +  x for x in image.select('//td[1]/a[3]/img/@data-original').extract()]
        url.append(urls)
    return url

【讨论】:

    【解决方案3】:

    这不是图书馆的一部分 :) - 至少通过查看他们当前的 master branch

    我想你在找ImagesPipeline

    他们的榜样可能会有所帮助! example

    附言我不认为你自定义命名类 - 至少不是根据 scapy 的设计方式;我有理由确定您使用他们的课程;)


    【讨论】:

    • 谢谢你这正是我的问题。
    • 我现在收到一个新错误,您知道为什么吗? raise TypeError('Request url must be str or unicode, got %s:' % type (url).__name__) exceptions.TypeError: Request url must be str or unicode, got list:
    • 嗯,您尝试为生成的任何内容提供列表而不是字符串。例如,您尝试在 chrome 中键入 ['stuff.com'] 并且它感到困惑,因为它不知道该怎么做
    • 如何给它一个字符串?我的意思是我从项目 ['url'] 中获取的网址不止 1 个。是这个问题吗?
    • 它可能只是想要网址?抱歉,我没有该功能的上下文。他们中的一些人接受我认为的 get 或 post args 之类的参数
    猜你喜欢
    • 2014-11-22
    • 2016-06-09
    • 1970-01-01
    • 2017-08-11
    • 2021-02-19
    • 2014-01-29
    • 2016-11-21
    • 2018-05-15
    相关资源
    最近更新 更多