需求背景

SpringBoot用法:爬虫框架集成

业务场景

以抓取“今日头条”新闻举例说明

技术点

1. 集成爬虫框架webmagic(更多了解webmagic,可以去官方地址)

<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.6.0</version>
</dependency>

WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫程序

特性:

  1. 简单的API,可快速上手
  2. 模块化的结构,可轻松扩展
  3. 提供多线程和分布式支持

代码演示

1. 项目目录结构

2. pom.xml依赖组件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.md</groupId><artifactId>spring-boot2-parent</artifactId><version>0.0.1-SNAPSHOT</version><relativePath>../pom.xml</relativePath></parent><artifactId>spring-boot2-crawler</artifactId><packaging>jar</packaging><name>spring-boot2-crawler</name><description>Spring Boot, MVC, Rest API for App</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 构建成可运行的Web项目 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib-ext-spring</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- webmagic 爬虫工具类 --><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.6.0</version></dependency><dependency><groupId>org.nlpcn</groupId><artifactId>nlp-lang</artifactId><version>1.7</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3. 爬虫核心解析类

MyPageProcessor:

package com.md.demo.crawler.test;import java.util.List;import org.nlpcn.commons.lang.finger.SimHashService;import lombok.extern.slf4j.Slf4j;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.JsonPathSelector;/*** 官方地址:http://webmagic.io/* * WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。* * @author Minbo**/
@Slf4j
public class MyPageProcessor implements PageProcessor {private Site site = Site.me();@Overridepublic void process(Page page) {// 这里使用了jsonPath,因为今日头条返回的是json数据格式。如果是html内容,则使用xpath// 第一层解析String json = page.getRawText();List<String> data = new JsonPathSelector("$.data").selectList(json);// 第二层解析for (int i = 0; i < data.size(); i++) {String result = data.get(i);// 文章IDString item_id = new JsonPathSelector("$.item_id").select(result);// 文章标题String title = new JsonPathSelector("$.title").select(result);// 是否有图String has_image = new JsonPathSelector("$.has_image").select(result);// 文章来源String source = new JsonPathSelector("$.source").select(result);// 文章时间String datetime = new JsonPathSelector("$.datetime").select(result);// 一般是根据文章详细内容生成内容指纹id,实现文章去重,这里只是举例说明拿了文章标题// 更多阅读我的博客文章:https://blog.csdn.net/hemin1003/article/details/82819489(【应用算法】信息流-推荐系统的去重策略)String fPrintId = String.valueOf(new SimHashService().fingerprint(title));log.info("");log.info("---------->>> 提取文章主信息:");log.info("文章ID item_id=" + item_id);log.info("文章标题 title=" + title);log.info("是否有图 has_image=" + has_image);log.info("文章来源 source=" + source);log.info("文章时间 datetime=" + datetime);log.info("内容指纹id fPrintId=" + fPrintId);// webmagic官方还有很多案例,更多内容自行参考学习了,例如配置代理,自带url去重、网页去重等功能// 官方文档地址:http://webmagic.io/docs/zh/}}public Site getSite() {return MySite.getSit(site);}public static void main(String[] args) {// 今日头条/热点数据urlSpider.create(new MyPageProcessor()).addUrl("https://m.toutiao.com/list/?tag=news_hot&ac=wap&count=20&format=json_raw&as=A1551E75BC4CF9C&cp=5E5C3CEFB9DCAE1&max_behot_time=1583123351&_signature=CXZIuwAAVy.txcPhjSEcTwl2SK&i=1583123351").thread(1).run();}
}

MySite:

package com.md.demo.crawler.test;import us.codecraft.webmagic.Site;/*** 模拟请求头设置* * @author Minbo**/
public class MySite {// 设置请求头public static Site getSit(Site site) {site.addHeader("Accept", "*/*");site.addHeader("Accept-Encoding", "gzip, deflate, br");site.addHeader("Accept-Language", "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6,cy;q=0.5");site.addHeader("Connection", "keep-alive");site.addHeader("Cookie","uuid=\"w:6eeae48e765542f8816b14bd1a8803f2\"; tt_webid=6799537520192783879; csrftoken=3eb88bcad1818058de0e3c0ca8a3f6d1; W2atIF=1; _ga=GA1.2.2115719807.1583140719; _gid=GA1.2.359266539.1583140719; __tasessionId=tr7vk2kgh1583140721519");site.addHeader("Host", "m.toutiao.com");site.addHeader("Referer", "https://m.toutiao.com/?w2atif=1&channel=news_hot");site.addHeader("Sec-Fetch-Dest", "empty");site.addHeader("Sec-Fetch-Mode", "cors");site.addHeader("Sec-Fetch-Site", "same-origin");site.addHeader("Upgrade-Insecure-Requests", "1");site.addHeader("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1");site.setTimeOut(60000);site.setCharset("UTF-8");site.setRetryTimes(2);return site;}
}

4. 文章去重工具类

TestNlp

package com.md.demo.nlp.test;import org.nlpcn.commons.lang.finger.FingerprintService;
import org.nlpcn.commons.lang.finger.SimHashService;/*** 指纹去重库Github地址:https://github.com/hemin1003/nlp-lang* * 更多阅读:https://blog.csdn.net/hemin1003/article/details/82819489(【应用算法】信息流-推荐系统的去重策略)* * @author Minbo*/
public class TestNlp {/*** 任何一段信息文字,都可以对应一个不太长的随机数,作为区别它和其它信息的指纹(Fingerprint)。* 只要算法设计的好,任何两段信息的指纹都很难重复,就如同人类的指纹一样。信息指纹在加密、信息压缩和处理中有着广泛的应用。* 这里的做法是文章抽取特征词,压缩为md5指纹。利用这些指纹进行hash去重。广泛应用在搜索结果、推荐结果去重。*/public static void main(String[] args) {String content = "卓尔防线继续伤筋动骨 队长梅方出场再补漏说起来卓尔队长梅方本赛季就是个“补漏”的命!在中卫与右边后卫间不停地轮换。如果不出意外,今天与广州恒大一战梅方又要换位置,这也是汉军队长连续三场比赛中的第三次换位。而从梅方的身上也可以看出,本赛季汉军防线如此“折腾”,丢球多也不奇怪了。梅方自2009赛季中乙出道便一直司职中后卫,还曾入选过布拉泽维奇国奥队,也是司职的中卫。上赛季,梅方与忻峰搭档双中卫帮助武汉卓尔队中超成功,但谁知进入本赛季后从第一场比赛开始梅方便不断因为种种“意外”而居无定所。联赛首战江苏舜天时,也是由于登贝莱受伤,朱挺位置前移,梅方临危受命客串右边后卫。第二轮主场与北京国安之战梅方仅仅打了一场中卫,又因为柯钊受罚停赛4轮而不得不再次到边路“补漏”。随着马丁诺维奇被弃用,梅方一度成为中卫首选,在与上海东亚队比赛中,邱添一停赛,梅方与忻峰再度携手,紧接着与申鑫队比赛中移至边路,本轮忻峰又停赛,梅方和邱添一成为中卫线上最后的选择。至于左右边后卫位置,卓尔队方面人选较多,罗毅、周恒、刘尚坤等人均可出战。记者马万勇原标题:卓尔防线继续伤筋动骨队长梅方出场再补漏稿源:中新网作者:";String content2 = "在中卫与右边后卫间不停地轮换。卓尔防线继续伤筋动骨 队长梅方出场再补漏说起来卓尔队长梅方本赛季就是个“补漏”的命!还曾入选过布拉泽维奇国奥队,也是司职的中卫。上赛季,梅方与忻峰搭档双中卫帮助武汉卓尔队中超成功,但谁知进入本赛季后从第一场比赛开始梅方便不断因为种种“意外”而居无定所。";// 方式1
//      String f1 = new FingerprintService().fingerprint(content);
//      String f2 = new FingerprintService().fingerprint(content2);
//      System.out.println(f1);
//      System.out.println(f2);
//      System.out.println(f1.equals(f2));// 方式2SimHashService service = new SimHashService();String f3 = String.valueOf(service.fingerprint(content));String f4 = String.valueOf(service.fingerprint(content2));System.out.println(f3);System.out.println(f4);System.out.println(f3.equals(f4));//      System.out.println(service.hmDistance(content, content2));}}

更多阅读:【应用算法】信息流-推荐系统的去重策略

5. 计划任务

ScheduledTasks:

package com.md.demo.task;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import com.md.demo.crawler.test.MyPageProcessor;import lombok.extern.slf4j.Slf4j;
import us.codecraft.webmagic.Spider;@Component
@Slf4j
public class ScheduledTasks {/*** 每30秒执行一次*/@Scheduled(initialDelay = 5000, fixedDelay = 30000)public void httTaskOfWechatPay() {log.info("------------------------------------------------");log.info("============爬虫数据任务,start===================");// TODO 在这里,你可以把爬虫做成执行计划任务,或者动态执行计划(通过db配置,或quartz框架,或XXL-job任务调度计划框架)log.info("开始爬虫数据...");log.info("处理处理...可以入库db,或存入es中");// 爬今日头条/热点数据urlSpider.create(new MyPageProcessor()).addUrl("https://m.toutiao.com/list/?tag=news_hot&ac=wap&count=20&format=json_raw&as=A1551E75BC4CF9C&cp=5E5C3CEFB9DCAE1&max_behot_time=1583123351&_signature=CXZIuwAAVy.txcPhjSEcTwl2SK&i=1583123351").thread(1).run();log.info("爬虫结束...done");log.info("============爬虫数据任务,end===================");log.info("------------------------------------------------");}}

注:可以改写成多线程模式,并发抓取多个tag分类的新闻数据,但频率不要很高,不然容易命中爬虫IP反作弊(可以加上ip代理)

6. 启动类

Application:

package com.md.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;/*** 程序主入口* * @author Minbo**/
@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}/*** 开启过滤器功能* * @return*/private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");return corsConfiguration;}/*** 跨域过滤器* * @return*/@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", buildConfig());return new CorsFilter(source);}
}

完整源码下载

我的Github源码地址:

https://github.com/hemin1003/spring-boot-study/tree/master/spring-boot2-study/spring-boot2-parent/spring-boot2-crawler

下一章教程

SpringBoot从入门到精通教程(三十二)- MybatisPlus框架动态数据源用法(支持多个DB,动态切换数据源)

该系列教程

SpringBoot从入门到精通教程

我的专栏

