基于Python-django-spider的影视演员影评爬虫与检索系统

news/2024/4/29 10:36:42/文章来源:https://blog.csdn.net/sheziqiong/article/details/127086101

目录
影视爬虫与检索系统 设计文档 1
一、 功能介绍展示 1
二、 性能统计信息 8
1、爬虫数据量统计 8
2、查询时间统计 8
三、 各个功能涉及的技术和实现方式 9
1、爬虫 9
2、django 10
3、html 10
4、css 10

一、功能介绍展示
1、影视列表页
为系统主页,通过分页方式列出系统中的所有影视,并显示影视的总数量(1002部)。列表页中的每个条目展示电影名称和海报,点击列表页中的条目可以跳转到对应的影视信息页。页面底部有脚注。顶层有导航栏可跳转搜索等页面。

2、演员列表页
通过分页方式列出系统中的所有演员,并显示演员的总数量(4092位)。列表页中的每个条目展示演员名字和照片,点击列表页中的条目可以跳转到对应的演员信息页。页面底部有脚注,顶层有导航栏。

3、影视信息页
展示电影名称、海报、简介、导演、编剧、类型和五条短评。
展示参演演员列表,以条目形式展示,显示演员姓名和照片,点击姓名或照片可跳转至演员信息页。页面底部有脚注,顶层有导航栏。

4、演员信息页
显示演员姓名、简介、照片、性别等信息。列出该演员参演影视,以条目形式展示,显示影视名称和图片,点击名称或图片可跳转至影视信息页。列出该演员合作演员次数最多的十位,以条目形式展示,显示演员名、图片和合作作品数量,点击演员姓名或图片可跳转至其信息页。页面顶层有导航栏。

4、搜索
搜索是一个单独的页面。搜索栏搜索功能包括一个搜索栏、一个单选组(影视、演员、影评),回车即可搜索。输入一个关键词或一段文本(20字以内),根据单选组选项,搜索系统中存在的影视、演员和影评,本文转载自http://www.biyezuopin.vip/onews.asp?id=14774搜索后跳转到搜索结果页。页面底部有脚注,顶层有导航栏。
5、搜索结果页
搜索结果页包含所有的搜索结果列表,以分页形式展示。搜索结果页中的每个条目设计为超链接格式,点击可跳转到相应信息页。点击影评的搜索结果跳转到该影评所在的影视信息页。页面底部有脚注,顶层有导航栏。
搜索结果页最上方显示搜索条目数量和搜索花费的时间。

