如何使用Flask-SQLAlchemy模型插入爬虫采集的数据?
解决方案
方式1:边爬边插入数据库
无需先将数据存入列表,爬取到单条数据后直接创建Job实例并写入数据库:
from your_app_module import db, Job # 替换为你的Flask应用模块路径 # 遍历Selenium获取的元素集合 for row in tables: # 爬取对应字段数据(注意替换为实际匹配各字段的CSS选择器) title = row.find_element(By.CSS_SELECTOR, '.title-class').text info = row.find_element(By.CSS_SELECTOR, '.info-class').text location = row.find_element(By.CSS_SELECTOR, '.location-class').text link = row.find_element(By.CSS_SELECTOR, '.link-class').get_attribute('href') # 创建Job模型实例 new_job = Job(title=title, info=info, location=location, link=link) # 将实例添加到数据库会话 db.session.add(new_job) # 提交所有变更至数据库 db.session.commit()
方式2:先存列表再批量插入
如果仍保留先存列表的习惯,可将列表中的字典数据转成Job实例后批量插入:
from your_app_module import db, Job jobs = [] for row in tables: jobs.append({ 'title': row.find_element(By.CSS_SELECTOR, '.title-class').text, 'info': row.find_element(By.CSS_SELECTOR, '.info-class').text, 'location': row.find_element(By.CSS_SELECTOR, '.location-class').text, 'link': row.find_element(By.CSS_SELECTOR, '.link-class').get_attribute('href'), }) # 遍历列表,将字典转成Job实例并添加到会话 for job_data in jobs: new_job = Job(**job_data) # 字典解包直接赋值给模型字段 db.session.add(new_job) # 提交事务 db.session.commit()
关键注意事项
- 若爬虫是独立脚本,需先初始化Flask应用上下文才能操作数据库:
from your_app import create_app, db, Job app = create_app() with app.app_context(): # 在此处编写爬取和插入逻辑 - 只有执行
db.session.commit(),会话中的变更才会真正写入数据库;若插入过程出错,可通过db.session.rollback()回滚操作。 - 可选去重:为避免重复插入相同数据,可给
Job模型的link字段添加unique=True约束,或插入前先查询校验:existing_job = Job.query.filter_by(link=link).first() if not existing_job: db.session.add(new_job)
内容的提问来源于stack exchange,提问作者hemoglobin
相关产品推荐
相关产品推荐

