爬今日头条,各种失败经验,之后成功了

Python015

爬今日头条,各种失败经验,之后成功了,第1张

最近研究了一下js加密,发现今日头条比较适合练手,在头条获取数据的XHR中request参数有一项_signature参数,这个是就是经过js加密的数据。解决方案在最后。

先说寻找逻辑,叫顺藤摸瓜,藤是params中的key,瓜是js函数,在哪里摸,我用的是chrome F12,全局查找,就是在网址ctrl+f,注意看结果,前面有url这种一般都是在headers之类带着没什么价值,要看出来具体数据的。

然后在preview里,格式化看得清楚,还是查找signature。

这样就成功一大半了。顺便还找到了as和cp

as: e.as,cp: e.cp,

这个e也在前面定义了var e = ascp.getHoney(),然后在搜索getHoney,就找到了。

把这段复制进pycharm的zhu.js文件里,然后新建一个python文件来运行,nodejs直接运行也行。

额,报错了,execjs._exceptions.ProgramError: ReferenceError: md5 is not defined

赶紧查了一下md5是个加密模块, nodejs安装MD5 ,然后改装了改装一下,增加了var md5 = require('md5-node')运行成功。

然后就到了signature, _signature: i,i = TAC.sign("refresh" === t ? 0 : r.params.max_behot_time_tmp))

params.max_behot_time_tmp应该是在回传的数据里的max_behot_time了。

首次请求是0,后来的是根据前一次请求的后传数据继续请求。

不知所云,但还是按照老办法试试看能不能运行。

execjs._exceptions.ProgramError: TypeError: Cannot read property 'userAgent' of undefined。

这回我参考一下 别人怎么办

原来要加useagent,

global.navigator={}

global.navigator.userAgent=

然后变成这样

调用发现又有错误:

好像说的是var data = TAC.sign(0)之前出现了一个不该出现的逗号,把它改成分号,果然成功了,

满怀欣喜的把signature,cp,as找到拼接成url发送,结果并不能返回数据。

有些忧郁的又看看别人怎么办, 用selenium获取参数 ,phantomjs不维护了,听说chrome headless可以替代之, 别人家说这么用 ,chrome还是打开窗口了,后来发现chromedriver.exe版本与chrome有严格的对应关系。 官网这样说

总算是chrome是无头的了,现在只差跟着up主把参数弄出来就行了,因为有了前面的查找,selenium执行的函数名称也很清楚,

signature = brower.execute_script('return TAC.sign(0)')

果然出来一个参数,开心的拼接url发送请求还是没数据回来。。。

忧伤的想了好久,尝试了多次,终于在手机版里发现可以不用cp和as参数,用哪里生成的signature都能拼接出结果,只是max_behot_time是藏在前一页最后一项的信息里

用requests的session或者scrapy都能连续爬取了。不过m站将返回数量20写进了js里,更改params的参数也不能控制一次的爬取量还是很是遗憾。

结果

好像必须带着cookie才能爬取后续的,不然永远都只能爬取第一页的内容,获取cookie用request的session都不行可能只能用selenium获取cookie之后再来。忧伤。。。

1、抓取网页、分析请求

2、解析网页、寻找数据

3、储存数据、多页处理

翻页有规律:

很多网址在第一页时并没有变化,多翻下一页后规律就出来,比如 豆瓣第一页 和 豆瓣第三页

发现start为40,limit=20,所以猜测start=0就是第一页,每页显示20条数据,对于第三页显示的参数可以一个个删除验证,可以减去不必要的参数, 但是删除前一定要做好数据的对比

(1) 文本框输入后产生一个请求,如常见的登录、注册页面

Referer:表示当前请求的来源

Request URL:表示实际请求地址

翻页后URL不变,该如何寻找请求?

如: http://www.zkh360.com/zkh_catalog/3.html

通过对比可以发现网站是通过pageIndex参数控制翻页的,?表示连接

接下来用抓包工具分析下 ,从第四页开始看URL就知道了,但是前面几面需要查看请求的参数,这里偏多,就切换到【Inspectors--Webforms】选项,看的比较直观

类似的网站还有 今日头条 ,有兴趣的朋友可以去研究下

(可通过获取max_behot_time的值而改变as和cp)

1、Web开发

目前豆瓣、知乎、拉勾网等都是用的Python做开发,由此可见Web开发在国内的发展还是很不错的。

因为Python的web开发框架是最大的一个优势,如果你用Python搭建一个网站,只需要几行的代码,可谓是十分简洁。

2、网络爬虫

现在学习Python的人员中,大部分都是在学习爬虫,这也是Python的一大优势之一,最早用Python做网络爬虫的就是谷歌。

3、人工智能

发展潜力和Money不用多说,这都是大家所知道的,但目前的话,人工智能方面的工作还是比较少的,而且都是高学历人士,以后的话肯定是最具有发展潜力的方向了。

4、服务器运维

运维也不陌生,最开始一批学习Python的人,就是运维和测试的在职人员,因为Python对于他们的工作起到很大的作用,因为使用Python脚本进行批量化的文件部署和运行调整都成了Linux服务器上很不错的选择。

5、数据分析

Python所拥有的完整的生态环境十分有利于进行数据分析处理,比如,"大数据"分析所需要的分布式计算、数据可视化、数据库操作等,都可以通过Python中的十分成熟的模块完成。

想了解更多Python相关,可转: