Scrapy 将数据导入MySQL
配置环境:已安装好Scrapy库,MySQL,Navicat for MySQL 可视化工具;
基本思路:
1.pipeline文件处理的是spider爬取得到的item进行处理,包括导入数据库,保存图片及json文件,以及各种处理。
2.通过Navicat可视化工具先对MySQL数据库进行预处理,或者是MySQL Shell,建表插数据;
常用MySQL 语句:
1.新建数据库及表格:
- create database <数据库名>:新建数据库
- create table if not exists <表名> (
task_id INT(11) NOT NULL AUTO_INCREMENT,
subject VARCHAR(45) DEFAULT NULL,
start_date DATE DEFAULT NULL,
end_date DATE DEFAULT NULL,
description VARCHAR(200) DEFAULT NULL,
PRIMARY KEY (task_id) )
)
每一列的数据需要指定数据类型;是否接受Null值;
2.查询语句:
- use <数据库名>: 使用数据库
- select column_1, column_2, column_3 from <表名>:查看表中某几列的数据
- select * from <表名>:查看所有数据
3.插入语句:
insert into table (column1,column2, column3...)
values (value1,value2, value3...),(value1,value2,value3),...;
只有插入数据后才能查询;
参考链接:http://www.yiibai.com/mysql/insert-statement.html
实现代码:
1. 自定义用于处理(存入MySQL)的pipeline:
1 class MysqlPipeline(object): 2 def __init__(self): 3 self.conn=MySQLdb.connect(host='localhost',user='root',pass_wd='950217',db='article_spider',charset="utf8",use_unicode=True) 4 self.cursor=self.conn.cursor() #使用cursor方法获取操作游标,来对mysql数据库进行操作 5 6 def process_item(self,item,spider): 7 insert_sql=""" 8 insert into article(title,begin_date,text,tags) 9 VALUES (%s,%s,%s,%s) 10 """ 11 self.cursor.execute(insert_sql,(item["title"],item["begin_date"],item["text"],item["tags"])) 12 self.conn.commit()
- 需要使用python连接mysql的库:mysqldb
- 3:使用MySQLdb.connect()方法打开数据库连接;这个方法的参数详见:https://moreoronce.gitbooks.io/learnpython/content/300/302.html
- 4:cursor是操作游标
- 11.cursor.execute()是真正执行MySQL语句的方法
- 12. con.commit() 提交事务
2. 使用twisted异步插入MySQL
Twisted为关系型数据库提供了异步的操作;
代码实现:
from twisted.enterprise import adbapi
import MySQLdb.cursors
1 class MysqlTwistedPipeline(object): 2 def __init__(self,dbpool): 3 self.dbpool=dbpool 4 5 @classmethod 6 def from_settings(cls,settings): 7 dbparams=dict( 8 host=settings["MYSQL_HOST"], 9 db=settings["MYSQL_DBNAME"], 10 user=settings["MYSQL_USER"], 11 passwd=settings["MYSQL_PASSWORD"], 12 charset='utf8', 13 cursorclass=MySQLdb.cursors.DictCursor, 14 use_unicode=True 15 ) 16 17 dbpool=adbapi.ConnectionPool("MySQLdb",**dbparams) 18 19 return cls(dbpool) 20 def process_item(self,item,spider): 21 #使用twisted将Mysql插入变成异步执行 22 query=self.dbpool.runInteraction(self.do_insert,item) #调用do_insrt执行插入数据库的具体逻辑 23 query.addErrback(self.handle_error,item,spider) #调用handle_error处理异步插入过程中的异常 24 25 def handler_error(self,failure,item,spider): 26 #处理异步插入的异常 27 print(failure) 28 29 def do_insert(self,cursor,item): 30 #执行具体的插入逻辑 31 insert_sql = """ 32 insert into article(title,begin_date,text,tags) 33 VALUES (%s,%s,%s,%s) 34 """ 35 cursor.execute(insert_sql, (item["title"], item["begin_date"], item["text"], item["tags"]))

浙公网安备 33010602011771号