如今自媒体风生水起,很多人开始入住各大自媒体平台进行自媒体创作。想要持续的输出高质量的文章太难了,于是很多人就开始搞起了伪原创,拿别人比较热的文章过来改一改,不仅轻松还能收获一票粉丝,偏题了,我不是鼓励大家搞伪原创。今天我们的主题是爬虫,既然自媒体平台有这么多高质量的文章,想要一一收藏太难了,于是就想出了通过网络爬虫将感兴趣的文章爬取下来然后进行收藏,岂不是很爽,于是开始动手。今天拿今日头条练手。
第一步分析入口,今日头条的文章入口主要分为频道入口,搜索入口,用户主页入口,那么我们就一一开始破解。
首先从频道入口下手,分析网页结构,发现所有的文章都是通过ajax动态加载,那么第一想法是通过selenium模拟浏览器进行网页提取,虽然目的可以达到但是效果不理想,需要处理分页去重而且效率不高,故这个方案放弃,在接着进行分析ajax接口,貌似行得通,架起代码开始测试,在处理ajax接口是发现需要处理as,cp,_signature 三个参数,接口如下
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=A125AB7BC7F0F59&cp=5BB7802FF5896E1&_signature=NOFpxAAAb1yLl5gie2NwDTThad
as,cp网上已经有大神破解了算法如下;
比较难搞的是signature参数,虽然网上也有很多人发文怎么破解,但是效果都不理想,只能拿到第一次请求的signature,第二次请求就直接不行了。分析js发现signature的请求是通过window.TAC.sign方法产生,而这个方法是动态绑定的,由一堆看不清逻辑的字符串通过一定的算法解密后得到,着手分析了一下,发现里面用到了Date ,Convas 相关的函数,姑且进行了一下推断,判断入参的时间戳跟当前的时间戳进行对比,肯定不能大于当前的时间,但是范围也不能相差太远否则一个频道页内容直接就爆了,对于Convas 可能就是为了限定上下文,否则为什么我们通过python直接执行TAC.sign方法产生的signature在第二次就会失效,虽说第一次能请求成功那么我们是不是每次都模拟第一次请求,虽说也能得到数据,但不能连续采集还是有点失望的。那有没有其他的办法可以解决了,在经过一下午的思考过后发现,既然在保证上下文的情况下可以连续采集(通过chrome的console生成的signature是可以的)那么我们通过selenium方案来模拟上下文,负责产生signature,剩下的就是通过urllib来请求接口获取数据进行解析是否可以行了?经过一番验证结果是可喜的,功夫不负有心人达到目的。直接贴代码。代码中有些自有逻辑没有贴出来,但是逻辑思路基本上都有了。今天到此为止,下次说怎么爬详情