详解python定时简单爬取网页新闻存入数据库并发送邮件

下面我将详细讲解“详解python定时简单爬取网页新闻存入数据库并发送邮件”的完整攻略。

一、需求分析

本次需求分析,我们需要采集某个网站的新闻,并存储到数据库中,然后通过邮件发送给指定的邮箱,要求可以定时运行。

二、技术选型

  1. 采集:requests, Beautifulsoup4
  2. 存储:MySQLdb
  3. 发送邮箱:smtplib
  4. 定时运行:apscheduler

三、实现步骤

1. 采集

在采集数据之前,需要先确认采集的目标,并分析目标网站的页面结构,找到需要采集的数据。这里我们以新浪新闻为例。
首先导入我们需要的模块:

import requests
from bs4 import BeautifulSoup

发送请求获取页面代码:

url = "https://news.sina.com.cn/"
html = requests.get(url).text

使用BeautifulSoup解析获取到的页面代码:

soup = BeautifulSoup(html, 'html.parser')

通过分析页面,我们可以发现新闻的标题、链接、发布时间和正文内容分别在不同的标签中。使用BeautifulSoup的选择器,我们可以方便地找到这些标签。

以下是一个简单的示例,用于获取新闻的标题、链接和发布时间:

news_list = soup.select('#syncad_1 ul li a')
for news in news_list:
    title = news.get_text()
    link = news.get('href')
    pub_time = news.next_sibling.get_text()
    print(title, link, pub_time)

2. 存储

我们可以使用MySQL数据库,创建表来存储新闻的标题、链接、发布时间和正文内容等信息。这里我们使用Python的MySQLdb模块连接数据库,具体步骤如下:

首先导入数据库操作所需的模块:

import MySQLdb

# 连接数据库
db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="test")
# 创建游标对象
cursor = db.cursor()

# 执行SQL,创建数据表
sql = """CREATE TABLE news (
         id INT PRIMARY KEY AUTO_INCREMENT,
         title  CHAR(200) NOT NULL,
         link CHAR(300),
         pub_time CHAR(50))"""
cursor.execute(sql)

# 插入新闻数据
sql = "INSERT INTO news(title, link, pub_time)  VALUES ('%s', '%s', '%s')"%('title', 'link', 'pub_time')
cursor.execute(sql)

# 提交到数据库执行
db.commit()

# 关闭数据库连接
db.close()

3. 发送邮箱

使用Python的smtplib模块,我们可以方便地发送邮件。

下面是一个简单的示例,用于发送包含新闻标题、链接和发布时间的邮件:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 发邮件的邮箱和密码
my_sender = 'xxx@qq.com'
my_pass = 'xxxxxx'

# 接收邮件的邮箱
my_receiver = 'xxxxx@163.com'

# 邮件内容
subject = '新闻推送'
content = '新闻标题:{},链接:{},发布时间:{}'.format(news_title, news_link, news_pubtime)

# 创建邮件
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(my_sender, 'utf-8')
message['To'] = Header(my_receiver, 'utf-8')
message['Subject'] = Header(subject, 'utf-8')

# 尝试发送邮件
try:
    smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
    smtpObj.login(my_sender, my_pass)
    smtpObj.sendmail(my_sender, my_receiver, message.as_string())
    smtpObj.quit()
    print("success")
except smtplib.SMTPException as e:
    print(e)
    print("error")

4. 定时运行

使用Python的apscheduler模块可以很方便地实现任务的定时执行。下面是一个示例,每10分钟运行一次爬虫并尝试发送邮件:

from apscheduler.schedulers.blocking import BlockingScheduler

def job():
    # 执行爬虫和邮件发送操作
    pass

# 创建调度器实例
sched = BlockingScheduler()
# 添加一个定时执行的任务
sched.add_job(job, 'interval', minutes=10)

# 启动调度器
sched.start()

四、示例说明

示例一:爬取某新闻网站并定时推送新闻到指定邮箱

