java爬虫系列 今日头条文章爬虫实战

置顶 2018年03月26日 16:55:31 Mr_OOO 阅读数:3868更多

                                                                                                          <div class="tags-box space"><span class="label">所属专栏:</span><a class="tag-link" href="https://blog.csdn.net/column/details/18725.html" target="_blank">最简单的java爬虫</a></div></div><div class="operating"></div></div></div>
</div>
<article class="baidu_pl"><div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post"><div class="article-copyright"><svg class="icon" title="CSDN认证原创" aria-hidden="true" style="width:53px; height: 18px; vertical-align: -4px;"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#CSDN_Cert"></use></svg>版权声明:本文为博主原创文章,未经博主允许不得转载。                    https://blog.csdn.net/Mr_OOO/article/details/79700440               </div><div id="content_views" class="markdown_views"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p></p><div class="toc"><div class="toc">

  • 项目源码
  • 爬虫目标
  • 爬虫设计思路
    • 爬取方式

      • 动态解析网页方式爬取
      • 解析接口方式爬取
    • 解析思路
      • 破解入口
      • 接口对比
      • 破解加密参数
        • 参数生成方式
        • 解析js
      • 分析接口返回值
      • 解析原文地址
  • java项目解析
    • 基本功能
    • 队列和线程池
    • 操作界面——swagger2
  • 总结
  • 补充
  • 同系列文章

项目源码

https://github.com/a252937166/toutiaocrawler.git

爬虫目标

爬取某一头条号下面所有文章。

爬虫设计思路

爬取方式

动态解析网页方式爬取

之前介绍过使用webdriver的方式爬取网页内容,这样做的话好处非常明显,只需要考虑如何解析网页的element标签就行了,当然弊端也非常明显,就是效率不高。

解析接口方式爬取

没遇到反爬手段逆天的网页,我一般不推荐使用webdriver的方式,作为一名技术人员,始终要把项目性能放到第一位,所以这次的项目我选择使用破解今日头条接口的方式去拿取他们的文章。

解析思路

破解入口

以台海网为例,一般大型平台都会有cp和H5两种网页。
cp:https://www.toutiao.com/c/user/50502347096/#mid=50502347096

图(1)

h5:http://m.toutiao.com/profile/50502347096/#mid=50502347096(切换到文章的TAB)

图(2)

Network的信息可以得到两个文章接口:
cp:
https://www.toutiao.com/c/user/article/?page_type=1&user_id=50502347096&max_behot_time=0&count=20&as=A1B57ACB48A9D4F&cp=5AB8F92DD4CFBE1&_signature=NVHtvxAab.D7OmttJlHb-zVR7a
h5:
https://www.toutiao.com/pgc/ma/?page_type=1&max_behot_time=&uid=50502347096&media_id=50502347096&output=json&is_json=1&count=20&from=user_profile_app&version=2&as=A125DA2BD89A381&cp=5AB81AE3C8116E1&callback=jsonp3

接口对比

很明显,cp端的接口比h5的接口多一个_signature参数,我私下尝试过破解_signature的生成方法,结果发现异常复杂,我的前端水平根本搞不定,方法是window.TAC.sign,有兴趣的同学可以去试试。

图(3)

无奈只能选择h5的接口了,现在只需要破解ascp两个参数就行了。

破解加密参数

参数生成方式

第一部当然是找参数怎么生成的,很遗憾,这一步没有捷径,只能复制好ascp,去每一个js文件里面匹配,需要一点耐心。

图(4)

解析js

格式化该方法:

