1.保存数据为TXT格式
在上一篇文章里面我给大家介绍了如何抓取豆瓣数据,现在的目的就是抓取下来的数据要保存到本地,这样子方便我们出去查看,可以多种格式:
比如txt,json,xml,或者MySQL和MongoDB都行,看你喜欢喽
下面我就先以第一种方式给大家演示一下第一种:
class DoubanPipeline(object):
def process_item(self, item, spider):
#获取当前工作目录
base_dir=os.getcwd()
filename=base_dir+"/douban.txt"
#爬取的内容写入文件以追加的方式
with open(filename,'a',encoding='utf-8') as f:
f.write("".join(item["numbers"])+"\n")#写入序号换行
f.write("".join(item["link"])+"\n") #写入链接换行
f.write("".join(item["movie_name"])+"\n")#写入电影名字换行
f.write("".join(item["director"])+"\n")#写入导演还有电影的类型
f.write("".join(item["rating_num"])+"\n")#星级
f.write("".join(item["evaluate"]) +"\n")#评价的人数
f.write("".join(item["desc"])+"\n")#描述
#关闭文件操作
f.close()
return item
(1).需要注意的问题是如果你是运行在Python2.7的环境下的话就不用加encoding='utf-8'
,Python3的话就需要指定编码否则会乱码
(2).写完之后在settings.py
里面开启
代码:
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
'douban.pipelines.JsonPipeline': 200,
'douban.pipelines.MysqlPipeline': 100
}
2.保存为json数据
(1).什么是JSON?
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
JSON 是轻量级的文本数据交换格式
JSON文件
JSON 文件的文件类型是 ".json"
JSON 文本的 MIME 类型是 "application/json"
(2).代码如下:
#保存为json数据
class JsonPipeline(object):
def __init__(self):
self.file=open("./douban.json","wb")
def process_item(self, item, spider):
line=json.dumps(dict(item),ensure_ascii=False)+"\n"
self.file.write(line.encode('utf-8'))
return item
def spider_closed(self):
self.file.close()
-
__init__
函数首先初始化这个函数,以写入流的方式读写这个文本 - json.dumps
- json.dumps 用于将 Python 对象编码成 JSON 字符串
- 语法
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
案例:
import json
data=[{"name":"苍井空","age":35,"name1":"波多野结衣","age1":30}]
json=json.dumps(data,ensure_ascii=False)
print(json)
以上代码的执行结果为
[{"name": "苍井空", "age": 35, "age1": 30, "name1": "波多野结衣"}]
3.最后一种保存到MySQL中去
(1).首先要安装pymysql
直接pip install pymysql简单粗暴
安装成功后是这样子的
(2).使用之前自己先创建好数据库和数据表
- 创建数据库douban
CREATE DATABASE IF NOT EXISTS douban;
- 创建数据表doubanmovie
DROP TABLE IF EXISTS `doubanmovie`;
CREATE TABLE `doubanmovie` (
`numbers` varchar(100) NOT NULL,
`movie_name` varchar(100) DEFAULT NULL,
`rating_num` varchar(100) DEFAULT NULL,
`director` varchar(100) DEFAULT NULL,
`link` varchar(100) DEFAULT NULL,
`desc` varchar(100) DEFAULT NULL,
`evaluate` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 保存到MySQL中
#爬取到的数据保存到MySQL数据库里面去
class MysqlPipeline(object):
def __init__(self):
#数据库的连接
self.conn=pymysql.connect(
host="127.0.0.1", #主机名地址
port=3306, #端口号
user="root", #用户的密码
passwd="root", #你自己的密码
db="douban", #数据库法人名字
charset="utf8" #设置编码是为了防止乱码
)
#通过cursor()方法创建自己的游标对象
self.cursor=self.conn.cursor()
self.cursor.execute('truncate table doubanmovie')
self.conn.commit()
def process_item(self,item,spider):
try:
#插入你的SQL语句
self.cursor.execute('''insert into doubanmovie (`numbers`,`movie_name`,`rating_num`,`director`,`link`,`desc`,`evaluate`)
VALUES (%s,%s,%s,%s,%s,%s,%s)
''',(item["numbers"],item["movie_name"],item["rating_num"],item["director"],item["link"],item["desc"],item["evaluate"]))
#提交数据库事务
self.conn.commit()
except:
#如果发生错误就会回滚
self.conn.rollback()
return item
里面的注释有说明我就不多说了
(3). 下面可以在数据库里面查询表数据
- 可以使用外部工具Navicat for MySQL
- 我就截取一部分数据给大家看就行
mysql> select * from doubanmovie
where numbers=1;
+---------+--------------+------------+--------------------+-------------------------------------------+----------------+---------------+
| numbers | movie_name | rating_num | director | link | desc | evaluate |
+---------+--------------+------------+--------------------+-------------------------------------------+----------------+---------------+
| 1 | 肖申克的救赎 | 9.6 | 1994/美国/犯罪剧情 | https://movie.douban.com/subject/1292052/ | 希望让人自由。 | 1164078人评价 |
+---------+--------------+------------+--------------------+-------------------------------------------+----------------+---------------+
1 row in set
- 肖申克的救赎在豆瓣top250里面排名第一,评分9.6,属于犯罪剧情片,可谓是一部不错的影片
mysql> select * from doubanmovie
where numbers=250
;
+---------+------------+------------+----------------------------+-------------------------------------------+-------------------+--------------+
| numbers | movie_name | rating_num | director | link | desc | evaluate |
+---------+------------+------------+----------------------------+-------------------------------------------+-------------------+--------------+
| 250 | 蓝色大门 | 8.3 | 2002/台湾法国/剧情爱情同性 | https://movie.douban.com/subject/1308575/ | 青春的窃窃私语。 | 292193人评价 |
+---------+------------+------------+----------------------------+-------------------------------------------+-------------------+--------------+
1 row in set
- 排名最后的是蓝色大门,这一部台湾爱情片居然拍最后,看关键字眼同性啊各位兄弟
- 结束语
欢迎各种像我一样的Python菜鸟,Python大神加入,一起愉快地交流学♂习,van♂转py。
祝大家周末愉快!