今日头条Web端爬虫as,cp值破解

请各位转载的朋友请注明出处.
作者:小胖

实验网址:https://www.toutiao.com/ch/news_tech/
实验环境:Windows10
实验工具:Chrome,Fiddler(该抓包观察比较方便,当时抓取HTTPS的网页需要设置证书,具体请百度品尝,很多教程)

0x1:分析

A:打开头条官网抓包.发现其是一个ajax的页面.然后抓包分析.然后发现了一个对爬虫不友好的三个值.as,cp,_signature

B:我抓了2个获取文章标题的包,发现我们获取的值和封包中一个名为max_behot_time的值有关。当我修改下图中选中的值进行测试的时候,发现会给我们一个错误的返回!至此,我们就需要进行JS对抗了。

0x2: JS对抗 - 前端无秘密

A:找到关键包,从Initiator中进去是最快的。(此方法对于此类大站或是含关键JS混淆的站点百试不爽),具体操作看图!



B:我们运行,通过堆栈信息倒找关键位置。我们在init后,发现this.o.data中包含了我们需要的as,cp,_signature(太难描述具体操作).此刻我们就应该要去寻找,它从哪来!

C:我们经过一系列的操作,发现getHoney是一个生成as和cp的方法.所以我们进去瞧瞧。 这里我把该方法拿了出来。我们的as和cp其实就搞定了。(自行把md5方法扣出来,pc端比m端的简单一点)

e.getHoney = function() {var t = Math.floor((new Date).getTime() / 1e3), e = t.toString(16).toUpperCase(), i = md5(t).toString().toUpperCase();if (8 != e.length)return {as: "479BB4B7254C150",cp: "7E0AC8874BB0985"};for (var n = i.slice(0, 5), a = i.slice(-5), s = "", o = 0; 5 > o; o++)s += n[o] + e[o];for (var r = "", c = 0; 5 > c; c++)r += e[c + 3] + a[c];return {as: "A1" + s + e.slice(-3),cp: e.slice(0, 3) + r + "E1"}
}

D:经过测试,_signature值和cp值其实是可有可无的。所以我们只需要as值即可。我这边上一段我修改后的获取as值方法。

 function getHoney() {var t = Math.floor((new Date).getTime() / 1e3), e = t.toString(16).toUpperCase(), i = b(t).toString().toUpperCase();if (8 != e.length)return  "479BB4B7254C150";for (var n = i.slice(0, 5), a = i.slice(-5), s = "", o = 0; 5 > o; o++)s += n[o] + e[o];for (var r = "", c = 0; 5 > c; c++)r += e[c + 3] + a[c];return   "A1" + s + e.slice(-3)}

E:max_behot_time值分析
每一个max_behot_time值其实都是由上一个同类型的包获取得到的。首个包max_behot_time直接写0即可。

F:JS代码调试。JS关键文件我写到了toutiao.js中。
import execjs

with open("toutiao.js","r") as f:JsCode = f.read()
js=execjs.compile(JsCode)as_ = js.call("getHoney")
print(as_)

PS:在编写代码后才发现,as.cp并不是必须的。但是了解下js如何破解还是很有必要的

0x3:编写Python代码

A:构造crawl类,写个init方法,初始化一些必要的参数.这边特别说明下cookie的问题. 我们必须要拿每次访问得到的cookie,否则无法获得到新的内容.这点需要注意
至于我如何知道的,当然是自己踩出来的.