!function(t) {var i = {};i.getHoney = function() {var t = Math.floor((new Date).getTime() / 1e3), i = t.toString(16).toUpperCase(), e = md5(t).toString().toUpperCase();if (8 != i.length)return {as: "479BB4B7254C150",cp: "7E0AC8874BB0985"};for (var s = e.slice(0, 5), o = e.slice(-5), n = "", a = 0; 5 > a; a++)n += s[a] + i[a];for (var l = "", r = 0; 5 > r; r++)l += i[r + 3] + o[r];return {as: "A1" + n + i.slice(-3),cp: i.slice(0, 3) + l + "E1"}},t.ascp = i
}(window, document) >不算太难,一个简单的MD5加密方式,转成java方法也很简单:
    public static Map<String,String> getAsCp(){String as = "479BB4B7254C150";String cp = "7E0AC8874BB0985";int t = (int) (new Date().getTime()/1000);String e = Integer.toHexString(t).toUpperCase();String i = DigestUtils.md5DigestAsHex(String.valueOf(t).getBytes()).toUpperCase();if (e.length()==8) {char[] n = i.substring(0,5).toCharArray();char[] a = i.substring(i.length()-5).toCharArray();StringBuilder s = new StringBuilder();StringBuilder r = new StringBuilder();for (int o = 0; o < 5; o++) {s.append(n[o]).append(e.substring(o,o+1));r.append(e.substring(o+3,o+4)).append(a[o]);}as = "A1" + s + e.substring(e.length()-3);cp = e.substring(0,3) + r + "E1";}Map<String,String> map = new HashMap<>();map.put("as",as);map.put("cp",cp);return map;} 

分析接口返回值

media_id:该媒体ID
message:是否成功
next.max_behot_time:下一页的请求参数
has_more:是否有下一页
data.article_url:文章的html地址
其他参数都不重要了,这里并没有直接返回文章的内容,下一步就是去原文地址爬取文章内容了。

解析原文地址

基本是个静态网页,直接提取标签里面的内容就行了。

java项目解析

基本功能

为了方便,我使用spring boot框架,设计成了一个web项目,以访问接口的方式启动或者停止爬虫。

队列和线程池

因为是接口的方式启动爬虫,所以不可能等10多万个爬虫任务结束之后再返回成功,只能异步执行任务,所以需要线程池。

光有线程池还不够,几十万甚至更多的任务全部甩给线程池,显然不是一个好的选择。所以这里就需要javaQueue,我选择的是LinkedBlockingDeque,不过最后还是没用到双端的特性,所以使用LinkedBlockingQueue是一样的,把所有需要爬取的任务先放入Queue队列中,开始爬取的时候再从里面拿去地址,这样就可简单的解决高并发的问题。

如果任务量特别大,而且有对详细日志的需求,可以选择换成kafka

操作界面——swagger2

使用postman发送请求还是不太方便,还要填地址之类的,我考虑有个前端界面来操作就最好了,但是前端水平有限,不想花太多时间写,所以选择了集成swagger2
打开http://127.0.0.1:9091/swagger-ui.html#/

图(5) 图(6)

一看就知道怎么用了,我就不多介绍了,有兴趣的同学,可以根据这五个接口,写一个前端界面,一个针对头条号的爬虫就算完成了。

图(7)

总结

爬虫最难的地方其实并不在代码上,而在于对爬取网页的分析上,比如制定爬取方式,攻破对方的反爬手段等等,需要一些耐心和分析能力,所谓熟能生巧,最主要的还是要多尝试,累计经验。

补充

经网友提示发现,每个mid下的内容页的结构方式略有不同,本文中的mid的内容页是静态页面,所以使用Jsoup解析,另外有些mid,比如1558737777313793(AI财经社),它的内容页是动态页面,我使用的是正则匹配获取对应数据,示例在dev1.0分支上,大家可以借鉴一下,掌握这两种解析方式,解析其他mid都大同小异了。

同系列文章

java爬虫系列(一)——爬虫入门
java爬虫系列(二)——爬取动态网页
java爬虫系列(三)——漫画网站爬取实战
java爬虫系列(四)——动态网页爬虫升级版

