我们前面讲过,要使用管道必须要在settings.py文件中开启管道,这里存在一个优先级,数值越小优先级越高。那么现在有一个问题,让两个管道类都接收到item且对其进行持久化存储,爬虫文件提交的item可以同时提交给多个管道类吗?我们知道爬虫文件提交的item只可以交给优先级最高的一个管道类。
如果想使用多个管道需要在每个管道的process_item方法中return item并且对管道进行注册,优先级不可相同!
数据存储到MySQL
前提是你的电脑中有mysql数据库,这里需要现在数据库中创建一张表:
show databases; #查看一下所有的数据库
create database spider charset=utf8; #创建数据库spider
use spider #切换到spider数据库中
create table meizi (href varchar(100),title varchar(1000)); #创建数据库表
desc meizi
然后在Python需要安装PyMysql模块,代码参考:
import pymysql
#将数据存储到MySQL中一份
class MysqlPipeline(object):
conn=None
def open_spider(self,spider):
#连接mysql数据
self.conn = pymysql.Connect(host='127.0.0.1', port=3306,db='test',
charset='utf8')
#print(self.conn)
def process_item(self, item, spider):
href=item['href']
title=item['title']
sql='insert into meizi values("%s","%s")' % (href,title)
# 使用游标对象执行sql语句 创建游标对象
self.cusor=self.conn.cursor()
try:
self.cusor.execute(sql) #执行sql语句
self.conn.commit() #提交事务
except Exception as e:
print(e)
self.conn.rollback() #如果插入出错 进行事务回滚
# 重写父类的方法:只会在爬虫结束前调用一次
def close_spider(self,spider):
self.cusor.close()
self.conn.close()
数据存储到MongoDB
如果不知道如何操作mongodb,参考:
# 将数据存储到mongodb一份
from pymongo import MongoClient
class MongoDbPipeline(object):
def open_spider(self,spider):
self.client=MongoClient(host='127.0.0.1',port=27017)
self.database=self.client.Meizi #创建数据库名字
self.collection=self.database.meizi #数据库集合的名字
def process_item(self,item,spider):
href=item['href']
title=item['title']
self.collection.insert_one({'href':href,'title':title})
def close_spider(self,spider):
print('存储到mongodb数据库成功')
数据存储到Redis
需开启redis服务端,这里以字符串的形式存储:
# 将数据存储到redis一份
import redis,json
class RedisPipeline(object):
def open_spider(self,spider):
self.client=redis.StrictRedis(host='127.0.0.1',port=6379)
self.key="meizi_key" #设置key
def process_item(self,item,spider):
href=item['href']
title=item['title']
value=json.dumps({'href':href,'title':title})
self.client.set(self.key,value)
def close_spider(self,spider):
print('存储到redis数据库成功')
数据存储到文件
# -*- coding: utf-8 -*-
class Myspider1Pipeline:
def open_spider(self,spider):
self.file=open('./meizi.txt','w',encoding='utf-8')
def process_item(self, item, spider):
href=item['href'] #将item对象中存储的值取出
title=item['title']
self.file.write(href+':'+title+'\n')
return item
def close_spider(self,spider):
self.file.close()
开启管道
ITEM_PIPELINES = {
'myspider1.pipelines.Myspider1Pipeline': 300,
'myspider1.pipelines.RedisPipeline': 301,
'myspider1.pipelines.MysqlPipeline': 302,
'myspider1.pipelines.MongoDbPipeline': 303,
}
声明:1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!