toolkit-frame之toolkit-sprider 防止重复采集的数据库(Python)

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: toolkit-frame之toolkit-sprider 防止重复采集的数据库(Python)

对于采集的图片等资源如果采集过了再一次采集就不对了,浪费硬盘也浪费采集的时间,各种浪费,针对这个问题做了个数据库设计,防止同样的数据二次采集。

因为是pytho语言所以框架采用SQLAlchemy。这玩意网上介绍有很多,洒家就不介绍了。不清楚的问问度娘。看代码吧。

from sqlalchemy import Column
from sqlalchemy.types import  String
from main.base.BaseEntity import BaseEntity
class SpriderEntity(BaseEntity):
    __tablename__ = 'sprider_pic'
    sprider_base_url = Column(String, primary_key=True)
    sprider_url = Column(String)
    sprider_pic_index = Column(String)
    sprider_pic_title = Column(String)
    sprider_pager_index = Column(String)
    sprider_type = Column(String)
    create_datetime = Column(String)

当时目光短浅了以为只能采集pic就把名写成PIC了。

另外一个核心就是数据的保存和查询,不废话直接代码:

from sqlalchemy import func
from main.base.BaseFrame import BaseFrame
from main.base.SqliteAccess import SqliteAccess
from main.base.MySqlAccess import MySqlAccess
import pymysql
from sprider.object.SpriderEntity import SpriderEntity
from main.plugin.log.Logger import Logger
pymysql.install_as_MySQLdb()
class SpriderAccess(SqliteAccess):
    # region 保存采集信息 zhangyu-2019-7-18
    def save_sprider(self, model_entity):
        session = SqliteAccess.connection()
        try:
            session.add(model_entity)
            session.commit()
            return True
        except Exception as e:
            Logger.error("save_sprider:保存数据出现 错误" + str(e))
            session.rollback()
            return False
        finally:
            session.close()
    # endregion
    def query_sprider_entity_by_urlandindex(self, sprider_url, pic_index):
        session = SqliteAccess.connection()
        try:
            entity = session.query(SpriderEntity).filter_by(sprider_url=str(sprider_url),
                                                            sprider_pic_index=str(pic_index)).first()
            return entity
        except Exception as e:
            BaseFrame.__err__("query_sprider" + str(e))
            return None
        finally:
            session.close()
    def query_sprider_entity_by_urlandtitle(self, sprider_url, sprider_title):
        session = SqliteAccess.connection()
        try:
            entity = session.query(SpriderEntity).filter_by(sprider_url=sprider_url,
                                                            sprider_pic_title=sprider_title).first()
            return entity
        except Exception as e:
            BaseFrame.__err__("query_sprider_entity_by_urlandtitle"+str(e))
            return None
        finally:
            session.close()
    def delete_sprider_info(self, sprider_url, sprider_title):
        session = MySqlAccess.connection()
        try:
            lottery_entity = session.query(SpriderEntity).filter_by(sprider_url=sprider_url,
                                                                    sprider_pic_title=sprider_title).first()
            if lottery_entity is None:
                return True
            session.delete(lottery_entity)
            session.commit()
            return True
        except:
            session.rollback()
            return False
        finally:
            session.close()
        pass
    def find_pager_by_url_and_type(self, sprider_base_url, sprider_type):
        session = SqliteAccess.connection()
        try:
            # entity = session.query(SpriderEntity).filter_by(sprider_base_url=sprider_base_url,
            #                                                 sprider_type=sprider_type).max()
            entity = session.query(func.max(SpriderEntity.sprider_pager_index)).filter_by(
                sprider_base_url=sprider_base_url, sprider_type=sprider_type).group_by(
                SpriderEntity.sprider_pager_index).all()
            if len(entity) == 0:
                number = 0
            else:
                for e in entity:
                    number = (e[0])
            return int(number)
        except Exception as e:
            Logger.error(str(e))
            return 0
        finally:
            session.close()
        pass
    def query_sprider(self):
        session = SqliteAccess.connection()
        try:
            sprider_list = session.execute("SELECT * FROM sprider_pic LIMIT 10 OFFSET 1").fetchall()
            return sprider_list
        except Exception as e:
            return None, str(e)
        finally:
            session.close()
        pass

里面有一些我框架的东西还望见谅!

 

数据库是sqlit3的,原始文件我就不上传了,自己动手搞搞,锻炼一下。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
485 7
|
3月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
6月前
|
JSON API 数据格式
Python采集京东商品评论API接口示例,json数据返回
下面是一个使用Python采集京东商品评论的完整示例,包括API请求、JSON数据解析
|
4月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
4月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
4月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
424 0
|
5月前
|
API Python
Python采集淘宝店铺所有商品API接口指南
淘宝没有公开的官方API供采集店铺商品数据,但可以通过以下几种方法获取商品信息。需要注意的是,淘宝有严格的反爬机制,直接采集可能违反其服务条款。
|
6月前
|
数据采集 XML 数据处理
淘宝商家采集工具,淘宝买家联系方式采集,淘宝卖家旺旺采集软件【python】
以上代码实现了一个基础的淘宝数据采集框架,包含爬虫核心、数据处理和代理管理三个模块。
|
7月前
|
数据采集 数据可视化 JavaScript
用Python采集CBC新闻:如何借助海外代理IP构建稳定采集方案
本文介绍了如何利用Python技术栈结合海外代理IP采集加拿大CBC新闻数据。内容涵盖使用海外代理IP的必要性、青果代理IP的优势、实战爬取流程、数据清洗与可视化分析方法,以及高效构建大规模新闻采集方案的建议。适用于需要获取国际政治经济动态信息的商业决策、市场预测及学术研究场景。

推荐镜像

更多