以下操作是在window环境下进行的
1.下载mysql 的驱动
pip install mysqlclient
2.新建pipelineItem 类
class MysqlPipelineItem(object):
def __init__(self):
pass
def process_item(self,item,spider):
pass
def close_spider(self):
pass
3数据库连接
- 导入模块
import MySQLdb
- 数据库连接
MySQLdb.connect(*base,**kw)
base是一个可变的列表(主要是数据库的连接信息),需要有序
- host // 主机ip
- username //用户名
- password //密码
- dbname //数据库名称
- dbalias //数据库别名
- port //端口号
kw 是可变参数的字典类型提供数据库连接的额外信息
- charset: 字符集,中午你环境一般设为
utf8
- use_unicode: bool值
self.__conn = MySQldb.connect('127.0.0.1', 'root', '111111', 'scrapy', 'scrapy', '3306',**{use_unicode = True,charset='utf8'})
self.__cursor = self.__conn.cursor() #获取cursor
执行sql语句
# sql 中可以使用占位符,占位符内容的填充需要放在第二个参数 tuple_argument 中
self.__cursor.execute(sql,tuple_argument)
self.__conn.commit()
配置ITEM_PIPELINES
在settings.py文件下找到ITEM_PIPELINES,添加自定义的pipeline
ITEM_PIPELINES = {
# 'pipeline_class_path': priority(数值越小优先级越高,范围1~1000)
}
完整的代码
import MySQLdb
class MysqlPipelineItem(object):
def __init__(self):
self.__conn = MySQLdb.connect('127.0.0.1', 'root', 'root', 'scrapy',**{use_unicode=True, charset = 'utf8'})
self.__cursor = self.__conn.cursor()
def process_item(self,item,spider):
sql = '''insert into article(title,url, image_url,create_time,content) values (%s, %s, %s, %s, %s)
'''
sql.__cursor.execute(sql,(item['title'],item['url'],item['image_url'],item['create_time'],item['content']))
self.__conn.commit()
return item
def close_spider(self):
self.__cursor.close()
self.__conn.close()
出现过的问题:
- TypeError: not all arguments converted during string formatting
就是sql语句的占位符个数和实际提供参数值个数不同 - _mysql_exceptions.OperationalError: (1241, ‘Operand should contain 1 column(s)’)
我出现这个异常的原因是,我传入的参数值是列表,我将列表转为字符串就好了(“”.join(item[‘content’]))。还有可能有别的原因会导致这个异常,有知道的朋友欢迎留言