《Python入门+Python爬虫》——5Day 网络爬虫入门——xlwt对excel文件的操作、SqLite数据库

Python学习版本: Python 3.X
观看:Python入门+Python爬虫+Python数据分析
请添加图片描述

3.4 保存数据

3.4.1 Excel表存储

在这里插入图片描述
补充:xlwt模块
简单使用xlwt

import xlwt #导入模块
workbook = xlwt.Workbook(encoding='utf-8') #创建workbook 对象
worksheet = workbook.add_sheet('sheet1') #创建工作表sheet
worksheet.write(0, 0, 'hello') #往表中写内容,第一各参数 行,第二个参数列,第三个参数内容
workbook.save('students.xls') #保存表为students.xls

课堂练习:
将九九乘法表显示在表格中,每个单元格1个公式
限定10分钟完成

workbook = xlwt.Workbook(encoding='utf-8') #创建workbook 对象
worksheet = workbook.add_sheet('sheet1') #创建工作表sheet
for i in range(0,9):
	for j in range(0,i+1):
		worksheet.write(i, j, "%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))
# worksheet.write(0, 0, 'hello') #往表中写内容,第一各参数 行,第二个参数列,第三个参数内容
workbook.save('students.xls') #保存表为students.xls

https://www.cnblogs.com/caesar-id/p/11802440.html
在这里插入图片描述
爬取豆瓣Top250,存储到excel源码

# -*- codeing = utf-8 -*-
# @Author:Aurora
# @File : spider.py
# @Software: PyCharm

import re   #正则表达式
import urllib.request,urllib.error #制定URL  获取网页数据
import xlwt  #进行excel操作
from bs4 import BeautifulSoup #网页解析 获取数据
import sqlite3 #进行数据库操作
def main():
    baseurl="https://movie.douban.com/top250?start="
    datalist = getData(baseurl)
    savepath = "豆瓣电影Top250.xls"
    saveData(datalist,savepath)
    #askUrl("https://movie.douban.com/top250?start=0")

findLink=re.compile(r'<a href="(.*?)">')#创建正则表达式规则, 关键字r 忽略字符串中的转义字符
#影片图片的链接
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)#re.S换行符包含字符中
#影片的片名
findTitle= re.compile(r'<span class="title">(.*)</span>')
#影片的评分
findRating =re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评级人数
findJudge=re.compile(r"<span>(\d*)人评价</span>")
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#影片的相关内容
findBd= re.compile(r'<p class="">(.*?)</p>',re.S)
#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,10):
        url = baseurl+str(i*25)
        html = askUrl(url)#保存获取到的网页源码
        #逐一解析
        soup =BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):    #查找符合要求的字符串 class_ 表示属性
            #print(item) #测试查看电影的iiem
            data =[]    #保存一部电影的所有信息
            item=str(item)

            #转化为字符串,使用正则表达式 查找指定的字符串
            #影片详细链接
            link =re.findall(findLink,item)[0]
            data.append(link)#添加链接
            imgSrc =re.findall(findImgSrc,item)[0]
            data.append(imgSrc)#添加图片
            titles = re.findall(findTitle,item)     #片名可能有中文
            if(len(titles) == 2):
                ctitle = titles[0];#添加中文名
                data.append(ctitle)
                otitle =titles[1].replace("/","") #去除无关的符号
                data.append(otitle) #添加外国名
            else:
                data.append(titles[0])
                data.append('  ')#外国名没有时。放空方便存储,
            rating = re.findall(findRating,item)[0]
            data.append(rating) #添加评分
            judegNum = re.findall(findJudge,item)[0]
            data.append(judegNum)   #添加评分人数
            inq=re.findall(findInq,item)
            if len(inq) != 0:
                inq = inq[0].replace("。",'')# 添加概况
                data.append(inq)
            else:
                data.append('  ')
            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)>'," ",bd)
            bd=re.sub('/'," ",bd)
            data.append(bd.strip())#去除前后空格
            datalist.append(data)
    print(datalist)
    return  datalist

