Springboot+JPA下实现简易爬虫:豆瓣电视剧数据


  前言:今天听到产品那边讨论一些需求,好像其中一点是用户要求我们爬虫,在网页上抓取一些数据然后存到我们公司数据库中,众所周知,爬虫的实现对于python语言可是专家,而对于我们使用的Java语言,我也不确定可不可以,趁着无事,上网参考了下资料,自己也写了些demo,所幸爬取数据成功了,由于我使用的基础demo项目是自己搭建的springboot+jpa的项目,因此也会在这个基础上进行爬虫的实现,文章会贴出具体的步骤以及重要的代码,至于项目的搭建就不介绍了,我的完整代码会同步至gitHub,大家可以参考使用,当然也可以使用自己的springboot项目。

gitHub地址:https://github.com/Slience-zae/mail-demo.git

1.材料准备

1.1首先打开豆瓣的网页,同时F12打开控制台

1.2 在控制台中找到接口url,请求头信息,以及相应数据格式和字段

在网页上准备的材料这些就可以了,接下来,该动手撰写代码了。

2.代码实现步骤

2.1 数据库创建表格

  1. CREATE TABLE `subjects` (
  2. `id` varchar(255) NOT NULL COMMENT 'id',
  3. `title` varchar(255) DEFAULT NULL COMMENT '标题',
  4. `rate` decimal(10,2) DEFAULT NULL COMMENT '豆瓣评分',
  5. `url` varchar(255) DEFAULT NULL COMMENT '观影地址',
  6. `playable` tinyint(4) DEFAULT NULL COMMENT '是否可以观看:0是 1否',
  7. `cover` varchar(255) DEFAULT NULL COMMENT '封面图片地址',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

通过相应数据可以得知共有九个字段,但是我们主要保存的是数据主要信息,其中cover_x,cover_y,is_new对于我们来说没有什么意义,可以不保存到数据库,因此略过。

2.2 hibernate逆向生成实体

选中右键点击,选择Generate persistence Mapping,再选择By Database Schema,选中数据库的表,再选择生成实体的包位置,最后点击ok就能生成到指定位置了,生成后我们再加以修改一下实体,大体是这个样子。

  1. import lombok.Data;
  2. import javax.persistence.*;
  3. import java.math.BigDecimal;
  4. @Data
  5. @Entity
  6. @Table(name = "subjects")
  7. public class Subjects {
  8. @Id
  9. private String id;//id
  10. private String title;//标题
  11. private BigDecimal rate;//豆瓣评分
  12. private String url;//观影地址
  13. private Boolean playable;//是否能够观看
  14. private String cover;//封面图片URL
  15. @Transient
  16. private Integer cover_x;
  17. @Transient
  18. private Integer cover_y;
  19. @Transient
  20. private Boolean is_new;
  21. }

在此说明一下,之所以将cover_x,cover_y,is_new三个字段也添加进实体了,是为了防止接下来json数组转化List<Subjects>时发生异常,我已经在这三个字段上加了@Transient注解,因此三个字段不会映射数据库。

2.3 编写向指定网址抓取json数据的工具类

  1. import org.springframework.boot.configurationprocessor.json.JSONObject;
  2. import org.springframework.stereotype.Component;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.InputStream;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. @Component
  8. public class GetJson {
  9. public JSONObject getHttpJson(String url){
  10. try {
  11. URL realUrl = new URL(url);
  12. HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
  13. //设置HTTP的请求头(参考材料准备截图的请求头信息)
  14. connection.setRequestProperty("Accept", "*/*");//设置浏览器可以接收的媒体类型
  15. connection.setRequestProperty("Connection", "keep-alive");//网页打开,建立连接
  16. connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3928.4 Safari/537.36");//客户端使用的操作系统和浏览器的名称和版本
  17. // 建立实际的连接
  18. connection.connect();
  19. //请求成功
  20. if (connection.getResponseCode() == 200) {
  21. InputStream is = connection.getInputStream();
  22. //创建字节数组输出流对象
  23. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  24. //10MB的缓存
  25. byte[] buffer = new byte[10485760];
  26. int len = 0;
  27. while ((len = is.read(buffer))!= -1) {
  28. byteArrayOutputStream.write(buffer, 0, len);
  29. }
  30. String jsonString = byteArrayOutputStream.toString();
  31. byteArrayOutputStream.close();
  32. is.close();
  33. //转换成json数据返回
  34. return new JSONObject(jsonString);
  35. }
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. return null;
  40. }
  41. }

注意一点,设置连接对象的请求头信息的时候,要将我们在豆瓣上拿到的那几个参数设置成一样的,防止抓取数据失败,具体那几个参数是什么,已经在代码注释上加以说明了。

2.4 完整业务代码糅合实现

(1).在application.properties配置文件中加入以下代码

  1. #豆瓣网址
  2. douban_url= https://movie.douban.com/j/search_subjects

(2) dao层加入类

  1. import com.maven.maildemo.entity.Subjects;
  2. import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  3. import org.springframework.data.repository.CrudRepository;
  4.  
  5. public interface SubjectsDao extends CrudRepository<Subjects, String>, JpaSpecificationExecutor<Subjects> {
  6.  
  7. }

(3) service,serviceImpl,controller层代码

  1. import com.maven.maildemo.entity.Subjects;
  2. import java.util.List;
  3.  
  4. public interface SubjectsService {
  5. /**
  6. * 在豆瓣网页上抓取电视剧信息保存并返回
  7. * @author zae
  8. * @param pageNumber 页码
  9. */
  10. List<Subjects> getAndSaveSubjectsList(Integer pageNumber) throws Exception;
  11. }
  1. import com.alibaba.fastjson.JSON;
  2. import com.maven.maildemo.dao.SubjectsDao;
  3. import com.maven.maildemo.entity.Subjects;
  4. import com.maven.maildemo.service.SubjectsService;
  5. import com.maven.maildemo.utils.GetJson;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.boot.configurationprocessor.json.JSONArray;
  10. import org.springframework.boot.configurationprocessor.json.JSONObject;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15.  
  16. @Slf4j
  17. @Service
  18. @Transactional
  19. public class SubjectsServiceImpl implements SubjectsService {
  20.  
  21. @Value("${douban_url}")
  22. private String doubanUrl;
  23.  
  24. @Autowired
  25. private GetJson getJson;
  26.  
  27. private final String DOUBAN_PARM = "?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=";
  28.  
  29. @Autowired
  30. private SubjectsDao subjectsDao;
  31.  
  32. @Override
  33. public List<Subjects> getAndSaveSubjectsList(Integer pageNumber) throws Exception {
  34. if(pageNumber>=0 && pageNumber <= 10000){
  35. String address = doubanUrl+DOUBAN_PARM+pageNumber;
  36. //获取json对象数据
  37. JSONObject httpJson = getJson.getHttpJson(address);
  38. if(httpJson != null){
  39. //取出json数据数组
  40. JSONArray subjectsArray = httpJson.getJSONArray("subjects");
  41. if(subjectsArray!=null){
  42. //将json数组转化为List
  43. List<Subjects> subjectsList = JSON.parseArray(subjectsArray.toString(),Subjects.class);
  44. for(Subjects subjects:subjectsList){
  45. //爬出数据后,保存在数据库中
  46. subjectsDao.save(subjects);
  47. }
  48. return subjectsList;
  49. }else{
  50. return new ArrayList<>();
  51. }
  52. }else{
  53. return new ArrayList<>();
  54. }
  55. }
  56. return new ArrayList<>();
  57. }
  58. }
  1. import com.alibaba.fastjson.JSON;
  2. import com.maven.maildemo.entity.Subjects;
  3. import com.maven.maildemo.service.SubjectsService;
  4. import io.swagger.annotations.Api;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import java.util.List;
  11.  
  12. @RestController
  13. @RequestMapping("subjects")
  14. @Api(description = "豆瓣")
  15. public class SubjectsController {
  16. @Autowired
  17. private SubjectsService subjectsService;
  18.  
  19. /**
  20. * 在豆瓣网页上抓取电视剧信息保存并返回
  21. * @param pageNumber 页码
  22. * @author zae
  23. * @return
  24. */
  25. @GetMapping(value = "/getAndSaveSubjectsList")
  26. String getAndSaveSubjectsList(@RequestParam Integer pageNumber){
  27. try {
  28. List<Subjects> subjectsList = subjectsService.getAndSaveSubjectsList(pageNumber);
  29. return subjectsList==null?null: JSON.toJSONString(subjectsList);
  30. } catch (Exception e) {
  31. return "爬取数据信息发生异常"+e.getMessage();
  32. }
  33. }
  34. }

业务代码没啥复杂的,基本上都加注释了,看一下就好了。

3.测试

启动项目,打开swaager,找到刚刚写的接口,输入参数点击进行测试。

此时不出意外应该是执行成功了,打开数据库,看一下库里有没有我们爬下来的数据。

发现库里有值,说明我们已经成功的将数据爬下来了。不仅仅豆瓣如此,其他网页数据也是类似的实现。

本人java爬虫学习借鉴博客:https://blog.csdn.net/qwe86314/article/details/91450098  博主是使用的mybatis结合实现,而我的是结合springboot+jpa的项目使用的。

如有问题,多多评论指教,文章编写不易,期待您的推荐和赞,

Springboot+JPA下实现简易爬虫:豆瓣电视剧数据的更多相关文章

  1. Python3.5爬取豆瓣电视剧数据并且同步到mysql中

    #!/usr/local/bin/python # -*- coding: utf-8 -*- # Python: 3.5 # Author: zhenghai.zhang@xxx.com # Pro ...

  2. 放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~)

    放养的小爬虫--豆瓣电影入门级爬虫(mongodb使用教程~) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wa ...

  3. 使用 HttpClient 和 HtmlParser 实现简易爬虫

    这篇文章介绍了 HtmlParser 开源包和 HttpClient 开源包的使用,在此基础上实现了一个简易的网络爬虫 (Crawler),来说明如何使用 HtmlParser 根据需要处理 Inte ...

  4. php+phpquery简易爬虫抓取京东商品分类

    这是一个简单的php加phpquery实现抓取京东商品分类页内容的简易爬虫.phpquery可以非常简单地帮助你抽取想要的html内容,phpquery和jquery非常类似,可以说是几乎一样:如果你 ...

  5. [转]使用 HttpClient 和 HtmlParser 实现简易爬虫

    http://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ http://blog.csdn.net/dancen/article/d ...

  6. 补习系列(19)-springboot JPA + PostGreSQL

    目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...

  7. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  8. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  9. 带着新人学springboot的应用08(springboot+jpa的整合)

    这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...

随机推荐

  1. CentOS 7/8修改系统运行级别

    CentOS 7/8修改系统运行级别   CentOS 5. CentOS 6可以通过修改配置文件/etc/inittab 参数,从而修改系统运行级别,切换系统的runlevel,但是从CentOS ...

  2. 查看CentOs6.5/7的系统版本号

    在centos6.5上用 [root@msg45 ~]# lsb_release -aLSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0- ...

  3. 借助rownum中求Oracle表中前三名(三甲:状元榜眼探花)的方法(总计三种方法,以讲述rownum的使用为主)

    要求前三名,MySQL中有order by排序,limit限制数量,结果很容易得到,而且limit的执行顺序也在order by之后,写出的sql高效易懂而不易出错. 但在oracle中,由于没有li ...

  4. Linux:网络基础配置

    一.修改主机名 hostname 查看主机名 1.hostname   zy 修改主机名为zy,临时生效,重新登录系统生效. 2.想要永久修改,,需修改配置文件:  vi   /etc/sysconf ...

  5. Oracle自动存储管理ASM

    参考资料: https://docs.oracle.com/cd/B19306_01/server.102/b14231/storeman.htm#ADMIN036 什么是ASM? ASM是Autom ...

  6. oracle之SQL的数据类型

    SQL的数据类型 3.1 四种基本的常用数据类型(表的字段类型) 1.字符型, 2.数值型,3.日期型,4.大对象型 3.1.1 字符型:    char         固定字符,最长2000个   ...

  7. 如何成为一位优秀的ScrumMaster

    嗨,大家好,我是叶子 背景介绍 目标:为了能更好的适应快速变化的需求和不确定的未来. 部门包含岗位:部门负责人.项目经理.产品经理.开发团队(开发人员.测试人员) 那么这种情况下,我们想转型Scrum ...

  8. hystrix(8) 插件

    上一节讲到HystrixCommand的执行流程. Hystrix内部将一些模块实现成了插件,并且提供了用户提供自己的实现,通过配置来替换插件.Hystrix提供了5个插件,分别为并发相关插件(Hys ...

  9. RXJAVA之Subject

    RxJava中常见的Subject有4种,分别是 AsyncSubject. BehaviorSubject.PublishSubject. ReplaySubject. AsyncSubject 使 ...

  10. SpringValid优雅校验入参

    一.简介 后台业务入口类Controller,对于入参的合法性校验,可以简单粗暴的写出一堆的 if 判断,如下: @RestController @RequestMapping("user& ...