代码示例:

import requests
from apscheduler.schedulers.blocking import BlockingScheduler
import MySQLdb
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from bs4 import BeautifulSoup

# 网站URL链接
URL = 'https://news.sina.com.cn/'

# MySQL数据库配置
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = 'passwd'
DB_DBNAME = 'test'

# 发送邮件配置
SENDER_EMAIL = 'xxx@qq.com'
SENDER_PASSWORD = 'xxxxxx'
RECEIVER_EMAIL = 'xxxxx@163.com'

def getNews():
    #发送请求获取页面代码
    html = requests.get(URL).text

    #使用BeautifulSoup解析获取到的页面代码
    soup = BeautifulSoup(html, 'html.parser')
    news_list = soup.select('#syncad_1 ul li a')
    for news in news_list:
        #从标签中获取新闻的标题、链接和发布时间
        title = news.get_text()
        link = news.get('href')
        pub_time = news.next_sibling.get_text()

        #将新闻数据插入到数据库中保存
        db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWORD, db=DB_DBNAME)
        cursor = db.cursor()
        sql = "INSERT INTO news(title, link, pub_time)  VALUES ('%s', '%s', '%s')" % (title, link, pub_time)
        cursor.execute(sql)
        db.commit()
        db.close()

        #创建邮件,发送新闻到指定邮箱
        message = MIMEText('标题:{},链接:{},发布时间:{}'.format(title, link, pub_time), 'plain', 'utf-8')
        message['From'] = Header(SENDER_EMAIL, 'utf-8')
        message['To'] = Header(RECEIVER_EMAIL, 'utf-8')
        message['Subject'] = Header('每日新闻推送', 'utf-8')
        smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
        smtpObj.login(SENDER_EMAIL, SENDER_PASSWORD)
        smtpObj.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string())
        smtpObj.quit()

if __name__ == '__main__':
    #使用apscheduler模块定时执行任务
    scheduler = BlockingScheduler()
    scheduler.add_job(getNews, 'interval', minutes=10)  #每10分钟执行一次任务
    scheduler.start()

示例二:爬取某网站数据存储到MongoDB,并定时清空数据

代码示例:

import requests
from apscheduler.schedulers.blocking import BlockingScheduler
from pymongo import MongoClient
from bs4 import BeautifulSoup

# 网站URL链接
URL = 'https://news.sina.com.cn/'

# MongoDB配置
MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_DBNAME = 'test'
MONGO_COLLNAME = 'news'

def getNews():
    #发送请求获取页面代码
    html = requests.get(URL).text

    #使用BeautifulSoup解析获取到的页面代码
    soup = BeautifulSoup(html, 'html.parser')
    news_list = soup.select('#syncad_1 ul li a')
    for news in news_list:
        #从标签中获取新闻的标题、链接和发布时间
        title = news.get_text()
        link = news.get('href')
        pub_time = news.next_sibling.get_text()

        #将新闻数据插入到MongoDB中保存
        client = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
        db = client[MONGO_DBNAME]
        coll = db[MONGO_COLLNAME]
        coll.insert_one({'title':title, 'link':link, 'pub_time':pub_time})

def cleanData():
    #定时清空MongoDB中的数据
    client = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
    db = client[MONGO_DBNAME]
    coll = db[MONGO_COLLNAME]
    coll.remove()

if __name__ == '__main__':
    #使用apscheduler模块定时执行任务
    scheduler = BlockingScheduler()
    scheduler.add_job(getNews, 'interval', minutes=10)  #每10分钟执行一次任务
    scheduler.add_job(cleanData, 'interval', hours=24)  #每24小时执行一次任务
    scheduler.start()