#指定一个URl的网页内容
def askUrl(url):
    #模拟浏览器头部信息,向豆瓣服务器发送消息
    #用户代理,表示告诉豆瓣服务器我们是什么类型的机器
    head ={
        "User-Agent": "Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0    Safari/537.36"
    }
    request = urllib.request.Request(url,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
       # print(html)
    except urllib.error.URLError as resulte:
        if hasattr(resulte,"code"):
            print(resulte.code)
        if hasattr(resulte,"reason"):
            print(resulte.reason)

    return html





#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)  # 创建工作表
    col=('电影详细链接','图片链接','影片中文名','影片外文名','评分','评价数','概况','相关信息')
    for i in range(0,8):
        sheet.write(0,i,col[i])
    for i   in range(0,250):
        print("第%d条"%(i+1))
        data=datalist[i]
        for j   in range(0,8):
            sheet.write(i+1,j,data[j])

    book.save(savepath)



if __name__ =="__main__" :   #当前程序执行时,作为程序入口,控制函数执行顺序,
    main()
    #调用函数
    print("爬取完毕")
3.4.2 数据库存储

可以参考菜鸟教程:
Python和SQLite: https://www.runoob.com/sqlite/sqlite-python.html
SQLite 和SQL语句 :https://www.runoob.com/sqlite/sqlite-tutorial.html

1.引入sqlite3库
import sqlite3
2.初始化数据库
import sqlite3
conn = sqlite3.connect('test.db')
print ("Opened database successfully")

创建数据表

import sqlite3
conn = sqlite3.connect('test.db')
print ("Opened database successfully")
c = conn.cursor()
c.execute('''"CREATE TABLE COMPANY
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL);''')
print ("Table created successfully")
conn.commit()
conn.close()

项目源码:

def init_db(dbpath):
	sql = "create table movie250 (id INTEGER primary key
autoincrement,info_link text,
		pic_link text,cname varchar,ename varchar ,score numeric ,rated
numeric ,introduction text,info text)" #创建数据表
	conn = sqlite3.connect(dbpath) #连接或创建数据库
	cursor = conn.cursor() #获取游标
	cursor.execute(sql) #执行SQL语句:创建数据表
	conn.commit() #事务提交:让操作生效
	cursor.close() #关闭游标
	conn.close() #关闭连接
3.数据库存储

插入数据:insert操作

import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("Opened database successfully")
c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
	VALUES (1, 'Paul', 32, 'California', 20000.00 )");
c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
	VALUES (2, 'Allen', 25, 'Texas', 15000.00 )");
c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
	VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )");
c.execute("INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) \
	VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )");
conn.commit()
print ("Records created successfully")
conn.close()

项目源码:

#datalist是封装好的数据,dbpath是数据库文件存放的全路径
def saveData2(datalist,dbpath):
	init_db(dbpath) # 创建数据表
	con = sqlite3.connect(dbpath) #连接数据库
	cur = con.cursor() #获取游标
	for data in datalist: #对每行数据进行操作
		for index in range(len(data)): #index是每行数据的下标
			data[index] = ("\""+data[index]+"\"") #对每个数据添加前后的双引号,\是	转义字符
	sql = 'INSERT INTO movie250(info_link,pic_link,cname,ename,score,rated,introduction,info) VALUES
(%s)' % ",".join(data) #拼接建表语句,连接data列表中的每一项,使用逗号分隔
	cursor.execute(sql) #执行SQL语句:创建数据表
	conn.commit() #事务提交:让操作生效
	cur.close() #关闭游标
	conn.close() #关闭连接
4.数据库查询 (后面项目用的上)

select操作:
下面的 Python 程序显示了如何从前面创建的 COMPANY 表中获取并显示记录:

import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("Opened database successfully")
cursor = c.execute("SELECT id, name, address, salary from COMPANY")
for row in cursor:
	print ("ID = ", row[0])
	print ("NAME = ", row[1])
	print ("ADDRESS = ", row[2])
	print ("SALARY = ", row[3], "\n")
print("Operation done successfully")
conn.close()
5. 存储到Sqlite,豆瓣排名250电影,源码
# -*- codeing = utf-8 -*-
# @Time :2022/7/6 9:28
# @Author:Aurora
# @File : spider.py
# @Software: PyCharm

import re   #正则表达式
import urllib.request,urllib.error #制定URL  获取网页数据
import xlwt  #进行excel操作
from bs4 import BeautifulSoup #网页解析 获取数据
import sqlite3 #进行数据库操作
def main():
    baseurl="https://movie.douban.com/top250?start="
    datalist = getData(baseurl)
    savepath = "豆瓣电影Top250.xls"
    dbpath="movie.db"
    saveData(datalist,savepath)
    #askUrl("https://movie.douban.com/top250?start=0")
    saveData2DB(datalist,dbpath)

