scrapy爬虫数据保存为txt,json,mysql的方法
上次我们写了一个将明凯博客首页的数据保存到数据库的方法。
但是有一些朋友说不需要将数据保存到mysql中,他们只需要保存到txt,或者csv,或者json格式中。
那么这篇文章就是来教我们来怎么写,保存到txt,json,mysql的方法。
一、保存到txt
直接是处理文件的方法,同样适用于csv,csv可以当作于一个txt来操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class TxtPipeline(object): '''保存到txt''' def process_item(self, item, spider): reload(sys) sys.setdefaultencoding('utf-8') # 获取当前工作目录 base_dir = os.getcwd() fiename = base_dir + '/news.txt' # 从内存以追加的方式打开文件,并写入对应的数据 with open(fiename, 'a') as f: f.write(item['title'] + '\n') f.write(item['link'] + '\n') return item |
二、保存到json
运用json dumps方法来操作。
1 2 3 4 5 6 7 8 9 10 11 12 | class JsonPipeline(object): '''保存到json''' def process_item(self, item, spider): base_dir = os.getcwd() filename = base_dir + '/news.json' # 打开json文件,向里面以dumps的方式吸入数据 # 注意需要有一个参数ensure_ascii=False ,不然数据会直接为utf编码的方式存入比如 # :“/xe15” with codecs.open(filename, 'a') as f: line = json.dumps(dict(item), ensure_ascii=True) + '\n' f.write(line) return item |
三、保存到mysql中
这个我们已经实现过,我们还是来贴一下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class MysqlPipeline(object): '''保存到mysql''' def process_item(self,item,spider): # 将item里的数据拿出来 title = item['title'] link = item['link'] content = item['content'] # 和本地的数据库建立连接 host = settings['MYSQL_HOSTS'] user = settings['MYSQL_USER'] psd = settings['MYSQL_PASSWORD'] db = settings['MYSQL_DB'] cha=settings['CHARSET'] db = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,charset=cha) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = "INSERT INTO aimks(title,link,content) VALUES (%s,%s,%s)" data=[title,link,content] try: # 执行SQL语句 cursor.execute(sql,data) # 提交修改 db.commit() print title+':导入成功' except: db.rollback() print title+':导入失败' finally: # 关闭连接 db.close() return item |
四、需要用到的库
很多同学直接用了上面的代码,没用库,就跑来问我,为啥不可以啊。
要学会看错误,看报什么错误,然后引入相应的库就可以了。
1 2 3 4 5 6 | import os import sys import codecs import json import MySQLdb import MySQLdb.cursors |
五、声明PIPELINES类
如果只写了PIPELINES类,没有在setting里面声明的话管道是不会运行的。
1 2 3 4 5 | ITEM_PIPELINES={ 'mkscrapy.pipelines.MysqlPipeline': 100, 'mkscrapy.pipelines.JsonPipeline': 200, 'mkscrapy.pipelines.TxtPipeline': 300, } |
python中出现IndentationError: unexpected indent的解决办法 scrapy在不同的Request之间传递数据的办法
学习了 谢谢