今日头条爬取程序+邮件发到邮箱

2023-05-16

需要安装requests,stmplib和openpyxl库,加入了发送邮件功能,部分代码来自CSDN:

其中smtplib需使用pip install py-email 命令来安装

完整代码如下

import requests  
import json
from openpyxl import Workbook
import time
import hashlib
import os
import datetime
import smtplib
import random
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
 
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':str(random.randint(66499490848923624618,98746537462725254568))} # 为避免反爬,采用随机数cookies
 
max_behot_time = '0'   # 链接参数
title = []       # 存储新闻标题
source_url = []  # 存储新闻的链接
s_url = []       # 存储新闻的完整链接
source = []      # 存储发布新闻的公众号
media_url = {}   # 存储公众号的完整链接
  # 第三方 SMTP 服务参数
mail_host="smtp.exmail.qq.com"  #设置服务器
mail_user="201XXXXX@XXX.com"    #用户名
mail_pass="r6ctG345kw8Mdai"   #口令 
sender = '20XXXXX@XXX.com' # 发送邮件,可设置为你的QQ邮箱或者其他邮箱
receivers = ['XXXXX@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
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()
    filename ='toutiao.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])
 
    wb.save(filename=filename)  # 保存文件

def main(max_behot_time, title, source_url, s_url, source, media_url):   # 主函数
    for i in range(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))   # 获取的新闻数量

