MENU

scrapy数据入库处理

前言

对于数据存储,通常情况下存入MySQL或者MongoDB两种数据存储。下面主要以MySQL为例子。再scrapy中有一个叫Pipeline(管道),scrapy对于爬数据的分工很明确,爬虫部分、数据定义部分、管道部分。管道部分主要实现对爬取的数据流进行后期存储或者清洗等等。

实战scrapy+MySQL存储信息

  • 首先需要对Python连接数据库支持,需要安装一个扩展包,可以理解为一个数据库连接驱动吧(桥梁作用)

    pip install pymysql
    
  • 接着创建一个MySQLPipeline管道

    class MySQLPipeline(object):
    
     def __init__(self, host, port, database, username, password):
         self.host = host
         self.port = port
         self.database = database
         self.username = username
         self.password = password
    
     @classmethod
     def from_crawler(cls, crawler):
         return cls(
             host=crawler.settings.get('MYSQL_HOST'),
             port=crawler.settings.get('MYSQL_PORT'),
             database=crawler.settings.get('MYSQL_DATABASE'),
             username=crawler.settings.get('MYSQL_USERNAME'),
             password=crawler.settings.get('MYSQL_PASSWORD'),
         )
    
     def open_spider(self, spider):
         self.db = pymysql.connect(self.host, self.username, self.password, self.database, charset='utf8',
                                   port=self.port)
         self.cursor = self.db.cursor()
    
     def close_spider(self, spider):
         self.db.close()
    
     def process_item(self, item, spider):
         data = dict(item)  # item为spider中传入的数据
         insert_sql = "insert into morning(xx,xx,xx,xx,xx) VALUES (%s, %s, %s, %s, %s)"  # 按照自己实际业务需要修改
         try:
             # 执行sql语句
             self.cursor.execute(insert_sql, tuple(data.values()))
             # 提交到数据库执行
             self.db.commit()
         except:
             # 如果发生错误则回滚
             self.db.rollback()
         return item
    

    敲重点:需要注意的是item中字段对应顺序要跟插入数据sql中字段顺序要对应上,不然插库出现不对应情况。

  • setting.py文件配置数据库信息以及引入MySQLPipeline管道

     # MYSQL INFO 配置数据库信息
     MYSQL_HOST = '127.0.0.1' # 数据库IP地址
     MYSQL_PORT = 3306        # 数据库端口
     MYSQL_DATABASE = 'xxxx'  # 数据库名
     MYSQL_USERNAME = 'xxxx'  # 数据库用户名
     MYSQL_PASSWORD = 'xxxx'  # 数据库密码
     
     # 引入MySQLPipeline管道
     ITEM_PIPELINES = {
         'xxxxx.pipelines.MySQLPipeline': 300,  # 300表示优先级,按照自己实际逻辑先后执行顺序
     }
    

    以上几步就可以完成数据入库处理啦。

项目实战

Python基于Scrapy爬取www.rkpass.cn题目

标签: Python, Scrapy
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码