  • SpringBoot系列专栏
  • 高可用高并发实战专栏
  • 微服务架构实战
  • DevOps实战专栏
  • 程序化广告实战专栏

至此,全部介绍就结束了

-------------------------------

-------------------------------

我的CSDN主页

关于我(个人域名)

我的开源项目集Github

期望和大家一起学习,一起成长,共勉,O(∩_∩)O谢谢

欢迎交流问题,可加个人QQ 469580884,

或者,加我的群号 751925591,一起探讨交流问题

不讲虚的,只做实干家

Talk is cheap,show me the code

SpringBoot从入门到精通教程(三十一)- 爬虫框架集成相关推荐

  1. SpringBoot从入门到精通教程

    SpringBoot从入门到精通教程 一.来自ImportNew公众号的SpringBoot教程系列,可参考学习 SpringBoot (一) :入门篇--http://mp.weixin.qq.co ...

  2. SpringBoot从入门到精通教程(二十九)- 微信企业支付集成(五分钟集成)

    需求背景 SpringBoot用法:微信企业支付集成(五分钟集成) 问题痛点 通过SpringBoot框架,集成服务端微信企业支付接口,做到下载即用(填写好相关微信支付后台相关Key信息),最快五分钟 ...

  3. SpringBoot从入门到精通教程(二十七)- @Valid注解用法详解+全局处理器Exception优雅处理参数验证用法

