gpt4 book ai didi

python - 在 Scrapy 中使用 Sqlalchemy 更新表格行

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:38 25 4
gpt4 key购买 nike

我正在使用 scrapy 和 sqlalchemy。在我的 Spider 中,我从一个表中选择并创建请求:

def start_requests(self):

db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
source_table= self.table

engine = create_engine(db_path)
Base = declarative_base()
# metadata = Base.metadata
# Look up the existing tables from database
Base.metadata.reflect(engine)

# Create class that maps via ORM to the database table
table = type(source_table, (Base,), {'__tablename__': source_table})

Session = sessionmaker(bind=engine)
session = Session()
i = 0

for row in session.query(table).filter(table.url.contains('http')).limit(3):

i += 1
print(row.url)
yield Request(url=row.url, headers= headers, callback=self.get_PDF,meta={'session': session,'row': row, 'cookiejar': i },dont_filter = True)

如您所见,我在每个 scrapy 请求中传递了一个 sqlalchemy 行对象。每个行对象都包含我从 scrapy 响应中更新的空白字段。

def get_PDF(self, response):

row = response.meta['row']

row.field1 = response.field1 # simplified pseudocode

现在我想更新行对象,以便将其更改存储在数据库中。如果我要传递 session 对象,我可以执行 session.commit() 。使用 row_object 执行此操作的最佳方法是什么?我需要传递 session 对象吗?

编辑:我改变了我的爬虫来传递 session 对象:

def get_PDF(self, response):

row = response.meta['row']
session = response.meta['session']

row =process_output(o, row)
session.add(row)
session.commit()

最佳答案

我会说始终处理数据库和“外部”存储的最佳方式是使用 Pipeline ,因为它是一种分离代码逻辑的方法。 Pipeline 仅处理蜘蛛返回的项目,因此您无需担心蜘蛛代码中的请求或其他内容。

另外一个 Pipeline 会创建一个与爬虫相关联的对象,并且它只会被实例化一次,这对于这种session 情况会很有帮助。

如果您需要以不同方式处理项目,您始终可以向每个项目发送一个唯一标识符,以便管道知道如何处理每个项目。

编辑:要在蜘蛛内部创建 Session 对象,并在 Pipeline 中重用它,您可以这样做:

蜘蛛:

def start_requests(self):
self.session = Session()

流水线

def process_item(self, item, spider):
...
spider.session.commit()

spider 是整个爬虫的“唯一”spider 实例,因此您可以在那里使用它的属性。

关于python - 在 Scrapy 中使用 Sqlalchemy 更新表格行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com