scrapy mysql的同步插入与异步插入

本文介绍了如何在Scrapy爬虫项目中使用Pipeline进行MySQL数据同步和异步插入。提供了完整的同步及异步插入代码示例,帮助理解两者在效率和执行流程上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要代码是在Pipeline中进行编写,上完整代码:

同步插入代码:

# 同步插入
class MysqlPipeline2(object):
    """
    同步操作
    """

    def __init__(self):
        # 建立连接
        self.conn = pymysql.connect('localhost', 'root', 'Abcd1234', 'test')  # 有中文要存入数据库的话要加charset='utf8'
        # 创建游标
        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        # sql语句
        insert_sql = """
        insert into test_zxf(quote,author,tags,born_date,born_location) VALUES(%s,%s,%s,%s,%s)
        """
        # 执行插入数据到数据库操作
        self
### Scrapy动态Pipeline插入MySQL数据库 在Scrapy中,可以通过自定义`ITEM_PIPELINES`以及配置参数的方式实现动态地将数据插入MySQL数据库。以下是具体实现方式: #### 配置项设置 为了使管道能够正常工作,需在项目的`settings.py`文件中添加以下配置内容: ```python ITEM_PIPELINES = { 'myproject.pipelines.DynamicAsyncMySQLPipeline': 300, } MYSQL_SETTINGS = { 'host': 'localhost', 'port': 3306, 'user': 'dynamic_user', 'password': 'dynamic_password', 'db': 'dynamic_database', 'charset': 'utf8mb4', 'autocommit': True, 'maxsize': 10, 'minsize': 1, } [^1] ``` #### 自定义Pipeline类 创建一个名为`DynamicAsyncMySQLPipeline`的管道类,在该类中利用异步连接池技术完成数据写入操作。 ##### 实现代码 ```python import pymysql from twisted.enterprise import adbapi class DynamicAsyncMySQLPipeline: def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_crawler(cls, crawler): adbparams = dict( host=crawler.settings.get('MYSQL_SETTINGS')['host'], port=crawler.settings.get('MYSQL_SETTINGS')['port'], user=crawler.settings.get('MYSQL_SETTINGS')['user'], password=crawler.settings.get('MYSQL_SETTINGS')['password'], db=crawler.settings.get('MYSQL_SETTINGS')['db'], charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) dbpool = adbapi.ConnectionPool('pymysql', **adbparams) return cls(dbpool) def process_item(self, item, spider): query = self.dbpool.runInteraction(self.do_insert, item) query.addErrback(self.handle_error, item, spider) return item def do_insert(self, cursor, item): insert_sql = """ INSERT INTO my_table (field1, field2, field3) VALUES (%s, %s, %s); """ cursor.execute(insert_sql, ( item['field1'], item['field2'], item['field3'] )) def handle_error(self, failure, item, spider): spider.logger.error(f"Error processing item: {failure}") ``` 上述代码实现了以下几个功能: - 使用Twisted框架中的`adbapi.ConnectionPool`建立异步数据库连接池[^3]。 - 定义了一个静态方法`from_crawler`用于初始化管道实例,并读取全局配置中的MySQL参数[^1]。 - `process_item`函数负责接收来自Spider解析后的Item对象,并将其传递给回调函数执行具体的SQL语句[^4]。 - 错误处理机制通过捕获异常日志记录错误信息[^5]。 #### MySQL表结构设计 假设目标表名叫做`my_table`,其字段分别为`field1`, `field2`, 和`field3`。可以预先创建好对应的表格以便于后续存储数据。 --- ### 注意事项 如果需要支持更复杂的场景或者多张不同类型的表,则可以在pipeline内部增加判断逻辑来区分不同的item类型并采取相应的入库策略。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值