当前位置:   article > 正文

[完整爬虫]java爬虫基础对36Kr快讯数据进行爬取以及数据筛选过滤_36氪抓取信息

36氪抓取信息

由于九月事件把爬虫推到风口浪尖 

而我写这些只是分享技术

不涉及隐私等个人资料的获取

并且是在不会对对方服务器造成压力的情况下进行的爬取

特此声明

 

36Kr 也叫36氪,是一个我非常喜欢的网站,网罗天下资讯,而且页面整洁资讯一目了然,极大的开拓眼界,许多不管是金融方面科技方面我感觉是最新最全面,当然最终是准备爬取一下上面的资讯,当然是不会对对方服务器造成压力的情况下进行的爬取.

一.所需材料,涉及技术

  1. java 

  2. jsoup 爬取方法

  3. sql 数据库

  4. 一个可爱的脑子

  5. 当然还需要对H5结构的熟悉了解,以及json层次结构

 

分析数据源的方法我写过详细的博客,这里就不详细说明数据的获取方式了.

详情参考:([java爬虫]常用网页接口查找方法)这篇博客

 

这里就直接粘贴数据接口

https://36kr.com/api/newsflash?b_id=AAAA&per_page=BBBB

主要是b_id&per_page的参数

但要记住per_page的值不能超过30

因为访问的数量越多,后台就需要读取大量数据进行组装,消耗大量资源,切记不能对对方服务器造成压力的情况下进行爬取

因为访问的数量越多,后台就需要读取大量数据进行组装,消耗大量资源,切记不能对对方服务器造成压力的情况下进行爬取

因为访问的数量越多,后台就需要读取大量数据进行组装,消耗大量资源,切记不能对对方服务器造成压力的情况下进行爬取

  1. 例子
  2. 如b_id=10005&per_page=5
  3. 新闻从id为10005开始,返回5条数据
  4. 10005,10004,10003,10002,10001
  5. 五条数据

 

代码部分会写如何获取最新的新闻数据方法

 

