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表示优先级,按照自己实际逻辑先后执行顺序 }
以上几步就可以完成数据入库处理啦。