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"]))

 

posted @ 2018-02-02 12:50  小虾饺  阅读(337)  评论(0)    收藏  举报