我的刮刀运行良好,它下载图像并在数据库中注册项目,但我也希望将它们的本地路径保存到我的MySQL数据库中,我不知道如何继续。
我在doc:
中读过这篇文章下载图像时,将显示另一个字段(图像) 填充结果。
使用下面的代码,路径未保存,我收到此错误:
return self._values[key]
exceptions.KeyError: 'images'
以下是我的代码摘录:
items.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
pipelines.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()函数中缺少什么?
提前谢谢。
答案 0 :(得分:1)
为了将图像保存到数据库,ITEM_PIPELINES设置中组件的优先级非常重要。
例如,如果您使用MongoDB存储Items。以下是在settings.py
中应该如何确定管道组件的优先级ITEM_PIPELINES = {
'scrapy.contrib.pipeline.images.ImagesPipeline':1,
'yourscrapyproject.pipelines.MongoDBPipeline':100}
上述设置将确保在控件移动到MongoDBPipeline以存储图像信息之前处理图像并填充项目['图像']。
您可以在本文档的最后一部分中阅读有关设置ITEM_PIPELINES优先级的详情:http://doc.scrapy.org/en/latest/topics/item-pipeline.html
花了我几个小时来弄清楚这一点,所以在这里做一个说明,以便它对面临同样问题的其他人有所帮助。
答案 1 :(得分:0)
啊哈。我读过scrapy documentation on downloading images和the source file for images.py。
理论上你正在做的事情应该有效,但是创建一个自定义的图像管道可能会更容易,该图像管道明确地将保存的图像路径附加到每个项目。很轻松,the example given does just that。 :)
实施后,请按照以下步骤修改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文件以引用您的自定义图像管道文件,您应该很高兴。