赞
踩
- 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'<a href="(.*?)">') # compile创建正则表达式对象,表示规则(字符串模式)
- #封面图片
- 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>') # \d表示数字 * 多个
- #概况
- 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): # 调用获取页面信息的函数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: # 判断有几个titles
- ctitle = 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中的 <br(\s+)?/>(\s+)? 替换
- Bd = re.sub('<br(\s+)?/>(\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:
- continue
- data[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。