python爬虫存储数据4种方式

目录:

1.数据写入csv文件

2.数据写入excell文件

3.数据存入mongodb

4.数据写入mysql

5.影评爬取代码展示

###注意:爬取的数据以字典的形式放入了self.data属性中[{},{},{}]

如需直接使用需要把数据类型转换为列表,把self.data换成自己的数据存储变量名

1.数据写入csv文件

爬取的数据以字典的形式放入了self.data属性中

#获取header为第一行的字段名
header = self.data[0].keys()
# 写入文件test.csv,
with open('test.csv', 'w', encoding='utf8') as f:
# 提前预览列名,当下面代码写入数据时,会将其一一对应。
    witer = csv.DictWriter(f, fieldnames=header)
    # 写入列名
    witer.writeheader()
    # 写入字典中的数据
    witer.writerows(self.data)

2.数据写入excell文件

爬取的数据以字典的形式放入了self.data属性中

需要应用xlwt的包

#实例化一个xlwt对象
workbook = xlwt.Workbook(encoding='utf8')
# 新建一个excel书签,名为test
sheet1 = workbook.add_sheet('test')
# 获取字段
header = list(self.data[0].keys())
# 使用for循环,字段数的长度和字段
for i, key in zip(range(len(header)), header):
# excel写入字段名
    sheet1.write(0, i, key)

#使用两个for循环,j用来控制写入数据的excel的行数,m用来控制列数,而key则是用来取字典的数据
for j in range(1, len(self.data) + 1):
    for m, key in zip(range(len(header)), header):
        #写入数据
        sheet1.write(j, m, self.data[j - 1][key])

#保存文件路径,不用新建excel文件,自动生成

workbook.save(r'C:\Users\Administrator\Desktop\test.xlsx')

3.数据存入mongodb

爬取的数据还是存放在类的self.data属性中

mongodb数据库没有表的概念,数据的写入相对较为简单一点

#连接mongodb

mdb = MongoClient('127.0.0.1', 27017)

# 指定mongodb的库的集合名称,不用新建,运行后直接创建
db = mdb.test['moive_info']

#for循环(self.data的数据类型为列表,中间的数据格式为字典[{},{}])拿取数据字典格式
for i in self.data:

#判断数据是否为字典类型,如果是,写入
    if isinstance(i, dict):
        db.insert_one(i)

        #如果不是的,则报i的title字段+写入数据失败
    else:
        print(i['title'], '写入失败')

4.数据写入mysql

爬取的数据还是存放在类的self.data属性中

# 连接mysql数据库,注:注意指定database的名称
db = pymysql.connect(host='127.0.0.1', user='root', password='123456', port=3306, database='test')
#实例化一个游标对象
cursor = db.cursor()
#创建两个字段,keys为sql语句的字段的站位字段,values为数据的站位字符串
keys = ','.join(self.data[0].keys())
values = ','.join(['%s'] * len(self.data[0]))
#这里的mysql数据库的表需要提前创建好
# 利用上面的站位字符串,构造一个通用sql语句
sql = 'insert into moive_list(id,{key}) values(null,{values})'.format(key=keys, values=values)
# for循环把数据取成字典类型
for i in self.data:        
    # 先获取字典值的数据为value,每一个数据赋值给一个变量
    value = list(i.values())
    title = value[0][0]
    start = value[1][0]
    actor = value[2]
    # 写一个报错,增加容错率
    try:
        if cursor.execute(sql, (title, start, actor)):
            print(title, 'seccess')
        except:
            db.rollback()

#需要使用这个db.commit(),sql语句才会有效
db.commit()


 

5.影评爬取代码展示

# 数据不能直接使用

import csv
import requests
import xlwt
from base import Sqide
from lxml import etree
import pymysql
from pymongo import MongoClient
from elasticsearch import Elasticsearch


class Test(Sqide):
    url = r'https://ssr1.scrape.center/'
    url_list = []
    data = []

    def product(self):
        response = requests.get(self.url)
        content = response.content.decode('utf8')
        html = etree.HTML(content)
        urls = html.xpath('//div[@class="el-card item m-t is-hover-shadow"]//a[@class="name"]/@href')
        for i in urls:
            self.url_list.append('https://ssr1.scrape.center' + str(i))
        print(self.url_list)

    def consumer(self):
        for i in self.url_list:
            response = requests.get(i)
            content = response.content.decode('utf8')
            html = etree.HTML(content)
            title = html.xpath('//h2[@class="m-b-sm"]/text()')
            start = html.xpath(
                '//div[@class="el-col el-col-24 el-col-xs-8 el-col-sm-4"]//p[@class="score m-t-md m-b-n-sm"]/text()')
            actors = html.xpath('//div[@class="el-card__body"]/p[@class="name text-center m-b-none m-t-xs"]/text()')[0]
            dir = {"title": title, "start": start, "actor": actors}
            self.data.append(dir)

    def save_csv(self):
        header = self.data[0].keys()
        # 写入文件test.csv,
        with open('test.csv', 'w', encoding='utf8') as f:
            # 提前预览列名,当下面代码写入数据时,会将其一一对应。
            witer = csv.DictWriter(f, fieldnames=header)
            # 写入列名
            witer.writeheader()
            # 写入字典中的数据
            witer.writerows(self.data)

    def save_excel(self):
        workbook = xlwt.Workbook(encoding='utf8')
        sheet1 = workbook.add_sheet('test')
        header = list(self.data[0].keys())
        for i, key in zip(range(len(header)), header):
            sheet1.write(0, i, key)
        for j in range(1, len(self.data) + 1):
            for m, key in zip(range(len(header)), header):
                sheet1.write(j, m, self.data[j - 1][key])

        workbook.save(r'C:\Users\Administrator\Desktop\test.xlsx')

    def save_mongo(self):
        mdb = MongoClient('127.0.0.1', 27017)
        db = mdb.test['moive_info']
        for i in self.data:
            if isinstance(i, dict):
                db.insert_one(i)
            else:
                print(i['title'], '写入失败')

    def save_mysql(self):
        db = pymysql.connect(host='127.0.0.1', user='root', password='123456', port=3306, database='test')
        cursor = db.cursor()
        keys = ','.join(self.data[0].keys())
        values = ','.join(['%s'] * len(self.data[0]))
        sql = 'insert into moive_list(id,{key}) values(null,{values})'.format(key=keys, values=values)
        for i in self.data:
            value = list(i.values())
            title = value[0][0]
            start = value[1][0]
            actor = value[2]
            try:
                if cursor.execute(sql, (title, start, actor)):
                    print(title, 'seccess')
            except:
                db.rollback()
            db.commit()
        # cursor.execute(sql)

    def practice_es(self):
        es=Elasticsearch('http://127.0.0.1:9200/')
        es.index(index='xxx',doc_type='he',id=1,body=self.data)


Test().product()
Test().consumer()
# Test().save_excel()
# Test().save_mysql()
# Test().save_mongo()
Test().practice_es()

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值