在上一篇文章《使用python-aiohttp爬取网易云音乐》中,我们给自己的微信公众号添加了在线点歌的功能,这次我们再增加一个新闻浏览的功能。由于我平时浏览新闻用的是今日头条,所以在这里就想通过爬取今日头条来获取新闻。不过遗憾的是,这一次我在网上没有找到满意的方法,所以还是自己动手吧。

打开抓包软件Fiddler并设置Filters。

打开今日头条网页,选择热点。
url:http://www.toutiao.com/ch/news_hot/

在Fiddler中找到与上面新闻对应的json数据与url,由于json数据太多,这里只给出部分。

{"has_more": false,"message": "success","data": [{"chinese_tag": "体育","media_avatar_url": "http://p3.pstatp.com/large/3538/9145332","is_feed_ad": false,"tag_url": "news_sports","title": "中国足协想搬出北京五环,原来是相中了这块风水宝地","single_mode": true,"middle_mode": true,"abstract": "中国足协搬家的传说,很可能将水落石出。而且,此前的传说其实很靠谱,中国足协确实有意要从目前位于北京东城区夕照寺街的东玖大厦,搬到京城五环路以外。南海子虽然在北京五环外,但是紧邻南五环,距离位于体育馆路的国家体育总局也不过19公里。","tag": "news_sports","behot_time": 1492391171,"source_url": "/group/6409606379224957186/","source": "长安街知事","more_mode": false,"article_genre": "article","image_url": "http://p3.pstatp.com/list/190x124/1bf4000b11da52a33c32","has_gallery": false,"group_source": 2,"comments_count": 28,"group_id": "6409606379224957186","media_url": "/c/user/4327876576/"},{},{},{},{},{},{}],"next": {"max_behot_time": 1492391156}
}

可以看到,在json数据中的data是一个包含新闻的列表,其中的title是新闻的标题,abstract是新闻的摘要,source_url是新闻的链接,image_url是新闻图片的链接,这些都是我们需要的。

http://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time=0&max_behot_time_tmp=0&tadrequire=true&as=A135888F14A1507&cp=58F4A1A500177E1
参数 取值 说明
category news_hot 类型,定值
utm_source toutiao 定值
widen 1 定值
max_behot_time 0 偏移量(默认为0)
max_behot_time_tmp 0 与max_behot_time相等
tadrequire true 定值
as A135888F14A1507 未知
cp 58F4A1A500177E1 未知

通过多次观察发现,max_behot_time类似偏移量,点击热点时,取值为零,下拉网页时,取值为上一个josn数据中的next[max_behot_time],由于点击热点就可以刷新新闻,所以让max_behot_time等于固定值0就好。

as和cp每次都会改变,但没有找到规律,推测应该是每次请求时,按照一定规律生成的数据,于是查看网页源码,很明显,下面这段代码就是用来产生as和cp的,从代码中可以看到,as和cp相当于一个时间戳,我们可以仿照这段代码用python来生成as和cp。

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"}
}

新建文件toutiao3.py,代码如下:

