python编程100例头条-python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的;
在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式network下很快能找到一个"?category=new_hot...’字样的文件,查看该文件发现新闻内容的数据全部存储在data里面,且能发现数据类型为json;如下图:
这样一来就简单了,只要找到这个文件的requests url即可通过python requests来爬取网页了;
查看请求的url,如下图:
发现链接为:https://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=A1B5AC16548E0FA&cp=5C647E601F9AEE1&_signature=F09fYAAASzBjiSc9oUU9MxdPX3
其中有9个参数,对比如下表:
其中max_behot_time在获取的json数据中获得,具体数据见如下截图:
在网上找了下大神对as和cp算法的分析,发现两个参数在js文件:home_4abea46.js中有,具体算法如下代码:
!function(t) {
var e = {};
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"
}
}
,
t.ascp = e
}(window, document),
python获取as和cp值的代码如下:(代码参考blog:https://www.cnblogs.com/xuchunlin/p/7097391.html)
def get_as_cp(): # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46.js
zz = {}
now = round(time.time())
print(now) # 获取当前计算机时间
e = hex(int(now)).upper()[2:] #hex()转换一个整数对象为16进制的字符串表示
print('e:', e)
a = hashlib.md5() #hashlib.md5().hexdigest()创建hash对象并返回16进制结果
print('a:', a)
a.update(str(int(now)).encode('utf-8'))
i = a.hexdigest().upper()
print('i:', i)
if len(e)!=8:
zz = {'as':'479BB4B7254C150',
'cp':'7E0AC8874BB0985'}
return zz
n = i[:5]
a = i[-5:]
r = ''
s = ''
for i in range(5):
s= s+n[i]+e[i]
for j in range(5):
r = r+e[j+3]+a[j]
zz ={
'as':'A1'+s+e[-3:],
'cp':e[0:3]+r+'E1'
}
print('zz:', zz)
return zz
这样完整的链接就构成了,另外提一点就是:_signature参数去掉也是可以获取到json数据的,因此这样请求的链接就完成了;下面附上完整代码:
import requests
import json
from openpyxl import Workbook
import time
import hashlib
import os
import datetime
start_url = 'https://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time='
url = 'https://www.toutiao.com'
headers={
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
cookies = {'tt_webid':'6649949084894053895'} # 此处cookies可从浏览器中查找,为了避免被头条禁止爬虫
max_behot_time = '0' # 链接参数
title = [] # 存储新闻标题
source_url = [] # 存储新闻的链接
s_url = [] # 存储新闻的完整链接
source = [] # 存储发布新闻的公众号
media_url = {} # 存储公众号的完整链接
def get_as_cp(): # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46.js
zz = {}
now = round(time.time())
print(now) # 获取当前计算机时间
e = hex(int(now)).upper()[2:] #hex()转换一个整数对象为16进制的字符串表示
print('e:', e)
a = hashlib.md5() #hashlib.md5().hexdigest()创建hash对象并返回16进制结果
print('a:', a)
a.update(str(int(now)).encode('utf-8'))
i = a.hexdigest().upper()
print('i:', i)
if len(e)!=8:
zz = {'as':'479BB4B7254C150',
'cp':'7E0AC8874BB0985'}
return zz
n = i[:5]
a = i[-5:]
r = ''
s = ''
for i in range(5):
s= s+n[i]+e[i]
for j in range(5):
r = r+e[j+3]+a[j]
zz ={
'as':'A1'+s+e[-3:],
'cp':e[0:3]+r+'E1'
}
print('zz:', zz)
return zz
def getdata(url, headers, cookies): # 解析网页函数
r = requests.get(url, headers=headers, cookies=cookies)
print(url)
data = json.loads(r.text)
return data
def savedata(title, s_url, source, media_url): # 存储数据到文件
# 存储数据到xlxs文件
wb = Workbook()
if not os.path.isdir(os.getcwd()+'/result'): # 判断文件夹是否存在
os.makedirs(os.getcwd()+'/result') # 新建存储文件夹
filename = os.getcwd()+'/result/result-'+datetime.datetime.now().strftime('%Y-%m-%d-%H-%m')+'.xlsx' # 新建存储结果的excel文件
ws = wb.active
ws.title = 'data' # 更改工作表的标题
ws['A1'] = '标题' # 对表格加入标题
ws['B1'] = '新闻链接'
ws['C1'] = '头条号'
ws['D1'] = '头条号链接'
for row in range(2, len(title)+2): # 将数据写入表格
_= ws.cell(column=1, row=row, value=title[row-2])
_= ws.cell(column=2, row=row, value=s_url[row-2])
_= ws.cell(column=3, row=row, value=source[row-2])
_= ws.cell(column=4, row=row, value=media_url[source[row-2]])
wb.save(filename=filename) # 保存文件
def main(max_behot_time, title, source_url, s_url, source, media_url): # 主函数
for i in range(3): # 此处的数字类似于你刷新新闻的次数,正常情况下刷新一次会出现10条新闻,但夜存在少于10条的情况;所以最后的结果并不一定是10的倍数
ascp = get_as_cp() # 获取as和cp参数的函数
demo = getdata(start_url+max_behot_time+'&max_behot_time_tmp='+max_behot_time+'&tadrequire=true&as='+ascp['as']+'&cp='+ascp['cp'], headers, cookies)
print(demo)
# time.sleep(1)
for j in range(len(demo['data'])):
# print(demo['data'][j]['title'])
if demo['data'][j]['title'] not in title:
title.append(demo['data'][j]['title']) # 获取新闻标题
source_url.append(demo['data'][j]['source_url']) # 获取新闻链接
source.append(demo['data'][j]['source']) # 获取发布新闻的公众号
if demo['data'][j]['source'] not in media_url:
media_url[demo['data'][j]['source']] = url+demo['data'][j]['media_url'] # 获取公众号链接
print(max_behot_time)
max_behot_time = str(demo['next']['max_behot_time']) # 获取下一个链接的max_behot_time参数的值
for index in range(len(title)):
print('标题:', title[index])
if 'https' not in source_url[index]:
s_url.append(url+source_url[index])
print('新闻链接:', url+source_url[index])
else:
print('新闻链接:', source_url[index])
s_url.append(source_url[index])
# print('源链接:', url+source_url[index])
print('头条号:', source[index])
print(len(title)) # 获取的新闻数量
if __name__ == '__main__':
main(max_behot_time, title, source_url, s_url, source, media_url)
savedata(title, s_url, source, media_url)
简单百行代码搞定今日头条热点新闻爬取并存储到本地,同理也可以爬取其他频道的新闻;本次的爬取程序到此结束,下次从爬取的公众号对公众号下的新闻进行爬取,主要爬取公众号的粉丝量以及最近10条新闻的或图文的阅读量及评论数等数据;请期待...
最后送上程序运行的截图及数据存储的表格截图:
---------------------------------------------------------
欢迎大家留言交流,共同进步。
python编程100例头条-python 简单爬取今日头条热点新闻(一)相关推荐
- python爬虫今日头条_python 简单爬取今日头条热点新闻(
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python爬虫爬取今日头条_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python爬虫今日头条_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python 头条 上传_python 简单爬取今日头条热点新闻(一)
今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...
- python编程100例海绵宝宝-python基础1(理论基础)
1.python是什么语言 2.python的发展史 3.python2与python3的区别 4.python的语言类型 5.python的优缺点 6.IDLE是什么 7.变量是什么 一.pytho ...
- python爬取头条图集_python爬取今日头条关键字图集
1 #!/usr/bin/env python 2 #encoding: utf-8 3 4 """ 5 @version: python376 @author: Geo ...
- python 头条号_python爬取今日头条收藏目录
今日头条收藏以异步加载方式加载,可用以下两种方式分析,达到以下效果: 第一种: 将收藏网页拉直最底部,直到不产生新的收藏信息,将网页下载,另存到本地,形成新的htm文件,这时可以用分析静态网页的方式进 ...
- python编程100例画图-Python练习实例56 | 画图,学用circle画圆形
作者还记得在抖音上,有不少的Python学习爱好者还能够用Python里面自带的工具,来画各种各样的图形. 一句话,秀的简直不行不行的. 小黄人.jpg 那么今天,我们也来开始用Python来画出第一 ...
- python编程100例-【python】编程语言入门经典100例--30
1 #题目:一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 代码: 2 3 li = list(input('请输入一个5位数:')) 4 5 if (li[0 ...
最新文章
- 计算机的主要危害是什么意思,cpu使用率是什么意思 cpu使用率低但是电脑卡原因...
- 直播预告 | AAAI 2022论文解读:基于生成模型的语音/歌声合成与歌声美化
- 软件是否有必要进行性能测试
- 洛谷 - P2774 方格取数问题(最小割-最大流+奇偶拆点)
- stm32使用DAP下载程序
- spring:注解配置AOP
- 蓝屏dump分析教程
- Weblogic 部署两个应用
- ucgui界面 vc_UCGUI在VC下的仿真 | 学步园
- Selctive Search中的ABO评价方法
- 项目从.Net3.5转化到.Net4.0发生错误
- 如何免费开通蚂蚁金服开放平台系统服务商ISV查看PID
- tensorflow笔记 tf.metrics.accuracy
- 安卓手机投屏软件_手机投屏软件哪个好?推荐这五款投屏神器
- linux运行lnk,LNK 文件扩展名: 它是什么以及如何打开它?
- 【React】485- React 大佬都在用的 22 种神奇工具
- XDOC发布9.1.8版
- Java-对象相等判断
- 第六章:项目进度管理 - (6.5 制定进度计划)
- 悼念乔布斯---他的产品改变了世界,思想影响了一代人,三个故事,勉励大家
热门文章
- 开发日记-20190513 关键词 汇编语言(六)
- tflearn alexnet iter 10
- Sphinx 的介绍和原理探索——不存储原始数据,原始数据来源于SQL,而生成索引放在内存或者磁盘中...
- 数据恢复 从binlog文件
- 算法 【第九章】动态规划问题
- Keil 二进制数输入宏
- C#开发微信门户及应用(5)--用户分组信息管理
- nchar,char,varchar与nvarchar区别(收藏)
- 安卓开发笔记(二十七):实现轮播文字消息
- [operator]ubuntu + git