class crawl():
def __init__(self,page):self.page = pageself.time = 0self.headers ={"Host":"www.toutiao.com","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}self.cookie = {}# 初始化JSwith open("toutiao.js", "r") as f:JsCode = f.read()self.js = execjs.compile(JsCode)

B:这时候我们就可以来写一个request方法.来访问它的页面.这里需要带上headers.我在**init方法中初始化了.否则会被检测.
其次它的返回值是
JSON格式**的,所以我们直接市容resp.json()是非常的方便的.

def request(self,page):if page == 1:self.time = 0as_ = self.js.call("getHoney") # r返回结果   asurl = "https://www.toutiao.com/api/pc/feed/?category=news_tech&utm_source=toutiao&widen=1&max_behot_time={0}&max_behot_time_tmp={0}&tadrequire=true&as={1}".format(self.time, as_)resp = requests.get(url,headers = self.headers,cookies = self.cookie)self.cookie = resp.cookiesresult = resp.json()self.time = result['next']['max_behot_time']return result

C:拿到了数据,我们来写一个parse_html方法,处理下我们的数据.

def parse_html(self,data):items = data['data']for item in items:yield{'title':item['title'],'source':item['source'],'abstract':item['abstract'] ,'url':"https://www.toutiao.com/a{0}/".format(item['item_id'])}

D: 数据整理完毕,就要写文件了.不然爬取出来貌似没有啥太大的意义!因此就有了write_to_file方法,代码中注释了一点坑.

    def write_to_file(self,context):#这边不建议转换成我们看的懂的中文,否则后期我们在读入数据的时候,#因为title或者abstract中会有很多奇怪的字符.会导致很多问题.with open('toutiao.txt', 'a') as f:print(context)f.write(json.dumps(context) + '\n')

E:这时候我们就可以在测试下,写个main方法,把这几个方法配合的调用起来。

def main(self):for page in range(1,self.page+1):htmlData  = self.request(page)for item in self.parse_html(htmlData):self.write_to_file(item)

至此,我们的代码就全部编写完毕了。

0x4:代码运行

crawl(3).main()

效果图如下:

0x5:总结

事实上,这个头条并不需要去JS破解的,我这里是因为没有充分的测试,所以导致了浪费了些许时间去破解JS.也导致本文的篇幅多了许多.
正是因为如此,我们可以知道一点:有的时候我们并不需要去破解JS,它有可能在后台根本没有检测.
至于AJAX其实就是发现网页规律,然后去访问而已.我也不知道网上的教程为何要总去说ajax,明明很普通,基础的东西

今日头条的signature值的破解比as,cp有意思一点.有兴趣的小伙伴可以去玩玩

今日头条Web端爬虫as,cp值破解相关推荐

  1. 2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析

    郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关. 这篇文章是公众号<云爬虫技术研究笔记>的<2019 ...

  2. 猿人学web端爬虫攻防大赛赛题解析_第九题:js混淆-动态cookie2

    js混淆,动态cookie2 一.前言 二.加密逻辑初探 三.加密逻辑深入分析 四.代码实现 4.1.ast解混淆的一个坑 4.2.完整实现过程 五.参考文献 一.前言 一转眼又有快两个星期没更博客了 ...

  3. 猿人学web端爬虫攻防平台第七题动态字体

    本人呢很喜欢爬虫,但是技术不好,所以呢就一直慢慢的摸索着,也不知道那什么练手进行学习,直到我在偶然的机会接触到了猿人学,发现了 猿人学web端爬虫攻防平台这个网站,久旱逢甘霖,他乡遇故知呀(蹩脚的词语 ...

  4. 使用opencv破解滑块验证码:以今日头条PC端登录页面滑块验证码为例

    本文目标人群:python爬虫工程师 一.首先看看破解的效果图 二.滑块验证码的破解 滑块验证码的破解的难点主要有两个:计算出滑块到缺口的距离和模拟人拖动滑块的轨迹. 如何计算出滑块到缺口的距离?从网 ...

  5. 今日头条PC端的状态管理,使用的实现库是Redux

    打开今日头条PC端的个人主页: 发送一个类型为content/getList的Action从头条服务器取数据,采取分页读取,page size为10. 意思是取10条我已经发布的头条内容到个人中心并渲 ...

  6. 今日头条新闻采集爬虫分享

    神箭手云爬虫如何采集今日头条新闻 -神箭手云爬虫 -一站式云端通用爬虫开发平台24小时不停机 多样化采集网页内容,快速产生大量而优质的内容,操作简单,无需专业知识. 1.打开神箭手云爬虫官网 2.创建 ...

  7. 今日头条新闻端和创新项目

    今日头条的产品设计是工程学:不强调路径,通过实验和计算得到问题的最优解. 如果把信息流动看作一个海洋世界,算法好比声纳,不断探索海洋的构造和边界:哪里有鱼?是大鱼还是小鱼?怎么吸引鱼群把鱼聚集起来? ...

  8. 今日头条PC端改版上线搜索功能,更像一个搜索引擎平台了!(头条搜索seo)

    今日头条移动搜索早就上线了,用户体验和界面还不错.不过PC端一直没有对外开放,只能搜索站内的内容.作者首发公众号宋九九发现pc端可以使用移动搜索功能,但是搜索界面页面是移动端的,在pc端不友好. 今日 ...

  9. 今日头条ajax技术内as ,cp,_cp_signature参数分析、破解及python爬取频道数据

    [腾讯云]11.11 云上盛惠,云产品限时抢购,1核2G云服务器首年88元 相信很多人在爬今日头条的时候就遇到了一个难题,就是找到了消息头后,有3个加密的参数(as ,cp,_cp_signature ...

最新文章

  1. C#用mouse_event模拟鼠标点击的问题
  2. tomcat一闪而过
  3. Go语言爬虫项目将结果写入MySql数据库
  4. phoneGap2.9+eclipse开发环境和helloword案例
  5. Xcode缓存数据清除
  6. xLite连接asterisk提示sip408错误
  7. Linq 实现sql中的not in和in条件查询
  8. linux应用参数 冒号,Lua-面向对象中函数使用时冒号(:)和点(.)的区别
  9. mysql集群搭建(使用docker 一主一从)
  10. InfoQ就Spring Boot 2.0 GA版发布采访了项目牵头人Phil Webb
  11. verilog求倒数-ROM实现方法
  12. Javascript:Promise异步编程解决方案
  13. hadoop 新API与旧API对比
  14. 联想服务器改win7系统教程,联想台式机10代cpu改win7系统详细教程
  15. 换个角度理解Android的AIDL原理
  16. 如何提高kettle在大数据量下的读写速度
  17. 手机安装 卸载CA证书
  18. 帕丽斯·希尔顿,缺少
  19. GIT上优秀的IOS框架
  20. 最近瞎忙,比较懒撒,所以要收收心,该学习的学习。

热门文章

  1. SAP License:守护企业 “ SAP ERP系统数据资产安全 ”
  2. 系列文章丨阿法狗 ZERO为什么这么强之Nature讲解
  3. 2021年亚太杯APMCM数学建模大赛C题生态保护的建设及其对环境影响的评价求解全过程文档及程序
  4. 【解决Chrome浏览器和IE浏览器上传附件兼容的问题 -- Chrome关闭flash后,uploadify插件不可用的解决办法】
  5. android中如何停止动画,如何在Android中停止动画
  6. Java 开发的QQ聊天系统 窗体程序 功能非常齐全 完整源码
  7. 5.3 国王的游戏(贪心,高精度)
  8. html中的ui编辑器,kendoUI系列教程之Editor编辑器
  9. 用一元五角兑换5分、2分、1分的硬币(每种都要有)共100枚,共一共有多少种方案?
  10. android 猜歌游戏报告,Android第二十五期 - 猜歌小游戏