1

我的刮刀运行良好,它下载图像并在数据库中注册项目,但我也希望将它们的本地路径保存到我的 MySQL 数据库中,我不知道如何继续。

我在文档中读过这个:

下载图像后,另一个字段(图像)将填充结果。

使用下面的代码,路径没有保存,我收到了这个错误:

return self._values[key]
    exceptions.KeyError: 'images'

以下是我的代码摘录:

项目.py:

image_urls = Field()
images = Field()

my_spider.py:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from project.items import ArtistItem

class MySpider(BaseSpider):

    name = 'XXX'
    allowed_domains = ['XXX']
    start_urls = [
        "XXX",
        "XXX"
    ]

    def parse(self, response):
        x = HtmlXPathSelector(response)

        artist = ArtistItem()
        artist['url'] = response.url
        artist['name'] = x.select("//h1/text()").extract()
        artist['city'] = x.select("//span[@class='profile_location']/text()").extract()
        artist['style'] = x.select("//span[@class='profile_genre']/text()").extract()
        image_urls = x.select('/html/body/div[4]/div/div/div[2]/div[2]/div/a/img/@src').extract()
        artist['image_urls'] = ["http:" + x for x in image_urls]

        return artist

管道.py:

from scrapy.http import Request
from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
import MySQLdb
import MySQLdb.cursors
import sys


class ProjectPipeline(object):
    def __init__(self):
        db = MySQLdb.connect(host='localhost', user='XXX', passwd='XXX', db='XXX', charset='utf8',
                             use_unicode=True)

        self.c = db.cursor()
        self.c.connection.autocommit(True)


    def process_item(self, item, spider):
        try:
            self.c.execute("""INSERT INTO artist (name, city, style, image_url)
                        VALUES (%s, %s, %s, %s)""",
                           (item['name'][0],
                            item['city'][0],
                            item['style'][0],
                            item['images'][0]['path'],
                           ))

        except MySQLdb.Error, e:
            print "Error %d: %s" % (e.args[0], e.args[1])
            sys.exit(1)

        return item

我在 parse() 函数中缺少什么?
提前致谢。

4

2 回答 2

1

ITEM_PIPELINES 设置中组件的优先级对于将图像保存到数据库很重要。

例如,如果您使用 MongoDB 来存储项目。以下是您应该如何在 settings.py 中设置管道组件的优先级

ITEM_PIPELINES = {
    'scrapy.contrib.pipeline.images.ImagesPipeline':1,
    'yourscrapyproject.pipelines.MongoDBPipeline':100}

上述设置将确保在控件移动到 MongoDBPipeline 以存储图像信息之前处理图像并填充 item['image']。

您可以在本文档的最后一节中阅读有关在 ITEM_PIPELINES 中设置优先级的更多信息:http: //doc.scrapy.org/en/latest/topics/item-pipeline.html

我花了几个小时才弄清楚这一点,所以在这里做一个笔记,以便对面临同样问题的其他人有所帮助。

于 2014-08-04T09:09:44.593 回答
0

啊哈。我阅读了有关下载图像的 scrapy 文档以及images.py 的源文件

从理论上讲,您所做的应该可以工作,但是创建自定义图像管道可能会更容易,该管道将保存的图像路径显式附加到每个项目。很方便,给出的例子就是这样做的。:)

一旦你实现了它,然后在你的 ProjectPipeline 中修改 process_item 如下:

def process_item(self, item, spider):
    try:
        self.c.execute("""INSERT INTO artist (name, city, style, image_url)
                    VALUES (%s, %s, %s, %s)""",
                       (item['name'][0],
                        item['city'][0],
                        item['style'][0],
                        item['image_paths'],
                       ))

    except MySQLdb.Error, e:
        print "Error %d: %s" % (e.args[0], e.args[1])
        sys.exit(1)

    return item

只需记住更新您的 settings.py 文件以引用您的自定义图像管道文件,您应该一切顺利。

于 2013-05-03T23:47:23.647 回答