最近由于需要使用ElasticSearch进行学习,其中用到了Spring Data ElasticSearch框架,为了准备测试的数据,这里使用了jsoup去爬虫80s电影网站上的电影信息用于测试,目前可以进行基本的信息的爬虫获取。

通过分析可以知道爬虫的入口为:http://80s.la/movie/list/-----p1

那么大概的思路就是,设置一个总页数,去循环遍历每一个页面,然后获取到每一个电影项,然后获取电影的详情连接,从中获取到常规的信息。详情页如下所示:

下面分享下代码:
1、电影信息的实体类,这里的代码是从项目中COPY,所以有些其他的代码:

package com.china.elasticsearch.bean;import com.china.elasticsearch.constant.MovieConstant;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;import java.io.Serializable;
import java.util.Date;/*** 计划从80s上爬取电影信息*/
@Document(indexName = MovieConstant.MOVIE_INDEX_NAME, type = MovieConstant.MOVIE_TYPE_NAME)
public class MovieEntity implements Serializable {/**电影ID*/@Idprivate String movieId;/**电影名称*/private String movieName;/**演员*/private String actors;/**类型:战争*/private String type;/**地区:大陆*/private String area;/**导演*/private String director;/**上映日期,暂时无法获取*/private String releaseDate;/**豆瓣评分*/private double score;/**语言*/private String language;/**年份*/private int year;/**提示*/private String tip;/**片长*/private int minute;public String getMovieId() {return movieId;}public void setMovieId(String movieId) {this.movieId = movieId;}public String getMovieName() {return movieName;}public void setMovieName(String movieName) {this.movieName = movieName;}public String getActors() {return actors;}public void setActors(String actors) {this.actors = actors;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getArea() {return area;}public void setArea(String area) {this.area = area;}public String getDirector() {return director;}public void setDirector(String director) {this.director = director;}public String getReleaseDate() {return releaseDate;}public void setReleaseDate(String releaseDate) {this.releaseDate = releaseDate;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public String getTip() {return tip;}public void setTip(String tip) {this.tip = tip;}public int getMinute() {return minute;}public void setMinute(int minute) {this.minute = minute;}
}

2、80s爬虫的基本工具类:

package com.china.elasticsearch.util;import com.china.elasticsearch.bean.MovieEntity;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.util.StringUtils;import java.util.ArrayList;
import java.util.List;/*** 80s电影信息的基本爬虫的工具类* @date 2019-08-18*/
public class MovieDownloadUtil {public static final String ROOT_URL =  "http://80s.la";public static final String BASIC_URL = ROOT_URL + "/movie/list/-----p";public static final String CSS_PATH = "#body div#block1.clearfix.noborder ul.me1.clearfix li";public static final String DEATAIL_CSS_PATH = "#body div#block1.clearfix div#minfo.clearfix div.info";public static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:61.0) Gecko/20100101 Firefox/61.0";public static final int TOTAL_PAGE = 20;public static void main(String[] args){startGetMovies();}public static List<MovieEntity> startGetMovies(){List<MovieEntity> movieList = new ArrayList<MovieEntity>();try{//遍历每一个页面,每个页面大概25个电影for(int i = 0;i < TOTAL_PAGE;i++){System.out.println("----------开始爬取第" + (i + 1) + "页数据");Document document = Jsoup.connect(BASIC_URL + (i + 1)).userAgent(USER_AGENT).get();Elements movies = document.select(CSS_PATH);if(movies != null && movies.size() > 0) {movieList.addAll(getMovieList(movies));}}}catch(Exception e){e.printStackTrace();}return movieList;}private static List<MovieEntity> getMovieList(Elements movies) throws Exception {List<MovieEntity> movieList = new ArrayList<MovieEntity>();for(Element element : movies){MovieEntity entity = new MovieEntity();Element aEle = element.select("h3.h3 a").get(0);String movieName = aEle.text();//电影名称String href = aEle.attr("href");String movieId = href.substring(href.lastIndexOf("/") + 1,href.length());//电影IdDocument detailDocument = Jsoup.connect(ROOT_URL + href).userAgent(USER_AGENT).get();Element infoEle = detailDocument.select(DEATAIL_CSS_PATH).get(0);String deMovieName = infoEle.selectFirst("h1.font14w").text();String year = deMovieName.substring(deMovieName.indexOf("(") + 1,deMovieName.lastIndexOf(")"));//年份if("未知".equals(year)){year = "0";}String tip = infoEle.selectFirst(".tip") != null ? infoEle.selectFirst(".tip").text() :"";//版本提示Element firstClearfixDiv = infoEle.select("div.clearfix").get(0);try{//设置基本类型的信息setTypeInfo(firstClearfixDiv,entity);}catch (Exception e){System.out.println(movieName);}//获取评分String scoreText = firstClearfixDiv.nextElementSibling().child(0).text();if(scoreText != null && scoreText.contains("豆瓣评分")){scoreText = scoreText.replace("豆瓣评分:","").trim();}else{if(!scoreText.contains("评论")){System.out.println(movieName);System.out.println(scoreText);}scoreText = "0";}entity.setMovieId(movieId);entity.setMovieName(movieName);entity.setYear(Integer.parseInt(year));entity.setTip(tip);entity.setScore(Double.parseDouble(scoreText));movieList.add(entity);}return movieList;}private static void setTypeInfo(Element firstClearfixDiv,MovieEntity entity) {Elements spans = firstClearfixDiv.select(">span");for(Element span : spans){String flag = span.select(".font_888").get(0).text();Elements actors = span.select("a");if("演员:".equals(flag)){String actor = getActorAndType(actors);entity.setActors(actor);}if("类型:".equals(flag)){String type = getActorAndType(actors);entity.setType(type);}if("地区:".equals(flag)){String area = getActorAndType(actors);entity.setArea(area);}if("语言:".equals(flag)){String language = getActorAndType(actors);entity.setLanguage(language);}if("导演:".equals(flag)){String director = getActorAndType(actors);entity.setDirector(director);}if("片长:".equals(flag)){String minute = span.text().replace("片长:","").replace("分钟","").replace(" India: ","").replace(" Hong Kong: ","").replace(" France: ","").replace(" USA: ","").replace(" UK: ","").replace("min","").replace("(台湾)","").replace("中国大陆)","").replace("(美国/中国大陆)","").replace(" Argentina: ","").replace(" Japan: ","").trim();entity.setMinute(Integer.parseInt(minute));}}}private static String getActorAndType(Elements as) {List<String> actorList = new ArrayList<String>();for (Element actor : as) {actorList.add(actor.text());}String actorsStr = StringUtils.collectionToDelimitedString(actorList, " ");return actorsStr;}}

目前代码只是简单的实现了功能,后续将会进行优化。目前是针对Spring Data ElasticSearch这个目标进行的。

具体可以浏览我的Github开源的项目,目前刚刚开始做,可以实现了Spring Data ElasticSearch分页查询数据、爬虫80s上的电影信息等,前端目前使用Vue界面,目前是每周进行更新。

Github地址:https://github.com/wuchubuzai2018/elasticsearch-study

码云地址:https://gitee.com/wuchubuzai/elasticsearch-study

基于80s电影下载网的电影信息爬虫相关推荐

