【发布时间】:2016-05-02 21:58:23
【问题描述】:
首先,这是我想要做的:
我有一个 XMLFeedSpider,它遍历 XML 文件中的产品列表(节点)并创建保存到管道中我的数据库的项目。第一次看到产品时,我需要创建请求以在产品的 url 字段上进行一些抓取以获取图像等。在后续读取提要时,如果我看到相同的产品,我不想浪费时间/资源这样做,只是想跳过这些额外的请求。要查看要跳过的产品,我需要访问我的数据库以查看该产品是否存在。
以下是我能想到的多种方法:
- 只需为蜘蛛中的每个产品创建一个数据库请求。这个 似乎是个坏主意。
- 在我的项目存储管道中,我已经创建了一个数据库池,如下所示:
dbpool = adbapi.ConnectionPool('psycopg2', cp_max=2, cp_min=1, **dbargs)并且使用它似乎更有效,所以我不会经常创建新的数据库连接。我不知道如何在我的蜘蛛中访问实例化的管道类(这可能更像是一个一般的 python 问题)。
注意:这个人基本上是在问同样的问题,但并没有真正得到他想要的答案。 How to get the pipeline object in Scrapy spider - 也许在开始抓取之前将所有产品 URL 加载到内存中,以便在处理产品时进行比较?哪里是这样做的好地方?
- 其他建议?
更新:这是我使用数据库池的管道
class PostgresStorePipeline(object):
"""A pipeline to store the item in a MySQL database.
This implementation uses Twisted's asynchronous database API.
"""
def __init__(self, dbpool):
print "Opening connection pool..."
dispatcher.connect(self.spider_closed, signals.spider_closed)
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
dbargs = dict(
host=settings['MYSQL_HOST'],
database=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWD'],
#charset='utf8',
#use_unicode=True,
)
dbpool = adbapi.ConnectionPool('psycopg2', cp_max=2, cp_min=1, **dbargs)
return cls(dbpool)
【问题讨论】:
-
你的意思是 url 对吗?
-
不是网址,我想正确的术语是 xml 的“节点”。我可以看到说项目是多么令人困惑。有一个 xml 文件,其中有许多节点,我将每个节点都保存为一个项目。我将更新问题以使其更清楚
-
是的,但你想避免这些节点内的 url 对吗?在以后的工作中对同一个 url 做多个请求
-
是的,我想避免节点中的 url,我已经在之前的抓取中将节点保存到数据库中。
标签: python scrapy scrapy-spider