以上就是参考文献《详解Python定时简单爬取网页新闻存入数据库并发送邮件》的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python定时简单爬取网页新闻存入数据库并发送邮件 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 详解Redis发布订阅使用方法

    Redis发布订阅模式是一种消息传递机制,一般用于构建实时通信系统或实现消息队列等应用场景,可以实现一个发布者向多个订阅者传递消息的功能。 Redis发布订阅基本概念 在Redis的发布订阅模式中,分为发布者和订阅者两部分,其中发布者负责向消息队列中推送消息,而订阅者则从队列中获取消息并进行相应的处理。Redis发布订阅模式主要包括以下几个基本概念: 发布者…

    Redis 2023年3月21日
    00
  • springboot redis多数据源

    springboot中默认的redis配置是只能对单个redis库进行操作的。 那么我们需要多个库操作的时候这个时候就可以采用redis多数据源。 本代码参考RedisAutoConfiguration源码进行整改成的多数据源配置   注意:数据源2就是数据源1copy了一份代码,把所有的gisredis改成appredis,并去除数据源2的@Primary…

    Redis 2023年4月13日
    00
  • C#的StackExchange.Redis实现订阅分发模式

    wu大糊涂关注 一、订阅分发模式介绍 Redis发布订阅—Pub/Sub模式或者说是观察者模式。我想大家即使没有使用过,也已经耳熟能详了。 先简单举例说明下应用场景,在场景中我们可以分析到其优势在哪。 比如你的线上应用应用,你想设置一个日志报警系统,当应用出现异常的时候,立马发送通知给你,可能是短信的形式,也可能是邮件的形式。当然如果只将报警通知给你一个人,…

    Redis 2023年4月12日
    00
  • MySQL时间盲注的五种延时方法实现

    MySQL 时间盲注是一种比较常见的注入技巧,指的是在注入的过程中无法直接获取数据,但可以通过延时等方式判断 SQL 查询是否满足条件。下面将详细介绍 MySQL 时间盲注的五种延时方法和实现步骤。 1. sleep() 延时 实现步骤: 构造 payload,注入点通常在 URL 参数或者表单中,可通过一些测试工具进行批量测试。 判断当前数据是否符合预期条…

    database 2023年5月22日
    00
  • Java 如何通过JDBC 操作数据库

    JDBC 是Java 数据库连接,即 Java DataBase Connectivity。JDBC 可让Java 通过程序操作关系型数据库,可基于驱动程序实现与数据库的连接与操作。JDBC 有统一的API ,提供一致的开发过程。其功能强大,执行效率高,可处理海量数据。 开发准备 在Navicat 中新建一个数据库,注意字符集 的选择,如下图所示: 然后运行…

    MySQL 2023年4月11日
    00
  • 阿里云官方Redis开发规范总结

    阿里云官方Redis开发规范总结是一份指南,旨在协助开发人员写出可读性高、易于维护、高质量稳定的Redis代码。下面将详细讲解这份规范的内容和应用。 规范概述 阿里云官方Redis开发规范总结主要包含以下5部分: 代码风格:包括命名规范、缩进、空格等基本代码编写风格。 数据类型使用:要求开发人员选择合适的数据类型,遵循基本的数据结构设计原则。 业务逻辑实现:…

    database 2023年5月19日
    00
  • redis hset hmset过期时间

    hmset m k v  127.0.0.1:6379> hset m k v (integer) 1 127.0.0.1:6379> hget m k “v” 127.0.0.1:6379> expire m 30 (integer) 1 127.0.0.1:6379> ttl m (integer) 24 127.0.0.1:63…

    Redis 2023年4月13日
    00
  • Mysql的语句生成后门木马的方法

    Mysql 的语句生成后门木马是黑客攻击中常用的一种方式之一,以下是一份完整的攻略: 1. 理解 Mysql 后门木马 Mysql 后门木马是通过对 Mysql 服务器进行攻击,实现对服务器的控制和访问敏感信息的提取。常见的攻击手段是改写数据库中的查询语句,插入截取数据的代码,使其在查询数据库时自动执行,从而实现攻击目的。 2. 确定攻击路线 由于 Mysq…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部