from django.shortcuts import render, Http404, redirect
from .models import Actor, Movie
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage
from django.http import HttpResponsefrom datetime import datetime
# Create your views here.def show_movie(request):movie = Movie.objects.all()movie_list = []for m in movie:movie_list.append(m)l=len(movie_list)paginator = Paginator(movie_list, 20)if request.method == "GET":# 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1page = request.GET.get('page')try:movie_list = paginator.page(page)# todo: 注意捕获异常except PageNotAnInteger:# 如果请求的页数不是整数, 返回第一页。movie_list = paginator.page(1)except InvalidPage:# 如果请求的页数不存在, 重定向页面return HttpResponse('找不到页面的内容')except EmptyPage:# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。movie_list = paginator.page(paginator.num_pages)template_view = 'movie_page.html'return render(request, template_view, {'movie': movie_list,'len':l})def show_actor(request):actor = Actor.objects.all()actor_list = []for a in actor:actor_list.append(a)l=len(actor_list)paginator = Paginator(actor_list, 20)if request.method == "GET":# 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1page = request.GET.get('page')try:actor_list = paginator.page(page)# todo: 注意捕获异常except PageNotAnInteger:# 如果请求的页数不是整数, 返回第一页。actor_list = paginator.page(1)except InvalidPage:# 如果请求的页数不存在, 重定向页面return HttpResponse('找不到页面的内容')except EmptyPage:# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。actor_list = paginator.page(paginator.num_pages)template_view = 'actor_page.html'return render(request, template_view, {'actor': actor_list,'len':l})def show_movie_page(request, movie_id):movies=Movie.objects.all()movie_list = []for m in movies:movie_list.append(m)movie=movie_list[movie_id-1]actors=movie.actors.all()return render(request, 'movie.html', {'movie': movie, 'actors': actors})def show_actor_page(request, actor_id):actor=Actor.objects.get(id=actor_id)movies=actor.movie_set.all()co_actors={}for m in movies:actors=m.actors.all()for a in actors:if a!=actor:if a in co_actors:co_actors[a]=co_actors[a]+1else:co_actors[a]=1co_actors = sorted(co_actors.items(), key=lambda x: x[1], reverse=True)co_actors=co_actors[:10]return render(request, 'actor.html', {'actor': actor, 'movies': movies,'co_actors':co_actors})def search_target(request):start = datetime.now()if request.method != 'GET':raise Http404()key_word = request.GET.get('keyword')if not key_word:return render(request, 'search.html')choice=request.GET.get('choice')if choice=="movie":return search_movie(request,key_word,start)if choice=="actor":return search_actor(request, key_word, start)if choice=="comment":return search_comment(request, key_word, start)def search(request,choice,keyword):start = datetime.now()if choice=="movie":return search_movie(request,keyword,start)if choice=="actor":return search_actor(request, keyword, start)if choice=="comment":return search_comment(request, keyword, start)return render(request, 'search.html')def search_movie(request,key_word,start):movie_list=[]movies=Movie.objects.all()for m in movies:if m.title.find(key_word)!=-1:movie_list.append(m)continuefor a in m.actors.all():if a.name.find(key_word)!=-1:movie_list.append(m)breakl=len(movie_list)paginator = Paginator(movie_list, 10)if request.method == "GET":# 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1page = request.GET.get('page')try:movie_list = paginator.page(page)# todo: 注意捕获异常except PageNotAnInteger:# 如果请求的页数不是整数, 返回第一页。movie_list = paginator.page(1)except InvalidPage:# 如果请求的页数不存在, 重定向页面return HttpResponse('找不到页面的内容')except EmptyPage:# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。movie_list = paginator.page(paginator.num_pages)str="choice=movie&keyword="+key_wordparams = {'movie': movie_list,'cost': (datetime.now() - start).total_seconds(),'total':l,'other_string':str,'keyword':key_word,'choice':"movie"}return render(request, 'search_movie.html', params)def search_actor(request,key_word,start):actor_list=[]movies=Movie.objects.all()for m in movies:if m.title.find(key_word) != -1:for a in m.actors.all():actor_list.append(a)continuefor a in m.actors.all():if a.name.find(key_word) != -1:actor_list.append(a)breakactor_list=set(actor_list)actor_list=list(actor_list)l=len(actor_list)paginator = Paginator(actor_list, 10)if request.method == "GET":# 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1page = request.GET.get('page')try:actor_list = paginator.page(page)# todo: 注意捕获异常except PageNotAnInteger:# 如果请求的页数不是整数, 返回第一页。actor_list = paginator.page(1)except InvalidPage:# 如果请求的页数不存在, 重定向页面return HttpResponse('找不到页面的内容')except EmptyPage:# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。actor_list = paginator.page(paginator.num_pages)str="choice=actor&keyword="+key_wordparams = {'actor': actor_list,'cost': (datetime.now() - start).total_seconds(),'total':l,'other_string':str,'keyword':key_word,'choice':"actor",}return render(request, 'search_actor.html', params)def search_comment(request,key_word,start):comment_list=[]movies=Movie.objects.all()for m in movies:if m.comment1.find(key_word)!=-1:t=(m,m.comment1)comment_list.append(t)continueif m.comment2.find(key_word)!=-1:t = (m, m.comment2)comment_list.append(t)continueif m.comment3.find(key_word)!=-1:t = (m, m.comment3)comment_list.append(t)continueif m.comment4.find(key_word)!=-1:t = (m, m.comment4)comment_list.append(t)continueif m.comment5.find(key_word)!=-1:t = (m, m.comment5)comment_list.append(t)continuel=len(comment_list)paginator = Paginator(comment_list, 10)if request.method == "GET":# 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1page = request.GET.get('page')try:comment_list = paginator.page(page)# todo: 注意捕获异常except PageNotAnInteger:# 如果请求的页数不是整数, 返回第一页。comment_list = paginator.page(1)except InvalidPage:# 如果请求的页数不存在, 重定向页面return HttpResponse('找不到页面的内容')except EmptyPage:# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。comment_list = paginator.page(paginator.num_pages)str="choice=comment&keyword="+key_wordparams = {'cost': (datetime.now() - start).total_seconds(),'total':l,'other_string':str,'comment':comment_list,'keyword':key_word,'choice':"comment"}return render(request, 'search_comment.html', params)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_16019.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dinky,让 Flink SQL 纵享丝滑