def sendmail(mail_host,mail_user,mail_pass,sender,receivers): 
    #创建一个带附件的实例
    message = MIMEMultipart()
    message['From'] = Header("每日今日头条文章爬取", 'utf-8')
    message['To'] =  Header("不知道是谁", 'utf-8')
    subject = '今天的头条新闻都在这里了'
    message['Subject'] = Header(subject, 'utf-8')
    
    #邮件正文内容
    message.attach(MIMEText('今天的新闻,请查收', 'plain', 'utf-8'))
     
    # 构造附件1,传送当前目录下的  文件
    att1 = MIMEText(open('toutiao.xlsx', 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    att1["Content-Disposition"] = 'attachment; filename="toutiao.xlsx"'
    message.attach(att1)
     
    # 构造附件2,传送当前目录下的 runoob.txt 文件
    #att2 = MIMEText(open('runoob.txt', 'rb').read(), 'base64', 'utf-8')
    #att2["Content-Type"] = 'application/octet-stream'
    #att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
    #message.attach(att2)
     
    try:
        smtpObj = smtplib.SMTP() 
        smtpObj.connect(mail_host, 25)    # 465 为 SMTP 端口号
        smtpObj.login(mail_user,mail_pass)  
        smtpObj.sendmail(sender, receivers, message.as_string())
        print ("邮件发送成功")
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")
 
if __name__ == '__main__':
    main(max_behot_time, title, source_url, s_url, source, media_url)
    savedata(title, s_url, source, media_url)
    sendmail(mail_host,mail_user,mail_pass,sender,receivers)
    exit()


代码均采用结构化程序设计,简单易读,修改方便,只需要修改参数部分即可。  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

今日头条爬取程序+邮件发到邮箱 的相关文章

  • Dev C++ 5.11版 「时代 の 眼泪」安装指南

    介绍 Dev C 43 43 是一款轻量化的 C C 43 43 桌面 IDE xff0c 由于不需要额外配置 GCC 即开即用的特点 xff0c 因此常常用于 C C 43 43 语言基础的学习 目前官方最新版为 Dev C 43 43
  • 快速入门RabbitMQ(详细)第二篇:RabbitMQ五种工作模式的使用及总结

    4 RabbitMQ工作模式 4 1 Work queues工作队列模式 Work Queues 与入门程序的 简单模式 相比 xff0c 多了一个或一些消费端 xff0c 多个消费端共同消费同一个队列中的消息 应用场景 xff1a 对于
  • BGP邻居状态机

    idle connect 已经建立完成了TCP三次握手 open sent open confirm establish connect 和 active 都是 TCP 连接阶段 active 是发起方 connect 是应答方 Idle
  • bgp LP本地优先属性配置与详解

    实验目的 xff1a 1 理解掌握BGP的本地优选属性概念和配置方法 2 本地优选的属性默认值为100 xff0c 较高值的路径会被优先选择 3 本地优先属性 xff0c 决定离开本自治系统最佳的路径 实验拓扑 xff1a 步骤1 接口IP
  • 什么是pretext tasks?

    1 大约是个啥 xff1f pretext tasks 通常被翻译作 前置任务 或 代理任务 xff0c 有时也用 surrogate task 代替 2 必须具有两个关键点 xff1a 1 这种训练不是我们本身的训练任务 xff0c 并不
  • Typora自定义主题样式

    Typora自定义主题样式 1 打开Typora开发者工具 视图 gt 开发者工具 xff08 Shift 43 F12 xff09 2 使用选区工具选中想要更改的元素 3 查看styles区域 4 修改颜色并预览 修改步骤 xff1a 打
  • 整理学习之Batch Normalization(批标准化)

    Batch Normalization 1 归一化 归一化是一种常用于数据预处理的方法 根据需求定义将数据约束到固定的一定范围 希望转化后的数值满足一定的特性 xff08 分布 xff09 在神经网络的训练中 xff0c 数值更大的参数会对
  • 整理学习之注意力机制

    假如我们现在在电脑前看电影 xff0c 那么我们的注意力一定是集中在显示器而忽略键盘鼠标等物 注意力机制 实际上就是想将人的感知方式 注意力的行为应用在机器上 xff0c 让机器学会去感知数据中的重要和不重要的部分 在计算机算力资源的限制下
  • 整理学习之深度迁移学习

    迁移学习 xff08 Transfer Learning xff09 通俗来讲就是学会举一反三的能力 xff0c 通过运用已有的知识来学习新的知识 xff0c 其核心是找到已有知识和新知识之间的相似性 xff0c 通过这种相似性的迁移达到迁
  • Origin更改图的尺寸大小

    论文插入两张图片时大小不一致 xff0c 大大影响美观 这里介绍一种简单的设置图尺寸大小的方法 1 xff09 选择一张图片 xff0c 单击图片空白处 xff0c 按如下操作 2 xff09 选择另外一张图片 xff0c 按上面步骤 xf
  • Git 分支管理详解

    1 前言 我们先来说一个简单的案例吧 xff0c 你们团队中有多个人再开发一下项目 xff0c 一同事再开发一个新的功能 xff0c 需要一周时间完成 xff0c 他写了其中的30 还没有写完 xff0c 如果他提 交了这个版本 xff0c
  • 整理学习之深度可分离卷积

    一 分组卷积 分组卷积Group convolution是将输入层的不同特征图进行分组 xff0c 然后采用不同的卷积核再对各个组进行卷积 xff0c 这样会降低卷积的计算量 普通卷积 xff1a 分组卷积 将图一卷积的输入feature
  • 保留代理解决conda的ProxyError

    保留代理解决conda的ProxyError ProxyError Conda cannot proceed due to an error in your proxy configuration 这两天用conda时科学上网 xff0c
  • Openstack(管理篇)----网络、卷设备

    网络管理 一 创建指定类型的网络 neutron net create public shared provider xff1a physical network public provider xff1a network type fla
  • Python导入自己写的模块

    在Python安装目录下的 Lib site packages文件夹中建立一个 txt文件 xff0c 输入自己写的模块库的路径 xff0c 例如 e code MyModule 保存后将文件后缀名改为 pth xff0c 然后就大功告成了
  • 怎么进入root权限

    sudo i 然后输入对应账户的账号密码 xff0c 没有单独是root密码
  • 普通用户怎么使用root用户安装的anaconda3(自用教程)

    1 参考资料 http t csdn cn EPBcg http t csdn cn cW2CZ http t csdn cn qs7Jp http t csdn cn CXPxV 前提 xff1a anaconda在root权限下将装在了
  • ubuntu 22.04创建桌面快捷方式

    参考 http t csdn cn K0j16 创建应用的桌面快捷方式时 xff0c 单击右键没有 allow launching 允许运行 选项 xff0c 在对桌面上的 desktop 文件具有执行权限时 xff0c 将文章原本的语句
  • 发生了一个错误,请通过右键菜单运行软件包管理器或通过终端执行apt-get来查看具体错误。错误信息:“错误:已损坏个数>0“……

    xff08 自用教程记录 xff09 参考 xff1a Ubuntu发生了一个错误 Ubuntu系统 系统教程 Ubuntu右上角有一个红色的圆 xff0c 中间有一条白色的横线 xff0c 鼠标移上去提示 xff1a 发生了一个错误 xf

随机推荐