    问题痛点 用 Spring 框架写代码时,写接口类,相信大家对该类的写法非常熟悉.在写接口时要写效验请求参数逻辑,这时候我们会常用做法是写大量的 if 与 if else 类似这样的代码来做判断,如下 ...

  4. Elasticsearch从入门到精通 理论 集群 优化 框架集成

    Elasticsearch 入门 Elasticsearch 安装 下载软件 Elasticsearch 的官方地址:https://www.elastic.co/cn/ Elasticsearch ...

  5. SpringBoot从入门到精通教程(八):集成ElasticSearch

    本主要介绍ElasticSearch 和 SpringBoot 的整合 ,对您有帮助的话,点个关注哦 ElastSearch 介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供 ...

  6. SpringBoot从入门到精通教程(七):集成Redis

    今天,我们继续讲SpringBoot整合Redis ,也就缓存,它将与我们的Springboot整合 Redis 简介 Redis 是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语 ...

  7. PreScan快速入门到精通第三十一讲基于PreScan进行鱼眼摄像头传感器仿真

    PreScan允许用户实现鱼眼相机传感器.鱼眼相机覆盖了水平和垂直方向的大视野,通常用于停车辅助等应用. 使用鱼眼相机拍摄的场景 鱼眼相机 鱼眼相机是一个带有f-theta镜头的(单声道)相机传感器. ...

