首先,我们来看一下源码。

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="#爬取网页datalist = getData(baseurl)#保存数据savepath = "豆瓣电影Top250.xls"saveData(datalist,savepath)dbpath = "douban250.db"saveData_db(datalist,dbpath)findLink = re.compile(r'')# compile创建正则表达式对象,表示规则(字符串模式)#封面图片findImgSrc = re.compile(r'',re.S) # re.S 忽略换行符#电影名称findTitle = re.compile(r'(.*)')#评分findRating = re.compile(r'(.*)')#评价人数findJudge = re.compile(r'(\d*)人评价') # \d表示数字 * 多个#概况findInq = re.compile(r'(.*)')#电影详细内容findBd = re.compile(r'

(.*?)

',re.S)#爬取网页def getData(baseurl):datalist = [] # 获取地址中的数据列表,并返回for i in range(0,10): # 调用获取页面信息的函数10次,一次25条url = baseurl + str(i*25)html = askURL(url) # 保存获取到的网页源码# 2.逐一解析数据soup = BeautifulSoup(html,"html.parser") # html.parser网页解析器# find_all()是按照一定的标准,将符合要求的字符串一次性查找出来形成列表for item in soup.find_all('div',class_="item"):# class后的 _ 表示属性值#print(item)data = [] # 保存一部电影的所有信息item = str(item) # 将其转为字符串# 提取超链接 re库用来通过正则表达式找到指定的字符串 findLink是自定义的全局变量Link = re.findall(findLink,item)[0] # [0]第一个data.append(Link) # 将连接追加到列表中ImgSrc = re.findall(findImgSrc,item)[0]data.append(ImgSrc)Title = re.findall(findTitle,item) # 片名可能只有一个中文名没有外文名if len(Title)==2: # 判断有几个titlesctitle = Title[0] # 添加中文名data.append(ctitle)otitle = Title[1].replace("/","") # 去掉/data.append(otitle) # 添加外文名else:data.append(Title[0])data.append(' ') # 第二个留空Rating = re.findall(findRating,item)[0]data.append(Rating) # 添加评分Judge = re.findall(findJudge,item)[0]data.append(Judge) # 添加人数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中的
(\s+)? 替换Bd = re.sub('
(\s+)?'," ",Bd)data.append(Bd.strip()) # strip去掉前后空格datalist.append(data)#把处理好的一个电影信息存储到datalist中#解析网页return datalist#获取指定一个网页内容def askURL(url):head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36"} #伪装成网页的形式,请求网页信息request = urllib.request.Request(url,headers=head)html = "" # 存放到html中try: # 防止出现意外response = urllib.request.urlopen(request)html = response.read().decode("utf-8")# 读取response#print(html)except urllib.error.URLError as e:# 捕获404 500 等浏览器错误if hasattr(e,"code"):#将其输出print(e.code)if hasattr(e,"reason"):# 输出没有捕获成功的原因print(e.reason)return html#保存数据def saveData(datalist,savepath):print("save....")book = xlwt.Workbook(encoding="utf-8",style_compression=0)# style_compression样式压缩效果sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True) #cell_overwrite_ok单元格覆盖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('豆瓣电影Top250.xls')def saveData_db(datalist,dbpath):init_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:continuedata[index] = '"'+data[index]+'"'sql = '''insert into movie250 ( info_link, pic_link,cname,ename,score,rated,introduction,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,introduction text,info text)'''conn = sqlite3.connect(dbpath) # 创建数据库cursor = conn.cursor() # 获取游标。获取操作的数据库对象cursor.execute(sql) #执行sql语句conn.commit() # 提交conn.close() #关闭数据库文件main()print("爬取完毕")

然后运行代码

save....第1条第2条第3条第4条第5条第6条第7条第8条第9条第10条第11条第12条第13条第14条第15条第16条第17条第18条第19条第20条第21条第22条第23条第24条第25条第26条第27条第28条第29条第30条第31条第32条第33条第34条第35条第36条第37条第38条第39条第40条第41条第42条第43条第44条第45条第46条第47条第48条第49条第50条第51条第52条第53条第54条第55条第56条第57条第58条第59条第60条第61条第62条第63条第64条第65条第66条第67条第68条第69条第70条第71条第72条第73条第74条第75条第76条第77条第78条第79条第80条第81条第82条第83条第84条第85条第86条第87条第88条第89条第90条第91条第92条第93条第94条第95条第96条第97条第98条第99条第100条第101条第102条第103条第104条第105条第106条第107条第108条第109条第110条第111条第112条第113条第114条第115条第116条第117条第118条第119条第120条第121条第122条第123条第124条第125条第126条第127条第128条第129条第130条第131条第132条第133条第134条第135条第136条第137条第138条第139条第140条第141条第142条第143条第144条第145条第146条第147条第148条第149条第150条第151条第152条第153条第154条第155条第156条第157条第158条第159条第160条第161条第162条第163条第164条第165条第166条第167条第168条第169条第170条第171条第172条第173条第174条第175条第176条第177条第178条第179条第180条第181条第182条第183条第184条第185条第186条第187条第188条第189条第190条第191条第192条第193条第194条第195条第196条第197条第198条第199条第200条第201条第202条第203条第204条第205条第206条第207条第208条第209条第210条第211条第212条第213条第214条第215条第216条第217条第218条第219条第220条第221条第222条第223条第224条第225条第226条第227条第228条第229条第230条第231条第232条第233条第234条第235条第236条第237条第238条第239条第240条第241条第242条第243条第244条第245条第246条第247条第248条第249条第250条爬取完毕Process finished with exit code 0

因为我抓取的是豆瓣前250项 一页25个 一共十页

运行后在此项目中会出现一个.db文件 一个Excle文件

先点开Excle表格看一下

一共有250行 有8列

然后点开db文件看一下 是一些乱码

这时候打开命令行 输入所学过的指令

然后会出现一个.sql文件

到此就结束啦~