import asyncio
from aiohttp import ClientSession
import time
import math
import hashlib__NEWS_NUM = 1  # hu 返回的最大新闻数def getASCP():t = int(math.floor(time.time()))e = hex(t).upper()[2:]m = hashlib.md5()m.update(str(t).encode(encoding='utf-8'))i = m.hexdigest().upper()if len(e) != 8:AS = '479BB4B7254C150'CP = '7E0AC8874BB0985'return AS,CPn = i[0:5]a = i[-5:]s = ''r = ''for o in range(5):s += n[o] + e[o]r += e[o + 3] + a[o]AS = 'A1' + s + e[-3:]CP = e[0:3] + r + 'E1'return AS,CPasync def __fetch(url,data,loop):try:async with ClientSession(loop=loop) as session:# hu 发送GET请求,params为GET请求参数,字典类型async with session.get(url, params=data,timeout=5) as response:# hu 以json格式读取响应的body并返回字典类型return await response.json()except Exception as ex:print('__fetch:%s' % ex)async def getNewsInfo(loop):global __NEWS_NUMAS,CP = getASCP()urlTouTiao = 'http://www.toutiao.com'urlNews = 'http://www.toutiao.com/api/pc/feed/'dataNew = {'category': 'news_hot','utm_source': 'toutiao','widen': '1','max_behot_time': '0','max_behot_time_tmp':'0','tadrequire':'true','as':AS,'cp':CP}result = Nonetry:task = asyncio.ensure_future(__fetch(urlNews, dataNew,loop),loop=loop)taskDone = await asyncio.wait_for(task,timeout=5)if 'message' not in taskDone or taskDone['message'] != 'success':return resultresult = {'max_behot_time':taskDone['next']['max_behot_time'],'news':[]}for news_hot in taskDone['data']:news = {'Title': None,'Description': None,'PicUrl': None,'Url': None}# hu 去掉广告if news_hot['is_feed_ad']:continuenews['Title'] = news_hot['title']if 'abstract' in news_hot:news['Description'] = news_hot['abstract']else:news['Description'] = ''if 'image_url' in news_hot:news['PicUrl'] = news_hot['image_url']else:news['PicUrl'] = ''news['Url'] = urlTouTiao + news_hot['source_url']result['news'].append(news)if len(result['news']) == __NEWS_NUM:break# hu 把有图片的新闻放到前面result['news'].sort(key=lambda obj: obj.get('PicUrl'), reverse=True)except Exception as ex:print('getNewsInfo:%s' % ex)return resultdef __main():loop = asyncio.get_event_loop()for ii in range(2):task = asyncio.ensure_future(getNewsInfo(loop),loop=loop)taskDone = loop.run_until_complete(task)print('第%d次:' % ii)for res in taskDone['news']:print(res)loop.close()if __name__ == '__main__':__main()

返回值:

第0次:
{'Title': '长沙现微型古籍 疑是明清科举作弊用书', 'Description': '', 'PicUrl': 'http://p3.pstatp.com/list/190x124/1bbf000b36c2b4f07ca0', 'Url': 'http://www.toutiao.com/group/6409737414201721090/'}
第1次:
{'Title': '长沙现微型古籍 疑是明清科举作弊用书', 'Description': '', 'PicUrl': 'http://p3.pstatp.com/list/190x124/1bbf000b36c2b4f07ca0', 'Url': 'http://www.toutiao.com/group/6409737414201721090/'}

结果每次获取的新闻都是一样的,通过Fiddler多次观察,发现新闻的刷新和Cookie中的tt_webid有关,当该参数不存在时,则返回默认新闻与tt_webid,所以我们只要取出响应中的tt_webid,并在发送请求时给tt_webid赋值就好。

将toutiao3.py文件做如下修改:

#### hu 增加代码 ######
__cookie = None
######################async def __fetch(url,data,loop):global __cookietry:async with ClientSession(cookies=__cookie,loop=loop) as session:async with session.get(url, params=data,timeout=5) as response:
########################### hu 增加代码 ##############################if response.cookies and 'tt_webid' in response.cookies:__cookie = {'tt_webid':response.cookies['tt_webid'].value}
#####################################################################return await response.json()except Exception as ex:print('__fetch:%s' % ex)

返回值:

第0次:
{'Title': '长沙现微型古籍 疑是明清科举作弊用书', 'Description': '', 'PicUrl': 'http://p3.pstatp.com/list/190x124/1bbf000b36c2b4f07ca0', 'Url': 'http://www.toutiao.com/group/6409737414201721090/'}
第1次:
{'Title': '陈羽凡设立投资13家公司 3家被吊销营业执照', 'Description': '[海峡都市报-海峡网](原标题:陈羽凡商业版图冰火两极)4月16日,歌手陈羽凡率先发声,通过视频正式澄清已与白百何协议离婚,并表示将无限期退出娱乐圈。一时之间,业内外开始对陈羽凡退出娱乐圈以后将何去何从进行诸多揣测。', 'PicUrl': 'http://p1.pstatp.com/list/190x124/1bbd000c3eef588ea140', 'Url': 'http://www.toutiao.com/group/6409610618823590146/'}

可以看到两次返回的新闻不一样。关于asyncio模块的基本概念可参考《使用python-aiohttp搭建微信公众平台》,这里就不一一注释了。至于怎么将今日头条的功能添加到我们的微信公众号,可以参考《使用python-aiohttp爬取网易云音乐》,这里就不贴代码了。

源码下载:https://github.com/SigalHu/WeiXin/

