2

我有这个代码

class MyImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
            for image_url in item['image_urls']:
                yield Request(image_url)

这是从 BaseSpider 子类化的蜘蛛。这个基地蜘蛛让我做噩梦

def parse(self, response):

    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//strong[@class="genmed"]')
    items = []


    for site in sites[:5]:

        item = PanduItem()
        item['username'] = site.select('dl/dd/h2/a').select("string()").extract()
        item['number_posts'] = site.select('dl/dd/h2/em').select("string()").extract()
        item['profile_link'] = site.select('a/@href').extract()



        request =  Request("http://www.example/profile.php?mode=viewprofile&u=5",
        callback = self.parseUserProfile)
        request.meta['item'] = item
        return request

 def parseUserProfile(self, response):

        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//div[@id="current')
        myurl = sites[0].select('img/@src').extract()

        item = response.meta['item']

        image_absolute_url = urljoin(response.url, myurl[0].strip())
        item['image_urls'] = [image_absolute_url]

        return item

这是我得到的错误。我找不到。看起来像是它的获取项目,但我不确定

ERROR

File "/app_crawler/crawler/pipelines.py", line 9, in get_media_requests
            for image_url in item['image_urls']:
        exceptions.TypeError: 'NoneType' object has no attribute '__getitem__'
4

3 回答 3

2

您的 pipelines.py 中缺少一个方法 所述文件包含 3 个方法:

  • 处理项目
  • 获取媒体请求
  • item_completed

item_completed 方法是处理将图像保存到指定路径的方法。此路径在 settings.py 中设置如下:

ITEM_PIPELINES = ['scrapy.contrib.pipeline.images.ImagesPipeline']
IMAGES_STORE = '/your/path/here'

如上所示,settings.py 中还包含启用图像管道的行。

我试图用我理解的最好的方式来解释它。如需进一步参考,请查看官方 scrapy文档

于 2013-07-14T13:03:49.233 回答
0

并将 IMAGES_STORE 设置设置为将用于存储下载图像的有效目录。否则管道将保持禁用状态,即使您将其包含在 ITEM_PIPELINES 设置中也是如此。

例如:

IMAGES_STORE = '/path/to/valid/dir'
于 2013-01-22T13:56:11.217 回答
0

嗯。item您绝不会追加items(尽管文档中的示例代码也没有追加,所以我可能会叫错树)。

尝试parse(self, response)像这样添加它,看看这是否能解决问题:

for site in sites:
    item = PanduItem()
    item['username'] = site.select('dl/dd/h2/a').select("string()").extract()
    item['number_posts'] = site.select('dl/dd/h2/em').select("string()").extract()
    item['profile_link'] = site.select('a/@href').extract()

    items.append(item)
于 2012-12-14T16:30:38.027 回答