连接数据库:
import sqlite3
conn =sqlite3.connect("feng.db") #打开或创建数据库
数据库建表:
import sqlite3
conn =sqlite3.connect("feng.db") #打开或创建数据库
print("打开数据库")
c = conn.cursor() #获取游标
sql = ''
c.execute(sql) #执行sql语句
conn.commit() #提交
conn.close() #关闭数据库
print("建表")
完整代码爬取豆瓣top250保存到SQlite
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,用于文字匹配
import urllib.request,urllib.error #指定url,获取网页数据
import xlwt #excel操作
import sqlite3 #SQlite数据库操作
def main():
baseurl = "https://movie.douban.com/top250?start="
#1爬取网页
datalist = getData(baseurl)
dbpath = "movie.db"
#3保存数据
saveDataDB(datalist,dbpath)
#影片详情链接规则
findlink = re.compile(r'<a href="(.*?)">') ######### 创建正则表达式对象,表示规则(字符串模式)
#影片图片链接规则
findimage = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片名称规则
findtitle = re.compile(r'<span class="title">(.*)</span>')
#影片评分链接规则
findscore = 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')
#影片相关内容
findcontent= re.compile(r'<p class="">(.*?)</p>',re.S)
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10): #调用获取页面信息的函数*10
url = baseurl+str(i*25)
html = askURL(url) #保存获取网页源码
# 2解析数据
suop = BeautifulSoup(html,"html.parser")
for item in suop.find_all('div',class_="item"): #查找符合要求的字符串,形成列表
#print(item) #测试查看返回的全部信息
data = [] #保持一部电影全部信息
item = str(item)
#影片详情链接
link = re.findall(findlink,item)[0] #re库用来通过正则表达式查找制定的字符串
data.append(link)
imgsrc = re.findall(findimage,item)[0] #添加图片
data.append(imgsrc)
titles = re.findall(findtitle,item) #片名可能只有一个中文名,也有可能有外文名
if(len(titles)==2): #添加名字(中文、外文)
ctitle = titles[0]
data.append(ctitle)
etitle = titles[1].replace("/","") #去掉无关的符号
data.append(etitle)
else:
data.append(ctitle[0])
data.append(' ') #没有外文名就留空站位
rating = re.findall(findscore,item)[0]
data.append(rating) #添加评分
juage = re.findall(findJudge,item)[0]
data.append(juage) #添加评分人数
inq = re.findall(findInq,item)
if len(inq) != 0:
inq = inq[0].replace("。","") #去掉句号
data.append(inq) #添加概述(有可能是空)
else:
data.append(" ") #为空时站位
bd = re.findall(findcontent,item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?',"",bd) #去掉<br/>
data.append(bd.strip()) #去掉空格
datalist.append(data) #将处理好的一部电影信息存进去
return datalist
#得到指定Url网页内容
def askURL(url):
#模拟haed头部信息,向服务器发送消息
#用户代理,告诉服务器我们是什么浏览器,实质是告诉服务器我们可以接受什么数据
head = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.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 e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
#保存到数据库
def saveDataDB(datalist,dbpath):
int_db(dbpath)
conn = sqlite3.connect(dbpath)
cur = conn.cursor()
for data in datalist:
for index in range(len(data)):
if(index == 4 or index == 5):
continue
else:
data[index] = '"'+data[index]+'"'
sql = '''
insert into movie250(
info_link,pic_link,cname,ename,score,rated,instroduction,info
)
values(%s)'''%",".join(data) #用逗号把data里面参数分隔开。再整个赋给s
print(sql)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
#创建数据库
def int_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()