03.5.1. 存储数据到json文件
class StudyPipeline(object):
# 构造方法
def __init__(self):
self.f = None # 定义一个文件描述符属性
# 下列都是在重写父类的方法:
# 开始爬虫时,执行一次
def open_spider(self, spider):
print('爬虫开始')
# 打开一个json文件用于接收json方法写入的数据
self.f = open('douban.json', 'w', encoding='utf-8')
# 专门处理item对象
# 因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
def process_item(self, item, spider):
# 将jsondumps方法获取的数据赋值给content
# 为什么将item转换成字典呢,因为这个item返回的值是scrapy特有的存储,python是不识别的
content = json.dumps(dict(item), ensure_ascii=False)+",\n"
self.f.write(content)
# 传递到下一个被执行的管道类,一定要返回item不然就会出错
return item
# 关闭爬虫
def close_spider(self, spider):
print('爬虫结束')
self.f.close()
03.5.2. 存储数据到Mysql数据库
# 管道文件中的一个管道类对应的是将数据存储到一种平台
# 爬虫文件提交的item只会给管道文件中第一个被执行的管道类接受
# process_item的return item表示item传递到下一个被执行的管道类
# 将数据存储到数据库
class mysqlPipeline(object):
# pymysql插入数据简单用法
# 1. 连接connect = pymysql.connect("各种配置")
# 2. 创建游标 cursor = connect.cursor()
# 3. 执行sql语句 cursor.execute("sql")
# 4. 提交 connect.commit()
# 5. 关闭游标 cursor.close
# 6. 关闭数据库 connect.close
# 注意:56顺序不可颠倒!
# 构造方法
def __init__(self):
self.conn = None # 定义一个文件描述符属性
self.cursor = None
self.num = 0
# 下列都是在重写父类的方法:
# 开始爬虫时,执行一次
def open_spider(self, spider):
# 首先初始化构建一个建表sql
sql = '''
create table movie
(
movie_name varchar(500) ,
movie_link varchar(500) ,
star varchar(500),
quote varchar(500)
)
'''
# 连接mysql数据库
# 注:此处的配置建议写在setting配置中
self.conn = pymysql.connect(
host='192.168.0.157', # IP地址
port=3306, user='root', # 端口,账号
password='123456', # 密码
database='movie_top250', # 数据库名字
charset='utf8') # 字符集
cursor = self.conn.cursor() # 建立游标
cursor.execute(sql) # execute方法执行sql语句
self.conn.commit() # commit方法提交一个执行语句(只有插入和更新才需要哦)
print('爬虫数据库开始')# print在python3里需要加()
# 专门处理item对象
# 因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
def process_item(self, item, spider):
# 为了方便理解,这里将item返回的数据赋值给下边插入语句使用
movie_name = item['movie_name']
movie_link = item['movie_link']
star = item['star']
quote = item['quote']
# 执行sql前要建立一个游标,在上边方法已经连接数据库了所以这里不需要重连
self.cursor = self.conn.cursor()
# 进行mysql的异常捕获
try:
# 插入数据时候一定要对应好行和列
# 下方%s格式化字符串可以用format,自行测试
self.cursor.execute('''
insert into movie
values(%s,%s,%s,%s)''', (movie_name, movie_link, star, quote))
self.conn.commit() # 提交上方的插入sql
except Exception as e:
print(e)
self.conn.rollback() # 回滚
return item
# 关闭游标,关闭数据库连接
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
print('爬虫数据入库结束')