findLink=re.compile(r'<a href="(.*?)">')#创建正则表达式规则, 关键字r 忽略字符串中的转义字符
#影片图片的链接
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)#re.S换行符包含字符中
#影片的片名
findTitle= re.compile(r'<span class="title">(.*)</span>')
#影片的评分
findRating =re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评级人数
findJudge=re.compile(r"<span>(\d*)人评价</span>")
#找到概况
findInq=re.compile(r'<span class="inq">(.*)</span>')
#影片的相关内容
findBd= re.compile(r'<p class="">(.*?)</p>',re.S)
#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,1):
        url = baseurl+str(i*25)
        html = askUrl(url)#保存获取到的网页源码
        #逐一解析
        soup =BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):    #查找符合要求的字符串 class_ 表示属性
            #print(item) #测试查看电影的iiem
            data =[]    #保存一部电影的所有信息
            item=str(item)

            #转化为字符串,使用正则表达式 查找指定的字符串
            #影片详细链接
            link =re.findall(findLink,item)[0]
            data.append(link)#添加链接
            imgSrc =re.findall(findImgSrc,item)[0]
            data.append(imgSrc)#添加图片
            titles = re.findall(findTitle,item)     #片名可能有中文
            if(len(titles) == 2):
                ctitle = titles[0];#添加中文名
                data.append(ctitle)
                otitle =titles[1].replace("/","") #去除无关的符号
                data.append(otitle) #添加外国名
            else:
                data.append(titles[0])
                data.append('  ')#外国名没有时。放空方便存储,
            rating = re.findall(findRating,item)[0]
            data.append(rating) #添加评分
            judegNum = re.findall(findJudge,item)[0]
            data.append(judegNum)   #添加评分人数
            inq=re.findall(findInq,item)
            if len(inq) != 0:
                inq = inq[0].replace("。",'')# 添加概况
                data.append(inq)
            else:
                data.append('  ')
            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)>'," ",bd)
            bd=re.sub('/'," ",bd)
            data.append(bd.strip())#去除前后空格
            datalist.append(data)
    return  datalist

#指定一个URl的网页内容
def askUrl(url):
    #模拟浏览器头部信息,向豆瓣服务器发送消息
    #用户代理,表示告诉豆瓣服务器我们是什么类型的机器
    head ={
        "User-Agent": "Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0    Safari/537.36"
    }
    request = urllib.request.Request(url,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
       # print(html)
    except urllib.error.URLError as resulte:
        if hasattr(resulte,"code"):
            print(resulte.code)
        if hasattr(resulte,"reason"):
            print(resulte.reason)

    return html





#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)  # 创建工作表
    col=('电影详细链接','图片链接','影片中文名','影片外文名','评分','评价数','概况','相关信息')
    for i in range(0,8):
        sheet.write(0,i,col[i])
    for i   in range(0,250):
        print("第%d条"%(i+1))
        data=datalist[i]
        for j   in range(0,8):
            sheet.write(i+1,j,data[j])

    book.save(savepath)

def saveData2DB(datalist,dbpath):
    init_db(dbpath)
    conn=sqlite3.connect(dbpath)
    cur=conn.cursor()
    for data in datalist:
        for index in range(len(data)):
            if index ==5 or index==4:
                continue
            data[index]='"'+data[index]+'"'
        sql =   '''
            insert into movie250(info_link,pic_link,cname,ename,score,rated,instroduction,info)
            values(%s)'''%",".join(data)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()

def init_db(dbpath):
    sql='''
    create table movie250(
    id integer primary  key autoincrement,
    info_link text,
    pic_link text,
    cname varchar  ,
    ename varchar ,
    score numeric,
    rated numeric,
    instroduction text,
    info text
    )
    '''
    #创建数据表
    conn= sqlite3.connect(dbpath)#路径存在则连接,不存在则创建
    cursor = conn.cursor()
    cursor.execute(sql)
    conn.commit()
    conn.close()

if __name__ =="__main__" :   #当前程序执行时,作为程序入口,控制函数执行顺序,
    main()
    #调用函数

    #init_db("movietest.db")
    print("爬取完毕")
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值