爬虫实战(十):发送每日新闻


目录
  • 爬虫实战(十):发送每日新闻
    • 一、 简介
      • 1、 概述
      • 2、 环境配置
      • 3、 配置文件
    • 二、 前端页面
    • 三、 获取数据
      • 1、 获取图片
      • 2、 获取新闻
      • 3、 制作数据
    • 四、 发送邮件

爬虫实战(十):发送每日新闻

一、 简介

1、 概述

关注时事新闻,是新时代青年必须做的,那么,我们如何来快速获取新闻呢?

  1. 每天自动从网上找到新闻

  2. 自动整理新闻排版成一个html页面,发送到邮箱中

2、 环境配置

requests = "*"  # 用来解析数据
fake-useragent = "*"  # 随机请求头
pyquery = "*"  # 改写前端页面的接口,制作每日快报

3、 配置文件

{
  "status": 200,
  "data": [
      {"name": "A.L.Kun", "email": "3500515050@qq.com"}
  ],
  "temp": [
  ]
}

data里面存放我们需要发送的对象

status:判断是否获取成功

二、 前端页面

我们使用前端知识,来设计页面,我的代码如下:




    
    
    
    每日简报
    
    


每日简报

Bing每日一图

悉尼奥林匹克公园里的湾标瞭望台,澳大利亚 (? ai_yoshi/Getty Images)

每日早报

NEWS TODAY

2022年7月12日

星期二

三、 获取数据

1、 获取图片

调用必应每日一图的接口,获取图片

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "getImg.py"
__time__ = "2022/7/12 11:20"
"""获取到每日图片"""

from requests import get
from fake_useragent import UserAgent


def getResp():
    url = "https://cn.bing.com/HPImageArchive.aspx"  # 这里使用的是bing每日图片链接
    resp = get(url, headers={  # 发送请求
        "user-agent": UserAgent().random,
    }, params={
        "format": "js",  # 返回JSON数据
        "idx": 1,  # 获取前一天的图片
        "n": 1
    })
    # print(resp)
    return resp.json()


def main1():
    src = getResp()
    url_img = "https://www.bing.com" + src["images"][0]["url"]
    title = src["images"][0]["copyright"]
    url_title = src["images"][0]["copyrightlink"]
    return {
        "url_img": url_img,
        "title": title,
        "url_title": url_title
    }  # 返回图片数据


if __name__ == '__main__':
    print(main1())

2、 获取新闻

调用接口,获取每日新闻

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "getInfo.py"
__time__ = "2022/7/12 10:08"
"""获取到每日新闻"""
from requests import get
from fake_useragent import UserAgent


def get_resp():
    url = "https://news.topurl.cn/api"  # 发送请求的接口
    resp = get(url, headers={
        "user-agent": UserAgent().random
    }, params={
        "count": 20,  # 获取20条新闻
    })
    resp.encoding = resp.apparent_encoding  # 设置编码
    return resp.json()  # 返回JSON数据


def main2():
    data_ = get_resp()
    temp = []
    for i in data_["data"]['newsList']:  # 清洗数据
        temp.append({
            "content": i["title"],
        })
    return temp


if __name__ == '__main__':
    print(main2())

3、 制作数据

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "GenHtml.py"
__time__ = "2022/7/12 14:21"
"""
生成HTML页面
"""
from getImg import main1
from getInfo import main2  # 导入获取数据
import datetime  # 导入时间库
from pyquery import PyQuery  # 对html文件进行修改


def get_timer():
    """获取今天的时间"""
    week = ["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
    now = datetime.datetime.now()

    time_ = now.strftime("%Y年%m月%d日")
    week_ = week[int(now.strftime("%w"))]
    return time_, week_

img = main1()
# print(img)
data = main2()
# print(data)
time_, week_ = get_timer()  


def main3():
    html = PyQuery(filename="./templates/index.html")
    # 设置时间
    html(".right h1").text(time_)  # 设置当前时间
    html(".right h3").text(week_)  # 设置第几周
    # 设置图片
    html(".img_des").text(img["title"])  # 设置图片的标题
    html(".main a").attr("href", img["url_title"])  # 设置图片链接
    html(".main a img").attr("src", img["url_img"])  # 设置图片
    # 设置新闻显示
    cont = html(".main .content div")
    for index, item in enumerate(data):
        str_ = f"{index + 1}. {item['content']}"
        p = " 

%s

" % str_ cont.append(p) return html.outer_html() # 导出html文件 if __name__ == '__main__': print(main3())

四、 发送邮件

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "main.py"
__time__ = "2022/7/12 15:12"

import sys
from GenHtml import time_, week_, main3
from smtplib import SMTP
from email.mime.text import MIMEText  # 发送文本信息使用的库
from email.header import Header  # 设置请求的头部信息
from email.utils import formataddr  # 格式化
from functools import wraps
import json

f = open("settings.json", "r", encoding="utf-8")
info = json.load(f)
if info["status"] != 200:
    print("JSON数据读取错误!")
    sys.exit(1)  # 如果没有读取到信息
subject = f'{time_}新闻(建议使用电脑查看)'  # 设置邮件的标题
html = main3()


def decorate(fun_):
    username = 'liu.zhong.kun@foxmail.com'  # 发送邮件的qq号
    password_pass = 'sadfadsg'  # 授权密码,有的邮箱是使用登录密码
    smtp = SMTP('smtp.qq.com', 587)  # 创建一个SMTP服务器,这里使用qq邮箱
    smtp.starttls()  # 开启tls
    smtp.login(username, password_pass)  # 登录

    @wraps(fun_)
    def func_mail(*args, **kwargs):
        fun_(smtp, username, *args, **kwargs)  # 调用发邮件的函数
        smtp.quit()  # 关闭服务器
        smtp.close()

    return func_mail


@decorate
def mail(smtp, username):
    for receiver_ in info["data"]:
        msgRoot = MIMEText(html, "html", "utf-8")  # 把html信息发送出去
        msgRoot["Subject"] = Header(subject, "utf-8")  # 设置文本标题
        msgRoot['From'] = formataddr(("A.L.Kun", username))  # 设置发件人信息
        msgRoot['To'] = formataddr((receiver_["name"], receiver_["email"]))  # 设置收件人信息
        smtp.sendmail(username, receiver_["email"], msgRoot.as_string())  # 发送邮件
        print(receiver_["email"], ':发送完成')


if __name__ == '__main__':
    mail()

总代码:https://github.com/liuzhongkun1/spider_/tree/master/autosend