任务二爬取的数据存到数据库(管道存储)

最常用方法是基于管道持久化到数据库

解析数据存入到数据库,用管道处理

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表示优先级,数值越小,优先级越高
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值