详解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日

相关文章

  • 向MySQL 中存储大文本数据

    package cn.itcast.demo; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.Reader; import java.sql.Connecti…

    MySQL 2023年4月13日
    00
  • MYSQL与SQLserver之间存储过程的转换方式

    MYSQL和SQL Server是两种常用的关系型数据库管理系统,它们都支持存储过程,但是两者的存储过程语言有所不同。因此,在转换存储过程时需要注意一些细节。下面是MYSQL与SQL Server之间存储过程转换的完整攻略和示例说明: 1. 标准转换方式 1.1 MYSQL转换为SQL Server 1.1.1 存储过程定义 在MYSQL中,定义一个简单的存…

    database 2023年5月22日
    00
  • 如何在Python中删除Microsoft SQL Server数据库中的数据?

    当我们需要删除Microsoft SQL Server数据库中的数据时,可以使用SQLAlchemy库在Python中进行操作。以下是如何在Python中删除Microsoft SQL Server数据库中的数据的完整使用攻略,包括连接数据库、创建Session、删除数据等步骤。同时,提供了两个示例以便更好理解如何在Python中删除Microsoft SQ…

    python 2023年5月12日
    00
  • 解决spring4连接redis集群报错:CLUSTERDOWN The cluster is down(转载)

    原因是redis出错了。解决方法如下: 1、使用命令检查REDIS状态: /java/redis/redis7000/src/redis-trib.rb check 192.168.249.230:7000 [ERR] Nodes don’t agree about configuration!>>> Check for open slot…

    Redis 2023年4月12日
    00
  • 如何使用Python查询两个或多个表之间的连接?

    以下是如何使用Python查询两个或多个表之间的连接的完整使用攻略。 使用连接查询的前提条件 在使用Python查询两个或多个表之间的连接之前,需要确保经安装并启动了支持连接查询的,例如MySQL或PostgreSQL,并且需要安装Python的相应数据库驱动程序,例如mysql-connector-python或psycopg2。 步骤1:导入模块 在Py…

    python 2023年5月12日
    00
  • 在Docker容器中部署MSSQL

    部署MSSQL在Docker容器中可以按照以下步骤进行: 1.安装Docker 在Linux服务器上安装Docker,可以使用以下命令: sudo apt-get update sudo apt-get install docker.io 2.下载microsoft/mssql-server-linux镜像 在Docker容器中部署MSSQL,需要使用mic…

    database 2023年5月22日
    00
  • Oracle 创建监控账户 提高工作效率

    Oracle 创建监控账户 提高工作效率 为什么要创建监控账户 在 Oracle 数据库的日常运维中,为了保证数据库的稳定性和安全性,需要对数据库的各种性能指标、日志信息、系统状态等进行监控,及时发现并解决潜在问题。这些监控数据需要通过一定的手段进行采集和分析,通常需要使用一些第三方工具或者脚本。为了确保安全性和权限控制,这些工具或脚本需要使用一个专门的账户…

    database 2023年5月22日
    00
  • MySQL数据表分区策略及优缺点分析

    MySQL数据表分区策略及优缺点分析 什么是MySQL数据表分区? MySQL数据表分区是将表数据分为更小的块,以提高查询效率和管理表数据的能力。分区可以根据表的某个字段自动或手动进行,例如按照日期或地理属性来进行数据分区。 MySQL数据表分区使用场景 数据表数据量巨大,过多的数据可能导致查询速度变慢、备份难以进行等问题; 实现分布式数据库管理; 数据库实…

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