今日头条文章爬虫实战相关推荐

  1. java爬虫系列(五)——今日头条文章爬虫实战

    文章目录 项目源码 爬虫目标 爬虫设计思路 爬取方式 动态解析网页方式爬取 解析接口方式爬取 解析思路 破解入口 接口对比 破解加密参数 参数生成方式 解析js 分析接口返回值 解析原文地址 java ...

  2. Python编写今日头条文章爬虫,轻松发布!

    在当今的信息时代,新闻资讯是人们获取信息的重要途径之一.而作为国内领先的新闻资讯平台,今日头条每天都会推送大量的新闻内容.对于媒体从业者来说,想要获取最新.最全面的新闻资讯,就需要使用到网络爬虫技术. ...

  3. python爬虫爬取今日头条_Python爬虫实战入门五:获取JS动态内容—爬取今日头条...

    之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...

  4. python3 爬取今日头条文章(巧妙避开as,cp,_signature)

    使用环境: python3 scrapy win10 爬取思路 (一)关于as.cp的生成与_signature的想法 对于今日头条的爬虫,网上搜索出来的文章大多是基于崔庆才(通过搜索爬取美女街拍的方 ...

  5. 基于python的今日头条文章抓取内含signature算法

    基于python的今日头条文章抓取内含signature算法 扫二维码添加微信 备注:爬虫 , 拉你进爬虫交流群 或许你会成为第一个加群的人~ 刚有的创群想法! 1. 简单文字描述头条爬虫注意点 由于 ...

  6. 博客搬家系列(六)-爬取今日头条文章

    博客搬家系列(六)-爬取今日头条文章 一.前情回顾 博客搬家系列(一)-简介:https://blog.csdn.net/rico_zhou/article/details/83619152 博客搬家 ...

  7. Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法(2020-6-29版)

    前言 在这里我就不再一一介绍每个步骤的具体操作了,因为在爬取老版今日头条数据的时候都已经讲的非常清楚了,所以在这里我只会在重点上讲述这个是这么实现的,如果想要看具体步骤请先去看我今日头条的文章内容,里 ...

  8. [爬虫笔记01] Ajax爬取今日头条文章

    1.爬取分析 我们首先打开今日头条,搜索"罗志祥" 打开浏览器的开发者工具,红色框中就是我们请求到的数据 将搜索界面的滚动条滑到底,在开发者工具中就可以看到所有请求到的数据,加上前 ...

  9. python+selenium爬虫搜索今日头条文章并爬取文章相关数据(点赞、评论等)

    首先需要一个登录模块,由于今日头条需要登陆就可以搜索,因此这里不登陆,只获取页面 #打开浏览器(不登陆) def login():url = 'https://www.toutiao.com/'opt ...

最新文章

  1. 大二暑假周进度报告(三)
  2. [asp.net]网站数据安全之验证码
  3. 论文,风险管理(背诵)
  4. 超详细 Spring Boot 知识清单
  5. windows安装XGBoost
  6. python根据表格数据生成折线图_Python交互图表可视化Bokeh:4. 折线图| 面积图
  7. poj 1905Expanding Rods
  8. 老子学不动系列:Vue 3.0 新特性预览
  9. golang中http协议实现
  10. 医疗小程序源码_零售小程序源码,零售小程序商城
  11. mysql基础知识(二)
  12. Drupal是基于PHP语言编写的用于开发网站的开发型CMF
  13. LRU缓存介绍与实现 (Java)
  14. PHP字符串函数 查找字符位置函数
  15. vue去除input在360兼容模式下删除图标
  16. win10浏览器加载很慢_win10系统打开网页速度慢的排除原因及解决方法
  17. 游戏开发的专业术语整理
  18. android如何用真机测试,android studio如何使用真机测试app
  19. 微信小程序拼团进度,显示当前刻度,未到刻度点时显示在中间
  20. android 文字点击展开,仿微信朋友圈,文字展开全文,全文收起功能

热门文章

  1. 计算机用鼠标画图,在电脑上用鼠标画画用那个软件好
  2. 基于TextField实现通用搜索组件
  3. unity5-GI是什么?
  4. 探花交友(3)——接口实现分析
  5. 毕业设计 Stm32云平台的智能病房监控系统
  6. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月8日~8月14日)...
  7. Java实现斗地主发牌及排序功能[小白篇]
  8. MySQL的地理位置类型
  9. 【网络模拟】网络环境模拟搭建
  10. 问题:MongoDB C# driver异常:Truncation resulted in data loss