大家好,我是脚丫先生 流批一体,越来越流行了,牛逼一体。 之前用java封装flink-sql-client提交脚本文件,很是摩擦。 不过,在研发流批一体平台的时候发现了Dinky,终于丝滑了。 今天就给小伙伴们推荐下低调…

SkipList(跳表)

SkipList(跳表) 文章目录SkipList(跳表)参考前言跳表的原理跳表的插入和删除插入操作删除操作跳表的时间空间复杂度分析时间复杂度空间复杂度调表的基本操作插入数据删除数据Go 实现小结参考 https://juejin.cn/post/6844903955831619597#heading-2https://blog.csdn.net/qq_5…

C# ZBar解码测试(QRCode、一维码条码)并记录里面隐藏的坑

实现效果(文中含源码): C# ZBar解码演示 使用提醒(解码能力下降,甚至解错) C# ZXing解码介绍请查看下面文章: C# ZXing.net解码测试(QRCode、DataMatrix、1D-Barcode一维码条码)_Color Space的博客-CSDN博客 实现步骤: 1、需要的包及对应版本: ① ZXing.Net v0.16.8…

基于html+JavaScript+css的飞机射击小游戏网页设计与实现

目录 一、概述 1 1.1项目内容 1 1.2项目开发 5 1.3项目组员 5 1.4组员分工 5 1.5验收标准 5 二、项目介绍 5 2.1 目标 5 2.2 用户的特点 6 2.3 假定和约束 6 2.3.1 开发期限: 6 2.3.2 技术约束: 6 2.4 确定系统运行的要求 6 2.5飞机大作战的整理思路 6 三…

MySQL三种存储引擎的区别

文章目录一、引言二、三个存储引擎的介绍1,InnoDB介绍特点(1)事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全(2)支持主键自增(3)支持外键(4)支持事务和事务相关…

jar包运行报错jar中没有主清单属性、springGateway访问接口报错302,跳转login接口

此处记录三个错误: 一、jar中没有主清单属性,打包以后运行报错: 这是一个gateway模块,包含了启动类,因为在pom文件中没有指定,所以报错:在该模块的pom文件中加入如下代码:com.xxxx…

Spring中IOC容器的基本配置使用

实例化bean对象 为外部定义的bean起别名 基于set方法的依赖注入 使用构造函数进行依赖注入 使用内部注入的方式注入bean对象 使用list集合依赖注入和使用map集合依赖注入 测试类 使用depends-on控制bean的加载顺序 使用懒加载lazy-init 默认为false 使用单例或者多例(原型)…

C#中对象与JSON字符串互相转换的三种方式

JSON(JavaScriptObject Notation, JS 对象标记) 是一种轻量级的数据交换格式。 关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法来解决此问题 分别是使用Newtonsoft.Json.dll、DataContractJsonSerializer、JavaScriptSerializer…

【老板要你啥都会系列】| 前端晋升全栈--项目日志

目录 1.开篇 2.nodejs文件操作 3.stream 4.stream演示 5.写日志 6.拆分日志 7.分析日志介绍 8.readline 1.开篇 日志包含什么访问人数啊、峰值啊、bug 啊什么的,如果没有日志那么很容易失控。 访问日志可以参考我们 http-server,每次访问都会有这…