下面是真实数据

  1. {"code":0,
  2. "timestamp":1571904380,
  3. "timestamp_rt":1571904380,
  4. "data":{"items":[
  5. {
  6. "id":187910,
  7. "project_id":1,
  8. "column_id":72,
  9. "post_id":null,
  10. "is_top":0,
  11. "pin":0,
  12. "title":"金柚网2019人力资源产业生态论坛在杭举办",
  13. "catch_title":"",
  14. "description":"36氪获悉,2019中国(浙江)人力资源服务博览会开幕,来自全国的120家人力资源机构参展。在金柚网“重塑·创新·激活人效·智享未来” 2019人力资源产业生态论坛上,金柚网助理总裁兼产品发展部总监陈鸿飞表示,数字化将在数据沉淀、效率提升、智能决策与交付提升方面显著提升人力资源服务质量与水平,金柚网将以“AI+人力资源”为发展动能,持续打造数字化人力资源全流程服务平台。",
  15. "cover":"",
  16. "news_url_type":"",
  17. "news_url":"",
  18. "user_id":16754887,
  19. "published_at":"2019-10-24 15:10:44",
  20. "created_at":"2019-10-24 15:10:44",
  21. "updated_at":"2019-10-24 15:10:44",
  22. "counters":{"view_count":13,
  23. "pv":12,
  24. "pv_mobile":0,
  25. "pv_app":1,
  26. "comment":0},
  27. "extraction_tags_arr":[],
  28. "extraction_tags":"[]",
  29. "column":{
  30. "id":72,
  31. "name":"其他",
  32. "bg_color":"#000000",
  33. "type":"normal"
  34. },"db_counters":[{"id":287449590,
  35. "entity_type":"newsflash",
  36. "entity_id":187910,
  37. "count_type":"favorite",
  38. "key":"kr_newssite_counter:newsflash_187910_favorite",
  39. "value":1,
  40. "created_at":"2019-10-24 15:28:00",
  41. "updated_at":"2019-10-24 15:28:00",
  42. "entity_id_old":null
  43. },{
  44. "id":287441265,
  45. "entity_type":"newsflash",
  46. "entity_id":187910,
  47. "count_type":"pv",
  48. "key":"kr_newssite_counter:newsflash_187910_pv",
  49. "value":12,
  50. "created_at":"2019-10-24 15:14:51",
  51. "updated_at":"2019-10-24 15:49:07",
  52. "entity_id_old":null
  53. },{
  54. "id":287449996,
  55. "entity_type":"newsflash",
  56. "entity_id":187910,
  57. "count_type":"pv_app",
  58. "key":"kr_newssite_counter:newsflash_187910_pv_app",
  59. "value":1,
  60. "created_at":"2019-10-24 15:28:34",
  61. "updated_at":"2019-10-24 15:28:34",
  62. "entity_id_old":null}],
  63. "user":{
  64. "id":16754887,
  65. "name":"李欣",
  66. "avatar_url":""
  67. },"news_url_title":"",
  68. "station_info":null
  69. },{
  70. "id":187909,
  71. "project_id":1,
  72. "column_id":72,
  73. "post_id":null,
  74. "is_top":0,
  75. "pin":0,
  76. "title":"金柚网2019人力资源产业生态论坛在杭举办",
  77. "catch_title":"",
  78. "description":"36氪获悉,2019中国(浙江)人力资源服务博览会开幕,来自全国的120家人力资源机构参展。在金柚网“重塑·创新·激活人效·智享未来” 2019人力资源产业生态论坛上,金柚网助理总裁兼产品发展部总监陈鸿飞表示,数字化将在数据沉淀、效率提升、智能决策与交付提升方面显著提升人力资源服务质量与水平,金柚网将以“AI+人力资源”为发展动能,持续打造数字化人力资源全流程服务平台。",
  79. "cover":"",
  80. "news_url_type":"news_url",
  81. "news_url":"http://baijiahao.baidu.com/s?id=1648179606039764976&wfr=spider&for=pc",
  82. "user_id":16754887,
  83. "published_at":"2019-10-24 14:56:29",
  84. "created_at":"2019-10-24 14:56:29",
  85. "updated_at":"2019-10-24 14:56:29",
  86. "counters":{
  87. "view_count":39,
  88. "pv":39,
  89. "pv_mobile":0,
  90. "pv_app":0,
  91. "comment":0},
  92. "extraction_tags_arr":[],
  93. "extraction_tags":"[]",
  94. "column":{
  95. "id":72,
  96. "name":"其他",
  97. "bg_color":"#000000",
  98. "type":"normal"},
  99. "db_counters":[
  100. {"id":287430436,
  101. "entity_type":"newsflash",
  102. "entity_id":187909,
  103. "count_type":"pv",
  104. "key":"kr_newssite_counter:newsflash_187909_pv",
  105. "value":39,
  106. "created_at":"2019-10-24 14:58:21",
  107. "updated_at":"2019-10-24 15:58:10",
  108. "entity_id_old":null
  109. },{
  110. "user":{
  111. "id":16754887,
  112. "name":"李欣",
  113. "avatar_url":""},
  114. "news_url_title":"原文链接",
  115. "station_info":null
  116. },{
  117. ]
  118. }
  119. }

接口返回json格式数据

数据比较多,涉及到的参数也比较详细

这里就需要对json格式比较熟悉可以快速的进行数据筛选

 

 

对这种数据进行筛选的方法有很多,也有很多便利的方法

我这里就使用java 自带的String中的方法

由于是使用json格式所以新闻存储在List<Map<String,String>>格式里面

使用的"},{"进行分隔

对获取到的数据用.split()方法,分割出来

 

下面是代码

 

首先是如何获取到最新的新闻

https://36kr.com/api/newsflash?b_id=AAAA&per_page=BBBB

接口需要两个值,一个是从那条新闻开始获取,一个是获取几条数据

所以获取最新的新闻就需要获取最新的新闻的ID

  1. /**
  2. * 当前最新的新闻ID
  3. * @return 返回 int 类型 的id
  4. */
  5. public int newID() {
  6. int front = 0;
  7. int later = 0;
  8. String textno1 = "";
  9. String newsURL = "https://36kr.com/newsflashes";
  10. try {
  11. // 爬取方法(每个人获取数据的方法不同,所以就不具体写爬取方法了)
  12. String information = Getinformation(newsURL);
  13. front = information.indexOf("newsflashList");
  14. textno1 = information.substring(front);
  15. front = textno1.indexOf("id");
  16. later = textno1.indexOf("project_id");
  17. textno1 = textno1.substring(front + 4, later - 2);
  18. front = Integer.parseInt(textno1);
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. } finally {
  22. return front;
  23. }
  24. }

之后就可以根据自己需要填写需要返回的新闻条数

 

如果是定时任务获取数据可以先获取最新id,在获取数据库内最新的新闻id,做差值

得到距离上次爬取新生成的新闻数

来准确的获取新生成的数据,节省时间,节省资源

 

再贴一份有关数据库做差获取新闻方法

  1. /**
  2. * 处理并返回新网址
  3. * @param NEWID 页面最新ID
  4. * @param SQLID 数据库最新ID
  5. * @return
  6. */
  7. public String newurl(int SQLID, int NEWID) {
  8. String http = "https://36kr.com/api/newsflash?b_id=AAAA&per_page=BBBB";
  9. String BBBB = "";
  10. if (SQLID == 0) {
  11. BBBB = "30";
  12. } else {
  13. BBBB = String.valueOf(NEWID - SQLID);
  14. }
  15. http = http.replace("AAAA", String.valueOf(NEWID));
  16. http = http.replace("BBBB", BBBB);
  17. return http;
  18. }

 

当有了接口链接就可以进行获取数据了

 

数据分割方法

  1. /**
  2. * 数据分割方法
  3. * @param information 源码
  4. * @return 分割后的集合
  5. */
  6. public List roughsaix(String information) {
  7. List<String> list = new ArrayList<String>();
  8. try {
  9. String[] Array = information.split("\\}\\,\\{");// 拆分为String数组
  10. for (int i = 0; i < Array.length; i++) {
  11. list.add(Array[i]);// 转化为集合
  12. }
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. } finally {
  16. return list;
  17. }
  18. }

 

数据筛选方法

  1. /**
  2. * 数据筛选方法
  3. 将刚刚分割后的数据传入
  4. * @param Clist
  5. * @return 返回整理好的数据List<Map<String, Object>>集合
  6. */
  7. public List<Map<String, Object>> ScreenText(List<String> Clist) {
  8. List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
  9. int front;
  10. int later;
  11. // 所提取的值
  12. String time;// created_at
  13. String ID;// id
  14. String title;// title
  15. String summary;// summary
  16. String newsurl;
  17. // 记录当前爬取详情
  18. try {
  19. for (String information : Clist) {
  20. Map<String, Object> map = new HashMap<String, Object>();
  21. front = information.indexOf("title\":\"");
  22. later = information.indexOf("catch_title");
  23. if (front != -1 && later != -1) { // 判断是否为要爬取的目标
  24. // title
  25. title = information.substring(front + 8, later - 3);
  26. front = information.indexOf("id\":");
  27. later = information.indexOf("project_id");
  28. // ID
  29. ID = information.substring(front + 4, later - 2);
  30. front = information.indexOf("description");
  31. later = information.indexOf("cover");
  32. // summary
  33. summary = information.substring(front + 14, later - 3);
  34. // url
  35. front = information.indexOf("\"news_url\":\"http");
  36. later = information.indexOf("user_id");
  37. if (front != -1) {
  38. newsurl = information.substring(front + 12, later - 3);
  39. } else {
  40. newsurl = null;
  41. }
  42. front = information.indexOf("created_at");
  43. later = information.indexOf("updated_at");
  44. // time
  45. time = information.substring(front + 13, later - 3);
  46. map.put("id", ID);// 数据id
  47. map.put("url", url);// 外部链接
  48. map.put("title", title);// 存储标题
  49. map.put("text", summary);// 新闻主体
  50. map.put("time", time);// 新闻时间
  51. //保存 也可以直接入库
  52. listmap.add(map);
  53. }
  54. }
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. } finally {
  58. return listmap;
  59. }
  60. }

 

最后将数据入库,结束

 

可以在服务器里设置定时任务,每半个小时获取一次新闻,保存入库

也可以在入库之后发送给自己的手机,

 

 

 

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/998638
推荐阅读
相关标签
  

闽ICP备14008679号