  1. Python实现可视化界面多线程豆瓣电影信息爬虫,并绘制统计图分析结果

    完整代码见链接:https://github.com/kuronekonano/python_scrapy_movie 实现时使用图形界面.多线程.文件操作.数据库编程.网络编程.统计绘图六项技术. ...

  2. 爬取TOP100榜猫眼电影信息 爬虫实战

    写在前面 最近在学爬虫,跟着崔庆才大佬的个人网站学习. 今天跟着做了一个爬虫来爬取猫眼电影top100榜的电影信息.其中遇到了一些问题,这里就写成博客记录下来. 遇到的问题 反爬虫机制:在进行html ...

  3. 群晖Video station添加电影信息及海报

    黑群晖 篇三:群晖Video station添加电影信息及海报 刚刚装好黑群晖, 把我电影放到video station套件里去看的时候,发现没有自动识别出电影信息和封面了,黑突突的一块看着很丑,因为 ...

  4. 基于PHP的动漫电影信息管理系统

    有需要请私信或看评论链接哦 可远程调试 基于PHP的动漫电影管理系统 一 介绍 此动漫电影信息管理系统基于原生PHP开发,数据库mysql,前端bootstrap.系统角色分为用户和管理员,用户注册登 ...

  5. python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式

    一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...

  6. 基于JavaWeb的电影信息网站的设计

    1.概要 本系统是一个以Mysql为数据库,利用Java servlet开发的基于B/S结构的电影推荐网站.服务器是Apache Tomcat,推荐库是Apache Mahout,在Eclipse环境 ...

  7. java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署

    java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署 java毕业设计基于的电商平台的设计与实现Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 ...

  8. 基于JAVA银杏湖景区旅游管理信息平台计算机毕业设计源码+系统+lw文档+部署

    基于JAVA银杏湖景区旅游管理信息平台计算机毕业设计源码+系统+lw文档+部署 基于JAVA银杏湖景区旅游管理信息平台计算机毕业设计源码+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  9. 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档)

    计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 计算机毕业设计Java基于的电商平台的设计与实现(源码+系统+mysql数据库+lW文档) 本源码技术栈: ...

最新文章

  1. Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法...
  2. OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
  3. bms_output.put_line使用方法
  4. zbar扫描无法近距离扫码_生意好时最怕收银出故障,这几个扫码枪的常见问题你一定要知道...
  5. 【转载保存】Lucene 实战教程第六章 Lucene 的精确、包含、集合查询 Query 的简单使用
  6. 7-169 汉密尔顿回路 (25 分)
  7. 拓端tecdat|R语言IRT理论:扩展Rasch模型等级量表模型lltm、 rsm 和 pcm模型分析心理和教育测验数据可视化
  8. 项目答辩PPT(一)
  9. 11款程序员实用工具,老少皆宜,你一定用得上!
  10. cannot be resolved解决方法
  11. 农历 java_公历农历互相转换的Java日历工具类详解
  12. reflections歌词翻译_花木兰主题曲Reflection翻译成中文的准确歌词
  13. 安卓实时打印kernel日志
  14. 【音频编码】AAC编码之FDK AAC
  15. Ubunt14.04搭建opengrok环境
  16. 使用unity3d 接入anySDK的总结1
  17. 学生表课程表成绩表教师表
  18. 安装银河麒麟系统失败是什么原因
  19. Eclipse+超快的模拟器Genymotion开发Android应用(第一步:安装及配置Genymotion)
  20. redis如何清空缓存

热门文章

  1. MySQL当中的闰月最后一天的计算问题
  2. evaluate函数在python_Python test.evaluate方法代碼示例
  3. Anchor-Free系列之YOLOX:Exceeding YOLO Series in 2021
  4. Canvas实现PC端刮刮卡和生成四位随机验证码
  5. EVPN小实验:配置实例间访问控制
  6. vue左侧悬浮_Vue实现靠边悬浮球(PC端)
  7. Fusioncharts系列之基于Fusioncharts的报表统计
  8. paraview输出高清晰度带速度箭头颗粒分布图
  9. Command(命令)模式
  10. vs2017 调试 chromium 频繁崩溃