最常用方法是基于管道持久化到数据库
解析数据存入到数据库,用管道处理
1、解析数据
li_list=response.xpath('//*[@id="content"]/div/div[1]/ol/li')#进入到谷歌浏览器开发者环境下,copy xpath 表达式
for li in li_list:#循环所有的li标签,分别取出电影的名字和得分
title=li.xpath('./div/div[2]/div[1]/a/span[1]/text()').get()#在li下面取div
score=li.xpath('./div/div[2]/div[2]/div/span[2]/text()').get()
# print(title,score)
2、在item类中定义相关属性
class DoubanproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title=scrapy.Field()
score=scrapy.Field()
3、把解析到的数据封装存储到item类型的对象中(为什么)
因为piplines.py只能处理item数据
4、将item类型对象提交给管道,进行持久化存储
#实例化对象
movie=DoubanproItem()#把解析到的数据放到item中
movie['title']=title #将解析到的值赋值给实例化movie对象 对应的title属性
movie['score']=score #将解析到的值赋值给实例化movie对象 对应的tscore属性
yield movie #把item的值提交到管道piplines.py
5、在管道类的process_item中要将接收到的item对象存储的数据进行持久化存储
class DoubanproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title=scrapy.Field()
score=scrapy.Field()
6、利用管道存储到TXT文件中
class DoubanproPipeline:#基于管道,存储到TXT文件中
fp=None
def open_spider(self,spider):
#打开文件,指定文件存储地方
print('开始爬取。。。')
self.fp=open('./movie.txt','w',encoding='utf-8')
def process_item(self, item, spider):#处理item数据
title=item['title']
score=item['score']
self.fp.write(title+':'+score+"\n")
return item #不到动,留着
def close_spider(self,spider):
print('爬取结束')
self.fp.close()
7、在配置文件(setting.py)中开启管道
ITEM_PIPELINES = {
'doubanPro.pipelines.DoubanproPipeline': 300,#管道配置,300表示优先级,数值越小,优先级越高
}
8利用管道存储到mysql中
在piplines.py再建一个类
#每一个管道类对应一组数据存储到一个载体或者平台
#利用管道类存储到mysql中
class mysqlPiplines(object):
conn=None
cursor=None
def open_spider(self,spider):
#打开文件,指定文件存储地方
print('开始爬取。。。')
self.conn=pymysql.Connect(user='root',password='200618',host='localhost',port=3306,database='mypython')#如果是远程就写ip地址
def process_item(self, item, spider):#处理item数据
#游标对象
self.cursor=self.conn.cursor()
try:
self.cursor.execute("INSERT INTO mymovies VALUES('%s','%s')"%(item['title'],item['score']))#游标的execute写SQL语句,%s占位
#正确就提交
self.conn.commit()
except Exception as e:
print(e)
self.conn.rollback()
return item #不到动,留着 原因,每个item用完后,就返回item继续处理
def close_spider(self,spider):
self.cursor.close()
self.conn.close()
ITEM_PIPELINES = {
'doubanPro.pipelines.DoubanproPipeline': 300,
'doubanPro.pipelines.mysqlPiplines': 300,
#管道配置,300表示优先级,数值越小,优先级越高
}