700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python爬虫-豆瓣电影排行榜TOP250

Python爬虫-豆瓣电影排行榜TOP250

时间:2022-01-27 19:50:57

相关推荐

Python爬虫-豆瓣电影排行榜TOP250

跟着B站上的视频敲得代码,基本无改动

爬取的数据包括"电影详情链接",“图片链接”,“影片中文名”,“影片外文名”,“评分”,“评价数”,“概况”,“相关信息”

爬取到的数据有保存到excle中保存到数据库中(注释掉了)两种

具体代码如下:

# -*- codeing = utf-8 -*-# @Time : /1/12 20:39# @Author : Chikin Lau @ SUSE# @File : spider.py# @Software: PyCharmimport re#正则表达式,进行文字匹配from bs4 import BeautifulSoup #网页解析,获取数据import urllib.request,urllib.error #指定URL,获取网页数据import xlwt#进行Excel操作import sqlite3 #进行SQLite数据库操作def main():baseurl = "/top250?start="#1.爬取网页 and #2.解析网页datalist = getData(baseurl)savepath = "豆瓣电影Top250.xls" #保存到excle表#dbpath = "movie.db"#3.保存数据saveData(datalist,savepath) #执行保存到excle的方法#saveData2DB(datalist,dbpath)#执行保存到数据库的方法#askURL("/top250?start=0")#影片详情链接的规则findLink = pile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串的模式)#影片图片findImgSrc = pile(r'<img.*src="(.*?)"',re.S) #re.S 让换行符包含在字符中#影片的片名findTitle = pile(r'<span class="title">(.*)</span>')#影片评分findRating = pile(r'<span class="rating_num" property="v:average">(.*)</span>')#评价人数findJudge = pile(r'<span>(\d*)人评价</span>')#影片概况findInq = pile(r'<span class="inq">(.*?)</span>')#影片的相关内容findBd = pile(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)#保存获取到的网页源码#逐一解析数据soup = BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表#print(item)data = []#保存一部电影的所有信息item = str(item)# print(item)# break#获取影片详情的链接link = re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串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("/","")#去掉无关的符合otitle = re.sub('\s',"",otitle)data.append(otitle) #添加外文名else: #只有中文名data.append(titles[0])data.append(" ") #外文名的位置留空#评分rating = re.findall(findRating,item)[0]data.append(rating)#评价人数judgeNum = re.findall(findJudge,item)[0]data.append(judgeNum)# 影片概况try: #解决因列表为空而报错,后果是会缺失没有影片概况(inq为空)的电影inq = re.findall(findInq,item)[0]inq = inq.replace("。","")#去掉句号data.append(inq)except:data.append(" ")# 为解决continue导致的inq为空的电影无法执行下面代码,故把下面被跳过的代码复制上来到continue前执行bd = re.findall(findBd, item)[0]bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd) # 去掉<br/>bd = re.sub('/', " ", bd) # 替换/bd = re.sub('\s', " ", bd) # 去掉\xa0data.append(bd.strip()) # 去掉前后的空格datalist.append(data)continue# 影片的相关内容bd = re.findall(findBd,item)[0]bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)#去掉<br/>bd = re.sub('/'," ",bd) #替换/bd = re.sub('\s'," ",bd)#去掉\xa0data.append(bd.strip())#去掉前后的空格datalist.append(data)#print(datalist)return datalist#得到指定的一个URL的网页内容def askURL(url):#头部信息:模拟浏览器头部信息,向豆瓣服务器发送消息#用户代理:表示豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)head = {"User-Agent": "User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/0101 Firefox/60.0"}#Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36#Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36request = urllib.request.Request(url,headers=head)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#保存数据到excle表的方法def saveData(datalist,savepath):#print()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)cursor = conn.cursor()# 写sql语句for data in datalist:for index in range(len(data)):if index == 4 or index == 5:continuedata[index] = '"' + str(data[index]) + '"'sql = '''insert into movie250(info_link,pic_link,cname,ename,score,rated,introduction,info)values(%s)''' % ",".join(data)#print(sql)cursor.execute(sql)mit()cursor.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语句mit() #提交数据库操作conn.close() #关闭数据库连接if __name__ == '__main__':#设置主函数,程序入口#调用函数main()#init_db("movietest.db")print("爬取完毕")

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。