谐振波导光栅的严格分析

摘要 谐振波导光栅(RWG)由于其在波长、相位和偏振等方面的可调谐性,在研究和工业中有着广泛的应用。RWG的结构包含一个薄的高折射率波导薄膜,该薄膜与光栅接触。波导支持多种导模,并且根据厚度的不同,模式的数量也不同。在这个…

javaFx打包exe程序

文章目录将代码打成jar包准备工作下载exe4j定制jre检测jar包用到jre的哪些jmods生成jre准备exe图标使用exe4j将jar转换成exe程序将代码打成jar包 打jar之前,把那些用不到的依赖统统删除,以免包含一些无用的内容,比如用不上的一些依赖jar&…

特征工程之特征降维-特征选择-PCA/LDA

特征降维之特征选择 特征选择是建模中常用的降维手段,比较暴力,直接将不重要特征删除。 缺点:造成信息丢失,不利于模型精度。【与之形成对比的是PCA、LDA等降维方式。】 主要标准有两个: 特征是否发散。特征与目标的…

简单组件讲解

在编程阶段,会遇到有些页面的某一区域的布局或数据显示类似;那么我们就可以复用这一段代码;在使用原生JS编程时,我们习惯是将代码抽出来自成一个文件,需要时引入即可。而在vue中也存在这样一个模块,可以简便的将可复用的代码抽成一个模块,这个就是组件。在很多人看来,组…

产品-如何让用户“更愿意“付费

学院课程 文章目录学院课程前言如何提高用户体验,吸引用户付费关于程序员等级的划分基础免费试看优质博客内容转化为视频用户关于短视频内容的生成关于利用用户的碎片化时间怎么差异化竞品?短视频赛道理解学院现状分析总结前言 学院地址 今天下午公司组织了一场需求…

线性回归

线性回归 导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt人工数据集n = 100 true_theta = np.array([[1], [1]]) X = np.insert(np.random.normal(5, 1, size=(n, 1)), 0, 1, 1) y = X @ true_theta + np.random.normal(0, 0.04, size=(n, …

Azure | AZ-204 认证之旅-应用服务(二)

theme: orange 我正在参加「掘金启航计划」 Web应用是构建在PaaS层的服务,它是支持托管的,并且是可缩放的,极大提高了工程效率,并且减少了在运营的层面的消耗,这篇文章介绍如何创建应用程序服务。 创建Web应用程序服务…

pytorch深度学习训练模板(分类、回归)

前言 LeNet-AlexNet-ZFNet: LeNet-AlexNet-ZFNet一维复现pytorch VGG: VGG一维复现pytorch GoogLeNet: GoogLeNet一维复现pytorch ResNet: ResNet残差网络一维复现pytorch-含残差块复现思路分析 DenseNet: DenseNet一维复现pytorch 包含所有一维经典模型的代码可随意切换训练 …

云原生技术 --- k8s节点组件之kube-proxy的学习与理解

k8s 网络代理(kube-proxy)在每个节点上运行。网络代理反映了每个节点上 Kubernetes API 中定义的服务,并且可以执行简单的 TCP、UDP 和 SCTP 流转发,或者在一组后端进行 循环 TCP、UDP 和 SCTP 转发。但是,必须要有一个插件,才可以…

毕业设计- 基于单片机与GPS+GSM的车辆定位跟踪系统

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计Maduino Zero A9G GPRS/GPSk开发板这款低功耗A9G使用SIM800/900和NEO-6M GPS模块的基于Arduino的GPS跟踪系统5 软件说明使用Arduino的基于GPSGSM的车辆跟踪系统GPSGSM的车辆跟踪系统的代码6 最后0 前言 🔥 这两…

IDEA中使用Git

目录 一、IDEA中使用Git 配置Git settings ——>Version Control——>Git 点击Test测试版本号 下载gitee插件 配置账户 第一种方式:账号密码 第二种方式:通过Token令牌 分享单个项目 组员需要拿到项目的SSH地址 二、总结 一、IDEA中使用G…