使用python-aiohttp爬取今日头条相关推荐

  1. 利用Ajax爬取今日头条头像,街拍图片。关于崔庆才python爬虫爬取今日头条街拍内容遇到的问题的解决办法。

    我也是初学爬虫,在看到崔庆才大佬的爬虫实战:爬取今日头条街拍美图时,发现有些内容过于陈旧运行程序时已经报错,网页的源代码早已不一样了.以下是我遇到的一些问题. 1.用开发者选项筛选Ajax文件时预览看 ...

  2. python编程100例头条-python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  3. python爬虫爬取今日头条_python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  4. python简易爬取今日头条的热榜

    前言 提到python就离不开爬虫,把想要的资料文章新闻图片视频等等都获取到并保存,百度上随便找个网站就能练练但是爬取的东西都没啥意义,好玩的网站反爬机制小白破解不了流程也复杂,接口入参加密长时间调接 ...

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

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

  6. python爬虫爬取今日头条_爬取今日头条头条号文章数据

    0,背景介绍 最近想爬取一些今日头条的文章浏览数据,分析哪些头条号做的好,那些做的不好. 今日头条 比如上图的阅读数,评论数以及文章标题,通过这些数据进行分析. 于是展开了艰难的爬虫探索之旅 第一目标 ...

  7. 今日头条python_GitHub - a57571735/headlines_today: 基于Python的爬取今日头条文章及视频...

    分析所抓到的文章列表数据包:大致分为两类,一类是有视频的文章,一类则是没有视频的文章. 有视频的文章json内容里均有video_id这个key,如下图所示: 没有视频的文章:json文件内容均包含t ...

  8. python爬虫爬今日头条_GitHub - striver-ing/headlines_today: 基于Python的爬取今日头条文章及视频...

    分析所抓到的文章列表数据包:大致分为两类,一类是有视频的文章,一类则是没有视频的文章. 有视频的文章json内容里均有video_id这个key,如下图所示: 没有视频的文章:json文件内容均包含t ...

  9. python爬虫-爬取今日头条(图集)

    1.工具使用 python的request包和json包 fiddle抓包工具 2.请求分析 我们访问该页面,抓取请求,得到如下结果. 不难发现,在图片加载之前数据量最大的就是search_conte ...

  10. Python---分页爬取今日头条标题

    python分页爬取今日头条标题 要爬取的内容(分页爬取今日头条中77事件的所有文章标题) 爬取结果展示(只展示出了部分) #工具:pycharm(什么编译器都可以).谷歌浏览器 进入正文: 一.首先 ...

最新文章

  1. Python正则表达式之元字符详解(1)
  2. 爨底下-双龙峡,凑合的一日游
  3. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
  4. jQuery中的渐变动画效果
  5. C# WPF 多个window 相互覆盖的次序控制 不用topmost
  6. Eclipse中查看JDK类库的源代码
  7. 20. Element innerHTML 属性
  8. Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器
  9. HP 瘦客户机 - 使用 ie4uinit.exe 应用时,Citrix HDX Flash 出现故障和错误
  10. python万年历代码带解释_带闹钟的单片机万年历代码说明(详细注释)
  11. STM32多通道DMA—ADC采样
  12. DBeaver免费、多平台数据工具
  13. 【Python】只需2行代码,轻松将PDF转换成Word(含示范案例)
  14. 520到来!教你如何用代码向心仪的学妹表白,获取他的芳心!
  15. ORB-SLAM2(2) ROS下配置和编译
  16. kali2020.3安装openvas(gvm11)附gvm修改amdin密码以及gvm创建账号
  17. 皮卡丘(pikachu)XXE
  18. C语言利用ASCII码表统计字符串每个字符出现的次数
  19. 基于飞桨的智能课堂行为分析与考试作弊检测系统
  20. 游戏音乐的成长经历了哪些?

热门文章

  1. python双均线策略,当五日均线位于十日均线上方则买入,反之卖出。(聚宽量化平台使用)
  2. 联想手机、三星手机安装 凯立德路径设置详细教程
  3. Java简繁转换ZHConverter(转)
  4. 竖直时间轴之左右交叉布局
  5. P2P分布式网络简史
  6. 中国鲜花电商行业及用户研究报告
  7. 【发表案例】 CCF推荐网络安全类SCI,仅27天录用
  8. 查找算法-4种常用的查找算法
  9. 怎么压缩PDF为目标大小?压缩方法介绍
  10. 前端开发实习面试题(Web篇)