  8. SpringCloud从入门到精通教程/SpringCloud Alibaba从入门到精通教程

    对于SpringCloud,很多小伙伴问到了我的研究学习资料来源,除官方文档外,特例完整整理一下自己的平时参考学习其他资料,以及分享实战项目源码和代码资源,供大家参考学习 主要教程:SpringClo ...

  9. Elasticsearch入门到精通教程 - 学习资料综合

    背景 因经常被问到Elasticsearch相关一些资料教程,这里特例整理一份以前自己的学习资料,希望对你有用. 信息资料 1. 基本API用法教程 Elasticsearch JAVA API教程G ...

最新文章

  1. 2022-2028年中国金属制品行业投资分析及前景预测报告
  2. DV录像带导出一定要用1394
  3. Nginx+tomcat负载均衡session问题解决
  4. 计算机专业相关分类调研
  5. iShow UI for React 最佳实践
  6. 删除结果集中字段重复的方法
  7. easylog 使用_Easyloggingpp的使用
  8. JavaEE 银联支付之网站支付-消费类交易
  9. java notify唤醒原理_Java wait和notify虚假唤醒原理
  10. Netsharp快速入门(之2) 基础档案(之A 创建插件和资源)
  11. 【实验报告】二 网络嗅探与欺骗
  12. ubuntu配置LAMP
  13. 【0xC1900101】BOOT过程中的SAFE_OS阶段安装win10失败的解决方法
  14. zk的数据一致性问题
  15. Hadoop1.0之集群搭建
  16. 按键精灵手机助手连mumu模拟器
  17. 设计模式之禅-抽象工厂模式
  18. vsjitdebugger.exe 进程解决方法
  19. 参数估计(二)----极大后验概率估计
  20. RTX腾讯通自动发送信息软件

热门文章

  1. JN516中断简单应用
  2. 3ds max7渲染传奇三剑客VRay教程(PDF)
  3. 《“雕刻”--“雕塑”系统操作设计》
  4. 程序安装--Outlook2016Professional+OraclePlsql
  5. 芒果iOS开发之NSComparisonResult比较结果
  6. Linux shell: ls命令详解
  7. ellipse 标签
  8. 以太网MII接口类型大全 MII、RMII、SMII、SSMII、SSSMII、GMII、RGMII、SGMII、TBI、RTBI、XGMII、XAUI、XL
  9. 【BZOJ4416】阶乘字符串(SHOI2013)-状压DP
  10. arcgis栅格缺失值填补